Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Hintergrundbild erstellen (https://www.delphipraxis.net/166434-hintergrundbild-erstellen.html)

Popov 19. Feb 2012 01:57

AW: Hintergrundbild erstellen
 
Zitat:

Zitat von VkPenguin (Beitrag 1151819)
So, die Anzeigen laufen jetzt über Bitmaps. Es läuft, wenn man alle Transparenzen aktiviert, schon etwas langsam, aber es geht.

Man kann immer noch eine Kleinigkeit opftimieren.

Zitat:

Was mir gerade einfiel:
Zitat:

Du mußt auf OnFormPaint reagieren, d. h. die wird ausgeführt wenn dein Formular ganz, aber auch nur in Teilen neu gezeichnet wird.
Kannst du das vielleicht ein bisschen erläutern?
Das hängt davon ab wo du zeichnest. In eine TImage, dann brauchst du es nicht. Direkt auf das Canvas des Formular, dann wird löscht jedes Fenster das sich drüber legt die Zeichenfläche (Canvas). Aber das Formular erkennt, dass da eine gelöschte Fläche ist und füllt OnFormPaint aus. Natürlich weiß da Formular nicht was da hin soll, es ruft nur OnFormPaint auf. Du kannst dort ein mal das komplette Bild zeichnen und gut ist es. Wenn es wieder nötig wird, ruft das Formular wieder OnFormPaint auf.


Zitat:

... jetzt müsste ich nurnoch den Teil mit den Rechtecken verstehen, dann wär alles so, wie ich es gerne hätte :-)

Wie lade ich denn einen Bildschirmausschnitt in die Bitmap? ist das der Teil mit "CopyRect..."?
Ja.

VkPenguin 19. Feb 2012 11:10

AW: Hintergrundbild erstellen
 
Es hat zwar noch ein ganzes Weilchen gedauert, habe jetzt aber endlich die CopyRect Funktion und den Rest verstanden, denke ich. Ich kann es zwar so noch nicht in meinem Hauptprogramm testen, aber ich denke, es würde funktionieren. Das Problem ist das erste mal:
Meine Gegner werden mit
Delphi-Quellcode:
x:=Random(50)+1;
For I:=1 To X Do
Begin
*erstelleGegner*
End;
erstellt, die Bewegung erfolgt in einer anderen Procedur etwa so:

Delphi-Quellcode:
For I:=1 Gegneranzahl DO
Begin
Gegner[I].lösche;
Gegner[I].PosX:=Gegner[I].PosX+Gegner[I].Geschwindigkeit;
Gegner[I].zeichne;
Wenn ich in die Bewegungsprocedur deinen Vorschlag einfüge sollte es ja gehen. Aber wie komme ich entweder beim ersten Durchgang an das GegnerBild oder, wenn ich es zuerst auf die Form zeichne, an den Ursprünglichen Inhalt des Fensters, also an den Hintergrund? Das einzige, was mir einfiel ist, das nötige im Record jedes Gegners zu speichern, und bei der Erstellung einzutragen, das erscheint mir aber ziemlich umständlich.. Geht das nicht besser? :?:

Popov 19. Feb 2012 11:41

AW: Hintergrundbild erstellen
 
Du kopierst nichts zurück aus der Form Canvas. Die Form Canvas ist ist das endgültige Bild das permanent angepasst/verändert wird. Die Änderungen speisen sich immer aus dem Original. Der Hintergrund ist entweder immer fest, ist am einfachsten, dann hast du aber einen Hintergrund de sich nicht bewegt, oder flexibel, also einen beweglichen Hintergrund, z. B. ein Planet im Hintergrund der auf die Cursor-Tasten rauf und runter reagiert, dann ist der sichtbarer Hintergrund immer ein kleiner Ausschnitt eines großen Hintergrundbildes der mit CopyRect aus dem großen Bild kopiert wird. Soll das Bild scrollen, d. h. nach Linksbewegung, verschwindet der Planet rechts und kommt irgendwann wieder links wieder, muß ein Bild zusammengesetzt werden. Hört sich aber wilder an als es ist.

VkPenguin 19. Feb 2012 11:48

AW: Hintergrundbild erstellen
 
Ahh! Okay ;-)

Hab mir nochmal dein Ballprojekt angesehen, verstehen kann ich's aber leider immernoch nicht so ganz..Man kopiert aus dem Originalbild, das kommt jetzt auch meiner Ursprünglichen Vorstellung entgegen. Aber wie? In Deiner uMain wird doch RectNeu auch nur als
Delphi-Quellcode:
RecNeu := Rect(x, y, x+Bmp.Width, y+Bmp.Height);
deklariert. Wo sagst du denn Delphi, dass du nicht den Bereich auf dem Bildschirm, sondern im Originalbild meinst? Es scheint ja in deinem Programm zu funktionieren, aber ich kapiers trotzdem nicht :(

Popov 19. Feb 2012 12:20

AW: Hintergrundbild erstellen
 
Ok, es gibt drei Bereiche. Der eine Bereich der repariert werden muß, der Bereich in dem etwas passiert, z. B. Ball taucht hier auf, und der gemeinsamer Bereich.

Den alten Rect-Bereich berechne ich nur, damit ich weiß wo etwas repariert werden muß. Da befindet sich noch das alte Ball Bild und das soll weg. Ich hab ja die Möglichkeit den kompletten Hintergrund zu zeichnen oder nur das zu übermalen was stört. Ich überzeichne also nur den Unterschied zum Original. Ich stelle somit im Tempbild das Originalbild wieder her. Nur mache ich es nicht in dem ich das komplette Originalbild in das TempBild zeichne, sondern ich flicke den Unterschied, ich mache also nur den Ball weg. Dazu muß ich zuerst wissen welchen Bereich ich reparieren muß. Das berechne ich aus den alten X/Y Koordinaten, plus Breite und Höhe des Ball-Bildes. Das Bild ist ja 72 Pixel breit und hoch, plus X und Y ergibt das einen bestimmten Rechteckbereich auf der Canvas. Das ist der Bereich der repariert werden muß.

Als nächstes berechne ich den Rect-Bereich in den gleich gezeichnet wird. Um den Ball zu zeichnen brauche ich den Rect-Bereich nicht. Das mache ich einfach mit Draw(X, Y, ...). Den Rect-Bereich brauche ich für was anderes.

Habe ich jetzt den alten Temp-Hintergrund-Bereich aus dem Originalbild repariert, in dem ich über CopyRect den den Teilbereich aus dem Originalbild auf das Tempbild kopiert habe, und dann den Ball mit Draw(X, Y, ...) auf das Tempbild gezeichnet habe, muß ich beide Bereiche auf die Canvas kopieren. Das mache ich in dem ich einen dritten Rect-Bereich aus den beiden berechne. Das ist der gemeinsame Rect-Bereich. Nun übertrage ich aus dem Tempbild den gemeinsamen Rect-Bereich auf die Canvas. Somit habe ich mit einem Kopiervorgang die alte Stelle repariert und die neue gezeichnet.

Beim nächsten Bild fängt alles von vorne an.

Du mußt dir das so vorstellen, das Tempbild entspricht zu 100% dem Bild auf der Canvas. Nur ich zeichne nicht immer das komplette Bild, was zeit kosten würde, sondern nur den nötigen Bereich.

VkPenguin 19. Feb 2012 12:54

AW: Hintergrundbild erstellen
 
Hm, ich dachte, ich hätte es jetzt endlich verstanden, dem ist aber offensichtlich nicht so. Das habe ich als Versuch gemacht:
Delphi-Quellcode:
 Recalt:=rect(Kidat[I].PosX,Kidat[I].PosY,Kidat[I].PosX+Kidat[I].Groesse,Kidat[I].PosY+Kidat[I].Groesse);
  Recneu:=rect(Kidat[I].PosX,Kidat[I].PosY+Kidat[I].Geschwindigkeit,
  Kidat[I].PosX+Kidat[I].Groesse,Kidat[I].PosY+Kidat[I].Groesse+Kidat[I].Geschwindigkeit);
  UnionRect(RecZusammen, RecAlt, RecNeu);
  Tmpbmp.Width:=Kidat[I].Groesse;
  Tmpbmp.Height:=Kidat[I].Groesse*2;
  TmpBmp.Canvas.CopyRect(RecZusammen, HintergrundPIC.Canvas, RecZusammen);
  TmpBmp.Canvas.Draw(0, 0, RaumschiffMobPIC[1]);
  Screen.ActiveForm.Canvas.Draw(Kidat[I].PosX,Kidat[I].PosY, TmpBmp);
Wenn ich Höhe und Breite der Bitmap nicht einstelle sehe ich garnichts, wenn doch wird das Raumschiff vor weißem Hintergrund gezeichnet, der nach und nach das komplette Hintergrundbild übermalt.. Was mach ich nur falsch? :oops:

Popov 19. Feb 2012 13:23

AW: Hintergrundbild erstellen
 
Tmpbmp ist die Kopie der Canvas, bzw. andersherum. Wieso änderst du die Größe beim Durchlauf.

VkPenguin 19. Feb 2012 13:52

AW: Hintergrundbild erstellen
 
meinst Du
Delphi-Quellcode:
Tmpbmp.Width:=Kidat[I].Groesse; Tmpbmp.Height:=Kidat[I].Groesse*2;
? Nunja, wie gesagt, wenn ich es nicht mache sehe ich garnichts, es scheint mir, als würde er dann einfach 0,0 als Größe wählen.

Popov 19. Feb 2012 14:38

AW: Hintergrundbild erstellen
 
Wenn du über eine TempBitmap arbeitest, dann sollte sie die Größe der Ausgabe haben.

VkPenguin 19. Feb 2012 14:41

AW: Hintergrundbild erstellen
 
Aber wenn ich es weglasse sind die Schiffe unsichbar.. Was ist denn an meinem Code falsch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr.
Seite 4 von 5   « Erste     234 5      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz