![]() |
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 |
Re: Level erstellen
Zitat:
Um was geht es denn genau? Um ein Delphiprogramm? Dann wäre die Frage sicher besser bei "Multimedia" aufgehoben? |
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 ![]() |
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
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 ;-) |
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 ;-)
|
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 |
Re: Level erstellen
Zitat:
Zitat:
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 ;-) |
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:
Dieser Vorgang ist in einer Funktion abgelegt und kann unter Umständen mehrere Male pro Sekunde aufgerufen werden
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; (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 |
Re: Level erstellen
Zitat:
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:
Der Geschwindigkeitszuwachs dürfte je nach Anzahl der Planeten gerade noch meßbar sein...
BitBlt(Form1.Paintbox1.Canvas.Handle, i*22, o*22, Bmp.Width, Bmp.Height, Bmp.Canvas.Handle, 0, 0, SRCCOPY);
Zitat:
|
Re: Level erstellen
Zitat:
mfg devnull |
Re: Level erstellen
Zitat:
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)? |
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 |
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