Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Hintergrundbild bei Ballerspiel (https://www.delphipraxis.net/175-hintergrundbild-bei-ballerspiel.html)

Luckie 17. Jun 2002 04:55


Hintergrundbild bei Ballerspiel
 
So es läuft mit Sound und Explosionen usw.

Nur würde mir jetzt ein schickes Hintergrundbild ganz genehm kommen. Bisher sieht mein Aufbau so aus: ein Panel (schwarz) und darauf eine Paintbox. Die zwei Raumschiffe sind in Images, die ich hin und her schiebe, die Schüsse werden auf die Paintbox gezeichnet.

Probiert habe ich schon folgendes: hinter die Paintbox ein Image zu legen mit dem Bild. Nur muß ich dann das Image ständig neuzeichen und dann kann ich das Spiel in den Mülleimertreten.

Ich suche jetzt eine Möglichkeit das zu realisieren, ohne zu viel ändern zu müssen.

OregonGhost 17. Jun 2002 10:25

Auch wenn das einiges an Änderungen erfordert: Ich rate dir ab, jegliche Komponenten für die Grafikdarstellung zu verwenden. Lade alle Grafiken in TBitmap-Objekte und zeichne sie direkt auf den Canvas der Form, oder mach eine Paintbox, die über das gesamte (!) Spielfeld geht und zeichne alles dorthinein. TImage etc. sind nicht für sowas gemacht worden. Den Hintergrund zeichnest du einfach in jedem Frame, bevor du die Objekte draufmalst.
Wenn du etwas weniger Änderungen haben willst, kannst du die TImage-Dinger, in denen bereits einige deiner Grafiken sind, auch unsichtbar machen und diese als Quelle für den Zeichenvorgang verwenden.

Alternativ kannst du auch DoubleBuffering verwenden: Erzeuge ein TBitmap-Objekt, und in jedem Frame zeichnest du zunächst den Hintergrund hinein, und dann alle Objekte drauf. Wenn es dir um die Transparenz bei den Objekten geht, musst du entweder direkt mit Scanline arbeiten, oder du zeichnest das Objekt mit TCanvas.BrushCopy(), oder du nimmst eine dieser abgefahrenen BitBlt()-Kombinationen, die wahrscheinlich das schnellste darstellen.
Am Ende zeichnest du die gesamte Bitmap einfach in die Form (oder zur Not auch in deine Paintbox (c; ).

Nils 5. Jul 2002 13:20

Mal was ganz anderes: Mit DelphiX finde ich das sehr viel problemloser.
(Da gibts sogar eine integrierte Kollisionsabfrage :wink: ) Zwar müsstest du dann relativ viel umstrukturieren, aber mit den ganzen Sprites habe ich persönlich weniger Probleme...

Luckie 5. Jul 2002 14:06

Danke Nils, aber es hat sich mittlerweile erledingt.

Traumzauberbaum 11. Jul 2002 10:31

ich hab dazu auch noch ne Frage... AAAAAAAAAAAAAAAALSO:
Ich bastle auch grad an nem kleinen Spiel, und ich will, das der Benutzer sich den Hintergrund aus ner Datei laden kann. Ich hab mir jetzt auch das Formular nen Button und nen OpenPictureDialog geschmissen. Also du drückst den Button, und dann solltest du dir halt das Bild aussuchen können *in der zukunft schwelg* ... wie bekomm ich das jetzt hin, dass der Button mit diesem Dialog zusammenarbeitet?!? (:cheers: so ungefähr *g*)

Christian Seehase 11. Jul 2002 11:16

Moin Traumzauberbaum,

meinst Du das:
Code:
[b]procedure[/b] TForm1.Button1Click(Sender: TObject);
[b]begin[/b]
  [b]if[/b] [b]not[/b] OpenPictureDialog1.Execute [b]then[/b]
  [b]begin[/b]
    exit;
  [b]end[/b];
  [color=#000080][i]// Wenn's Öffnen geklappt hat[/i][/color]
[b]end[/b];

Traumzauberbaum 11. Jul 2002 11:22

hähä neeee. ich meint folgendes:
Code:
[b]procedure[/b] TForm1.BT_HintergrundClick(Sender: TObject);
[b]var[/b]
  filename: TPicture;
[b]begin[/b]
  [b]if[/b] BildLaden.execute [b]then[/b]
  [b]begin[/b]
    Image1.Picture := filename;
    Image1.Align := alTop;
    Image1.AutoSize := true;
    Image1.Cursor := CrCross;
    Image1.Stretch := True;
  [b]end[/b];
[b]end[/b];
naja... und da bekomm ich andauernd ne EAccessViolation...
Codesyntax hinzugefügt- FuckRacism

Phoenix 11. Jul 2002 12:01

Das glaube ich Dir aufs Wort.
Du weist ja auch eine nicht initialisierte Variable zu.

Du musst den Dateinamen aus dem Dialog auch erst benutzen, um das Bild in Dein TPicture zu laden.

Sieht (ungetestet!) in etwa so aus:
Code:
[b]procedure[/b] TForm1.BT_HintergrundClick(Sender: TObject);
[b]var[/b]
  L_Picture: TPicture;
[b]begin[/b]
  [b]if[/b] BildLaden.execute [b]then[/b]
  [b]begin[/b]
    L_Picture.LoadFromFile(BildLaden.FileName);
    Image1.Picture := L_Picture;
    Image1.Align := alTop;
    Image1.AutoSize := true;
    Image1.Cursor := CrCross;
    Image1.Stretch := True;
  [b]end[/b];
[b]end[/b];
Grüßle,

Sebastian;

Christian Seehase 11. Jul 2002 12:09

Moin Traumzauberbaum,

Durch Deine Variablendeklaration erzeugst Du eine Variable Filename vom Typ TPicture.
TPicture ist ein Objekt, dass vor der Benutzung erst einmal erzeugt werden muss.
Da dies bei Dir nicht der Fall ist, hat Filename einen undefinierten Wert.
Die Zeile

Code:
FileName := TPicture.Create;
fehlt.
Dadurch wird ein TPicture Objekt erzeugt, und dessen Adresse in der Variablen Filename gespeichert, so dass nun die Zugriffe keinen Fehler mehr erzeugen.

Wichtig
Ein erzeugtes Objekt muss auch immer wieder freigegeben werden, um Speicherlecks zu vermeiden.

Ablaufprinzip:

Code:
Objekt erzeugen (Create)
[b]try[/b]
  [color=#000080][i]// mit dem Objekt arbeiten[/i][/color]
[b]finally[/b]
  Objekt freigeben (Free)
[b]end[/b];
In Deinem Falle wäre es wohl sehr viel einfacher statt

Code:
Image1.Picture := FileName;
lieber

Code:
Image1.Picture.LoadFromFile(BildLaden.Filename);
zu verwenden.

Traumzauberbaum 11. Jul 2002 12:12

jo danke dich :-) so hat et geklappt, jetzt können die beiden endlich mitanander anstoßen *g* :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 Uhr.

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