Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Terrain wie in Worms (2D / DelphiX) (https://www.delphipraxis.net/41992-terrain-wie-worms-2d-delphix.html)

ISAS 11. Mär 2005 17:11


Terrain wie in Worms (2D / DelphiX)
 
Arbeite gerade an einem Multiplayerspiel, das auf dem System von Worms basiert. Einziger Unterschied: Alles ist Echtzeit, also kein rundenbasierendes Spiel. Waffen und Steuerung sind natürlich auch anders.

Aber nun zu meiner Frage: Wie schaffe ich es, eine Spielfeld zu programmieren, wie in Worms. Ich meine jetzt nicht, dass sie so aussieht, sondern, dass sie zerstörbar und begehbar ist. Wie in Worms halt. Wenn man mit einer Rakete wo hinschiesst und die explodiert, dann soll sich auch das Terrain verändern. Oder das gehen. Man soll immer auf dem Terrain gehen können, ausser, wenn es zu steil ist. Ich weiss, dass es nicht besonders leicht ist, aber jedes einzelne Pixel zu proggen ist doch ein bisschen schwer, ausser es bleibt mir nichts andres übrig. Vielleicht weiss einer auch Lösungen, wie man das dann sehr einfach mit Pixeln proggen könnte

angos 11. Mär 2005 17:19

Re: Terrain wie in Worms (2D / DelphiX)
 
Ich würde eine Hintergrundfarbe (zB schwarz) deklarieren und dann bei der entsprechenden Figur(Wurm, Panzer, wasauchimmer) immer die Pixel unten drunter abfragen (wenn alle "Bodenpixel" schwrz sind eine ebene tiefer)

Raketeeinschläge mit nem Kreis simulieren, der einfach das alte Terrain mit der Hintergrundfarbe überzeichnet.

ISAS 11. Mär 2005 18:03

Re: Terrain wie in Worms (2D / DelphiX)
 
Jedesmal die Spielfläche neuzeichnen packt der Compi nimma.

Was ich gerade versuch zu machen, ist was mit Sprites. Aber die Kollision funktioniert noch nicht ganz bzw das gehen

Elite 11. Mär 2005 18:14

Re: Terrain wie in Worms (2D / DelphiX)
 
Also ich könnte jetzt hier einen Roman schreiben, weil ich genau das, was du vorhast, bereits implementiert habe, aber ich fasse mich kurz:
Pixelgenaue Kollisionen von Sprites in DelphiX werden dich zu pixelcheck:=true führen. Dann wirst du feststellen, dass DelphiX einfach zu blöd ist, um damit so etwas effizient was zu machen. Das wirst du allerdings erst merken, wenn du schon ziemlich weit mit dem Spiel bist. Dann hast du keine Lust mehr, alles auf einen anderen Wrapper oder direkt auf DirectX umzuschreiben und du hast keine Lust mehr auf das Projekt. Dann geht es dir so wie mir jetzt.

Deshalb mein Tipp: Auch wenn die Begeisterung groß ist, befreie dich von DelphiX. Steig auf mathematische Kollisionskontrolle um, bzw. nutze einen OGl-Wrapper (GlScene, ...), der auch gleich 3D mit drin hat, auch wenn du es atm nicht benötigst.

Seniman 12. Mär 2005 18:14

Re: Terrain wie in Worms (2D / DelphiX)
 
Hallo ISAS,

Zitat:

Zitat von ISAS
Oder das gehen. Man soll immer auf dem Terrain gehen können, ausser, wenn es zu steil ist. Ich weiss, dass es nicht besonders leicht ist, aber jedes einzelne Pixel zu proggen ist doch ein bisschen schwer, ausser es bleibt mir nichts andres übrig. Vielleicht weiss einer auch Lösungen, wie man das dann sehr einfach mit Pixeln proggen könnte

Ich würde das folgendermaßen machen. Zeichne ganz am Anfang den Hintergrund, also das Terrain. Wobei du, wie Angos schrieb, für den Hintergrund "reservierst", d.h. alles ist "Boden" außer das, was z.B. schwarz ist, das ist "Luft". Wenn nun eine Explosion passiert, zeichnest du auf das Hintergrundbild einen Schwarzen Kreis drauf.
So, dieses Hintergrund/Terrain-bild soll speichern, wie die Landschaft (ohne Figuren) aussieht. Dieses Bild ist deswegen als unsichtbares Bild gespeichert. Ich weiß nicht genau, wie die Klasse dafür heißt, ich glaub TImage oder so. Zu Anfang jeden Frames kopierst du die Landschaft zuerst auf den Bildschirm und danach malst du die Figuren dadrüber.
Für die Kollisionsabfrage berechnest du dann einfach die Koordinaten irgendeines Objekts und fragst dann die Farbe des Pixels auf dem Hintergrundbild am. Falls er schwarz ist, dann ist keine Kollision (zumindest nicht mit dem Terrain) und falls er eine andere Farbe hat, dann gibt es eine Kollision. Die Kollision mit anderen Objekten musst du dann seperat überprüfen.

Grüße
Seniman

Khabarakh 12. Mär 2005 23:58

Re: Terrain wie in Worms (2D / DelphiX)
 
Zitat:

Zitat von Seniman
Ich weiß nicht genau, wie die Klasse dafür heißt, ich glaub TImage oder so.

Ich denke, du meinst TBitmap.

MasterEvil 13. Mär 2005 00:23

Re: Terrain wie in Worms (2D / DelphiX)
 
kA ob das nicht eventuell zu langsam ist,
aber falls du eine feste größe für die spielfläche hast könntest du auch mit einem array arbeiten.
das array könnte ein record sein, der z.B. Farbe und Fest Ja/nein enthält.
der array ist halt so groß wie deine spielfläche (680*420, oder wie auch immer).
dann hast du eine paint methode der du sagst welchen bereich du neuzeichnen willst, so brauchste nich immer alles neuzeichnen.
so kannste dann halt bei explosionen mit dem array arbeiten, mehrere arrays für mehrere ebenen benutzen und kannst halt viel eingrenzen in dem du sagst was er zeichnen soll.

aber echt kein plan ob die art nicht wiederrum zu lahm ist.

greetz
Steffen

Seniman 13. Mär 2005 18:57

Re: Terrain wie in Worms (2D / DelphiX)
 
Hallo,

Zitat:

Zitat von MasterEvil
kA ob das nicht eventuell zu langsam ist,
aber falls du eine feste größe für die spielfläche hast könntest du auch mit einem array arbeiten.
das array könnte ein record sein, der z.B. Farbe und Fest Ja/nein enthält.
der array ist halt so groß wie deine spielfläche (680*420, oder wie auch immer).
dann hast du eine paint methode der du sagst welchen bereich du neuzeichnen willst, so brauchste nich immer alles neuzeichnen.
so kannste dann halt bei explosionen mit dem array arbeiten, mehrere arrays für mehrere ebenen benutzen und kannst halt viel eingrenzen in dem du sagst was er zeichnen soll.

aber echt kein plan ob die art nicht wiederrum zu lahm ist.

Gerade das ist ja, was man (wie ich meine!, vielleicht irre ich ja) nicht tun sollte. Wenn man in einem Array gespeichert hat, wo Terrain ist und das zeichnen will, hat man eines der beiden folgenden Probleme: Entweder man trennt das Terrain, das gespeichert ist von dem, was gezeichnet wird. Dann kann man bei Explosionen einfache Kreise zeichnen und hat ein Loch. Aber was passiert mit dem Array? Da muss man dann in den Array den gleichen Kreis zeichnen. Das ist etwas knifflig. Oder, wenn man den gespeicherten Array als Grundlage nimmt, dann hat man das Problem das dann auch zu zeichnen. Es ist unglaublich langsam, wenn man etwas Pixelweise zeichnet und soweit ich weiß gibt es auch keinen gescheit schnellen Befehlt dafür.
Deswegen mein Vorschlag: Lass den Array weg und nimm statt dessen das Bild (das ja in gewisser Weise auch ein Array ist). Da kann man ganz einfach Löcher rein machen, indem man Kreise reinzeichnet. Außerdem kann man ziemlich einfach den Inhalt eines ganzen Bildes komplett in ein anderes Bild hineinkopieren und das ziemlich schnell.
Ich hoffe ich habe das jetzt nicht zu verwirrt wiedergegeben...

Grüße
Seniman


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