![]() |
Zeichenfläche begrenzen/schützen
Hi,
folgendes Problem: Ich habe einen Canvas in der mit den Abmessungen 3000*6000 Pixel Auf diesem Canvas werden verschiedene Zeichenoperationen mit Textout, rectangle, etc. durchgeführt. Ich möchte, daß auf dem Canvas diese Funktionen erst ab Pixel 1500 bis Pixel 3000 gezeichnet werden kann. Der Bereich von Pixel 0 bis 1499 soll nicht verändert werden. Grob gesagt. Die Linke Seiten vom der Zeichenfläche soll geschützt von Zeichenoperationen sein. Hat irgendjemand eine Idee. Gerd |
Re: Zeichenfläche begrenzen/schützen
Hi,
kennst du schon die Eigenschaft ClipRect von TCanvas? Grüße vom marabu |
Re: Zeichenfläche begrenzen/schützen
Zitat:
Ist ReadOnly! Was soll ich damit machen? Gerd |
Re: Zeichenfläche begrenzen/schützen
Zitat:
|
Re: Zeichenfläche begrenzen/schützen
Merci,
das war das, was ich gesucht habe. Gerd |
Re: Zeichenfläche begrenzen/schützen
Gibt es auch irgendeine elegante Möglichkeit das mit DelphiX zu lösen?
In DelphiX werden ja alle Sprites von der SpriteEngine verwaltet, die nacheinander deren DoDraw-Methode aufruft. Mein Ziel ist einen bestimmten Typ von Sprites nur in einem bestimmten Bereich zu zeichnen. Spontan (nachdem ich zufällig diesen Thread hier gefunden hab) fällt mir folgendes dazu ein:
Delphi-Quellcode:
procedure MeinSpriteTyp.DoDraw;
var MyRgn: HRGN ; begin MyRgn := CreateRectRgn(100,100,200,200); SelectClipRgn(Engine.Surface.Canvas.Handle,MyRgn); inherited; SelectClipRgn(Image1.Canvas.Handle,nil); DeleteObject(MyRgn); end; Da das aber von einem Timer aufgerufen wird und vor allem mit mehreren Sprites passieren muss, sieht das sehr nach einer heißlaufenden CPU aus. Das ich die ClipRegion dauerhaft setzte geht leider auch nicht da in den anderen Bereichen eben andere Sprites gemalt werden sollen |
Re: Zeichenfläche begrenzen/schützen
Hallo flogo,
ich grübele darüber, welchen Vorteil dir eine ClipRegion verschaffen könnte. Für den Benutzer deines Programmes sieht es ja so aus, als ob ein Sprite in seinem eigenen Layer unterwegs sei, wobei das ClipRect einen Fensterblick auf diesen Layer durch alle Decklayer ermöglicht. Auch wenn ein Clipping stattfindet, bewegt sich das Sprite ja weiter, wird lediglich unsichtbar, keiner weiß mehr wo es ist - außer deinem Programm. Brauchst du nicht eher eine Bounding Box, bei der ein Sprite am Verlassen einer Region gehindert wird? Grüße vom marabu |
Re: Zeichenfläche begrenzen/schützen
Leider nein. Es geht hier konkret um das Inventory in einem Adventure. Dieses soll am unteren Bildschirmrand eingeblendet werden können. Die Teile, die man im Inventory hat soll man in der Mitte hin- und herscrollen können. Es gibt also einen Bereich in dem man eine bestimmte Anzahl dieser Gegenstände sehen kann und rechts und links davon zwei Pfeile mit denen man scrollen kann. Wenn sich ein Item jetzt nach links bewegt, soll es natürlich hinter dem Pfeil (bzw. schon vorher hinter einem Rahmen) verschwinden.
Das Problem dabei ist das ein/ausfaden des Inventorys. Ich habe leider in DelphiX nur eine (leichte) Möglichkeit gefunden den Fade nur für bestimmte Sprites zu machen und das ist ein Alphablending vor einem schwarzem Hintergrund. Wenn ich die Pfeile einfach als Sprites vor die Gegenstände lege, vermischen sich deren Farben beim Fade. Bis jetzt hatte ich es so geregelt, dass ich je ein komplett schwarzes Bild hinter die Pfeile (und vor die Items) gelegt hab und ich denke ich werde dabei bleiben, weil sich das Clipping doch zu rechenintensiv anhört |
Re: Zeichenfläche begrenzen/schützen
Ich hab mich jetzt durch den Code von DelphiX gekämpft und bin soweit gekommen:
Delphi-Quellcode:
Als Clipping-Box wird hier ein TSprite (ohne Bild) verwendet, das beim Erstellen der Items als Parent mitgegeben wird)
procedure TMyImageSprite.DoDraw;
var DestRect, SrcRect: TRect; begin DestRect := Rect(max(BoundsRect.Left, Trunc(Parent.X)), max(BoundsRect.Top, Trunc(Parent.Y)), min(BoundsRect.Right, Trunc(Parent.X) + Parent.Width), min(BoundsRect.Bottom, Trunc(Parent.Y) + Parent.Height)); SrcRect := DestRect; OffsetRect(SrcRect, -BoundsRect.Left, -BoundsRect.Top); Engine.Surface.DrawAlpha(DestRect, SrcRect, Image.PatternSurfaces[0], false, 200); end; Ich denke das dieser Code ausreichend effektiv ist, da DelphiX das Zeichnen intern ähnlich erledigt. Nur die erste Zeile (ok ersten vier Zeilen in dem Fall) kommt dazu und die sieht ja noch irgendwie erträglich aus. Wenn das noch jemand benutzen will, sollte ich vielleicht vorwarnen: Das Beispiel geht davon aus das Bildgröße und Spritegröße übereinstimmen und zeichnet das Bild immer ohne Transparenz (..aces[0], false, 20...) und mit einem Alpha von 200 (.., false, 200); ) Während sich die letzten beiden Sachen relativ leicht ändern lassen müsste eine Animation mit mehreren Frames bzw. ein Bild das kleiner oder größer ist als das Sprite (tiled := true, ...) nachgerüstet werden |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz