AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Hintergrundbild bei Ballerspiel
Thema durchsuchen
Ansicht
Themen-Optionen

Hintergrundbild bei Ballerspiel

Ein Thema von Luckie · begonnen am 17. Jun 2002 · letzter Beitrag vom 11. Jul 2002
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Hintergrundbild bei Ballerspiel

  Alt 17. Jun 2002, 05:55
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2
  Alt 17. Jun 2002, 11: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; ).
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Nils

Registriert seit: 8. Jun 2002
24 Beiträge
 
#3
  Alt 5. Jul 2002, 14:20
Mal was ganz anderes: Mit DelphiX finde ich das sehr viel problemloser.
(Da gibts sogar eine integrierte Kollisionsabfrage ) Zwar müsstest du dann relativ viel umstrukturieren, aber mit den ganzen Sprites habe ich persönlich weniger Probleme...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 5. Jul 2002, 15:06
Danke Nils, aber es hat sich mittlerweile erledingt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Traumzauberbaum

Registriert seit: 10. Jul 2002
Ort: Hamburch
12 Beiträge
 
#5
  Alt 11. Jul 2002, 11: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?!? ( so ungefähr *g*)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 11. Jul 2002, 12: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];
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Traumzauberbaum

Registriert seit: 10. Jul 2002
Ort: Hamburch
12 Beiträge
 
#7
  Alt 11. Jul 2002, 12: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
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#8
  Alt 11. Jul 2002, 13: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;
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 11. Jul 2002, 13: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Traumzauberbaum

Registriert seit: 10. Jul 2002
Ort: Hamburch
12 Beiträge
 
#10
  Alt 11. Jul 2002, 13:12
jo danke dich so hat et geklappt, jetzt können die beiden endlich mitanander anstoßen *g*
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 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