Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Level erstellen (https://www.delphipraxis.net/25721-level-erstellen.html)

devnull 11. Jul 2004 10:40


Level erstellen
 
Hat jemand eine Idee, wie ich eine Welt erstellen kann???
Wenn das Raumschiff in den unteren (oberen, linken, rechten) Bildschirmbereich kommt, soll automatisch
der nächste Ausschnitt geladen und angezeigt werden.

Soll ich da Arrays (world=array[1..1000,1..1000] of byte) oder die Daten in Dateien speichern :?:

mfg
devnull

Sharky 11. Jul 2004 10:44

Re: Level erstellen
 
Zitat:

Zitat von devnull
Hat jemand eine Idee, wie ich eine Welt erstellen kann???...

Ich glaube das hat Gott vor einigen Tausendjahren schon versucht ;-)
Um was geht es denn genau? Um ein Delphiprogramm? Dann wäre die Frage sicher besser bei "Multimedia" aufgehoben?

tommie-lie 11. Jul 2004 10:48

Re: Level erstellen
 
Ich würde ein zweidimensionales Array von ausreichener Größe nehmen (beispielsweise 100 Spielfelder) in dem die Felddaten gespeichert werden. Zusätzlich brauchst du Variablen um den sichtbaren Bereich festzuhalten, z.B. ein Rect (wobei die Koordinaten des Rechtecks nicht in Pixeln sondern in deinen Feldergrößen gemessen werden sollen, Rect(2,4,10,12) wäre also von Feld 2/4 bis Feld 10/12). Die Raumschiffposition speicherst du ebenfalls in absoluten Koordinaten des gesamten Spielbereiches, nicht nur im sichtbaren Bereich. Jedesmal wenn das Raumschiff nun über den Bereich des Rects hinausgeht, verschiebst du das Rect entsprechend.
Die Zeichenroutine legst du so aus, daß sie immer die linke obere Ecke des Rects links oben auf den Bildschirm positioniert, ansonsten kümmert sie sich um nichts, was die eigentliche Positionsermittlung angeht. Sie zeichnet also blind einfach den Inhalt des Rects.


Edit: @Sharky: das Ganze ist angelehnt an diesen Thread ;-)

devnull 11. Jul 2004 11:24

Re: Level erstellen
 
Dann werd ich also mein Spielfeld bei einem Spielstart variabel in einem Array erstellen und -wenn überhaupt- beim Beenden in einer Datei ablegen.
Ich hatte erst Bedenken, bei der Größe des Arrays...

DP-Maintenance 11. Jul 2004 11:26

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Klatsch und Tratsch" nach "Sonstige Fragen zu Delphi" verschoben.
Wenn mir keiner etwas sagt verschiebe ich den Thread halt ;-)

tommie-lie 11. Jul 2004 12:25

Re: Level erstellen
 
Kommt drauf an, wie groß dein Spielfeld werden soll. Es muss auf jeden Fall in den Speicher passen. Wenn jedes Feld in einem Byte gespeichert wird, hast du bei einem 1000x1000 Spielfeld gerade mal knapp 1 MB, das sollte eigentlich in die gängigsten Hauptspeicher passen ;-)

devnull 11. Jul 2004 13:13

Re: Level erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich jetzt den Array [1000*1000] Felder anlege, und immer die linke, obere Ecke in Bewegungsrichtung des Raumschiffs verschiebe, dann verschiebt sich doch der komplette Sichtbereich. Da ich nun aber kein DelphiX oder sowas benutze, frage ich mich, ob dieser Vorgang dann 1.) ruckelt und 2.) die einzelnen Bildchen beim ständigen Neuzeichnen nicht "flimmern"?

Skizze im Anhang
(Der Sichtbereich ist 28*21Felder groß; jedes Feld hat die Größe von 22*22Pixel)
(Der Sichtbereich wird nur am blauen Kreuz verschoben, damit das Raumschiff immer in der Mitte des SB ist)


mfg
devnull

tommie-lie 11. Jul 2004 13:42

Re: Level erstellen
 
Zitat:

Zitat von devnull
Wenn ich jetzt den Array [1000*1000] Felder anlege, und immer die linke, obere Ecke in Bewegungsrichtung des Raumschiffs verschiebe, dann verschiebt sich doch der komplette Sichtbereich.

War das nicht Sinn der Sache? :gruebel:

Zitat:

Da ich nun aber kein DelphiX oder sowas benutze, frage ich mich, ob dieser Vorgang dann 1.) ruckelt und 2.) die einzelnen Bildchen beim ständigen Neuzeichnen nicht "flimmern"?
Probier's doch einfach aus ;-)
Am besten nicht alles einzeln Zeichnen sondern in einen Puffer und den gesamten Puffer mit BitBlt auf die Paintbox Blitten, das dürfte schon das schnellste sein, damit's nicht flimmert. Sollte es ruckeln, kannst du auch noch die Zeichenroutinen für den Puffer durch API-Aufrufe ersetzen (BitBlt), aber schneller wird's mit der GDI dann nicht mehr ;-)

devnull 12. Jul 2004 15:44

Re: Level erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab eine Frage zu BitBlt:

Also ich zeichne jetzt alle Planeten in die Paintbox:
Delphi-Quellcode:
Bmp := TBitmap.Create;
try
  case World[Ship1.XWorldpos+i, Ship1.YWorldpos+o] of
    1 : Bmp.LoadFromFile(Form1.SpielVerzeichnis+'\Graphics\planet_1.bmp');
    2 : Bmp.LoadFromFile(Form1.SpielVerzeichnis+'\Graphics\planet_2.bmp');
    3 : Bmp.LoadFromFile(Form1.SpielVerzeichnis+'\Graphics\planet_3.bmp')
    else Bmp.LoadFromFile(Form1.SpielVerzeichnis+'\Graphics\planet_3.bmp')
  end;
finally
  Form1.PaintBox1.Canvas.Draw(i*22, o*22, Bmp);
  Bmp.Free;
end;
Dieser Vorgang ist in einer Funktion abgelegt und kann unter Umständen mehrere Male pro Sekunde aufgerufen werden
(Immer wenn das Raumschiff in ein anderes Feld wechselt, also alle 22 Pixel Wegstrecke)

Kann man das so machen oder gibts da ne andere Lösung (ich hab da nich voll durchgeblickt, und verschiebe nur das
raumschiff mittels bitblt)


[EDIT]Ich hab mal die Oberfläche angehängt. Ich glaube, es ist besser, wenn nur der Sichtbereich bewegt wird, wenn das Raumschiff sich in den Bildschirmrand-Bereich begibt; da ansonsten der Anflug auf einen Planeten schwierig wird...[/EDIT]

mfg
devnull

tommie-lie 12. Jul 2004 18:02

Re: Level erstellen
 
Zitat:

Zitat von devnull
Kann man das so machen oder gibts da ne andere Lösung (ich hab da nich voll durchgeblickt, und verschiebe nur das
raumschiff mittels bitblt)

In welche Richtung anders?
Bei Programmieren wirst du fast immer mehr als eine Lösung finden ;-)
Du kannst beispielsweise auch jeden Planeten anstatt der Draw mit BitBlt blitten, dann wäre das:
Delphi-Quellcode:
BitBlt(Form1.Paintbox1.Canvas.Handle, i*22, o*22, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
Der Geschwindigkeitszuwachs dürfte je nach Anzahl der Planeten gerade noch meßbar sein...


Zitat:

Ich hab mal die Oberfläche angehängt. Ich glaube, es ist besser, wenn nur der Sichtbereich bewegt wird, wenn das Raumschiff sich in den Bildschirmrand-Bereich begibt; da ansonsten der Anflug auf einen Planeten schwierig wird...
Nein, wieso? Du musst nur als Zielpunkt des jeweiligen Zuges auch die absolute Position auf dem Spielfeld und nicht die auf dem Sichtbereich wählen. Wenn sich das Raumschiff unbedingt frei bewegen muss (und nicht in einem 22*22-Raster), kannst du die Positionsangabe auch aufsplitten, einmal in das Feld im Raster und einmal in die relative Position zur linken, oberen Ecke des Rasters, sodaß du zwei Koordinaten hast, die dann dann beim Zeichnen zusammenfügen kannst wie bei den Planeten.

devnull 12. Jul 2004 18:44

Re: Level erstellen
 
Zitat:

Zitat von tommie-lie
In welche Richtung anders?

Naja, bis jetzt verschiebe ich den Sichtbereich nur, wenn das Raumschiff ein Feld wechselt (das heißt alle 22 Pixel in x- oder y-Richtung). Die Planeten sind jetzt direkt ins Canvas der Paintbox geschrieben und nicht mehr als Image-Objekte drübergelegt...

mfg
devnull

tommie-lie 12. Jul 2004 18:56

Re: Level erstellen
 
Zitat:

Zitat von devnull
Naja, bis jetzt verschiebe ich den Sichtbereich nur, wenn das Raumschiff ein Feld wechselt (das heißt alle 22 Pixel in x- oder y-Richtung). Die Planeten sind jetzt direkt ins Canvas der Paintbox geschrieben und nicht mehr als Image-Objekte drübergelegt...

Ist doch in Ordnung.
Oder willst du, daß die Umgebung komplett um das Raumschiff bewegt wird, also schon wenn sich das Raumschiff nur einen Pixel bewegt (ergo das Raumschiff immer in der Mitte ist und die Umgebung verschoben wird)?

devnull 12. Jul 2004 19:16

Re: Level erstellen
 
Doch, ich glaube, dass ein zentriertes Raumschiff wesentlich einfacher zu navigieren ist, als ein Raumschiff, dass sich durch die Welt bewegt :mrgreen:
Das Problem ist, dass ich dann den kompletten Ablauf (sowie Zeichenfunktion) verändern müsste;
oder ich mach einfach zwei Einstellungen und man kann sichs dann raussuchen...

Nochmals danke

mfg
devnull

elloco15 14. Jul 2004 13:44

Re: Level erstellen
 
Kannst du mal bitte den Code hochladen? ich hatte auch mal die Idee so ein spiel zu basteln und bin da auf ähnliche probleme gestoßen


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 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