Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [DelphiX] Iso-Engine von der Theorie zur Praxis (https://www.delphipraxis.net/15187-%5Bdelphix%5D-iso-engine-von-der-theorie-zur-praxis.html)

Igotcha 23. Jan 2004 14:54


[DelphiX] Iso-Engine von der Theorie zur Praxis
 
Hallo zusammen,

nachdem ich mich über Iso-Engines eingelesen habe, möchte ich solch eine nun mit DelphiX realisieren.

Welche Eigenschaften soll die Engine haben:

- Isometrische 2D-Engine
- multilayer (also mehrere Ebenen)

Hierzu habe ich folgende Fragen zur Umsetzung:

1. Da durch die multilayer-Eigenschaft die Spielfiguren auch z.B. hinter einem Objekt (Haus, Baum, etc.) verschwinden und bei z.B. Zäunen durchscheinen sollen, kann ich nicht direkt auf der DXDraw-Surface zeichnen, da ich ja verschiedene Z-Werte von "Hintergrund" und den Figuren-Sprites berücksichtigen muß.

2. Deshalb denke ich, dass ich den Background mit Sprites aufbauen muß. TBackgroundSprite fällt in meinem Fall aus, da es sich um Iso-Tiles handelt und dieser nur rechteckige "Chips" zulässt.

3. Aus diesem Grund bin ich jetzt bei TImageSprites angelangt, die ich selbst zeichne, bzw. deren Koordinaten ich entsprechend der Scrollrichtung (Himmelsrichtungen) verändere.

Bin ich hiermit erstmal überhaupt auf der richtigen Fährte oder gar ganz auf dem falschem Dampfer?

Wenn das soweit OK sein sollte, habe ich mir nun folgendes gedacht:

- da ich bei einer Spielfläche von z.B. 1000x1000 Tiles á 64x32 Pixel nicht 1.000.000 Sprites erstellen will, zeichne ich nur soviel Sprites, wie nötig sind, den Bildschirm zu füllen plus 1-2 Pufferreihen an jeder Seite.
- wenn jetzt das Spielfeld 64 Pixel in eine Richtung gescrollt wurde, "swappe" ich die aktuellen Bilder des Map-Arrays in die am Bildschirm angezeigten Sprite und setze sie wieder um 64 Pixel zurück - es wird als0 tatsächlich immer nur maximal 64 Pixel in X-Richtung und 32 Pixel in Y-Richtung gescrollt und dann werden die eigentlich neu kommenden Tiles in der Sprite-Matrix ersetzt und diese wieder um 64 bzw. 32 Pixel zurückgesetzt.

Ist das ein "guter" Ansatz, um die Theorie zu realisieren?

Bin für alle Umsetzungstips dankbar!

Gruß Kay

Gandalfus 23. Jan 2004 16:42

Re: [DelphiX] Iso-Engine von der Theorie zur Praxis
 
http://www.minfos.de/wissen/iso.html

Igotcha 23. Jan 2004 17:13

Re: [DelphiX] Iso-Engine von der Theorie zur Praxis
 
Danke Dir, aber das bringt mich bei meinem Problem nicht weiter - außerdem kannte ich die Seite schon.

Wie gesagt, über die Theorie habe ich bereits einiges gelesen, aber ich habe bestimmte Anforderungen (s.o.) und dazu o.g. Fragen zur technischen bzw. Umsetzungsseite.

Gruß Kay

Seniman 23. Jan 2004 17:52

Re: [DelphiX] Iso-Engine von der Theorie zur Praxis
 
Hallo Igotcha,

soweit ich weiß ist das mit dem Hintergrund auf der Seite, die Gandalfus angibt, so geregelt, dass du insgesamt zwei TBackgroundSprites hast. Stell dir ein Schachbrett Isometrisch dargestellt vor. wenn du jetzt nur die Weißen Felder betrachtest, dann kannst du diese mithilfe eines TBackgroundSprites darstellen, denn sie überlappen sich nicht. So wurde das dort umgesetzt. Das funktioniert allerdings nicht, wenn du mehrere Layers hast.

Ich habe die Erfahrung gemacht, dass TImageSprites recht langsam sind. Ich würde empfehlen, alle Graphiken mit
Delphi-Quellcode:
DxImageList1.Items[n].Draw
darzustellen. Die Sprites würde ich nur benutzen, wenn du die Kollisionsabfrage brauchst. Falls du Sprites benutzt, dann brauchst du auch nicht die Koordinaten jedes einzelnen Sprites zu ändern. Es gibt bei der Spriteengine die Eigenschaft
Delphi-Quellcode:
DxSpriteEngine1.Engine.X
// bzw.
DxSpriteEngine1.Engine.Y
Damit kann man alle Sprites der SpriteEngine verschieben.

Zu dem Mulitlayerproblem:
Fange in der Zeile ganz oben an und zeichne den untersten Layer, dann die nächsten Layer für diese Zeile (!!!). Dann kommt die zweite Zeile dran usw. Das ist eigentlich nicht so schwierig.

Grüße
Seniman

Igotcha 23. Jan 2004 19:39

Re: [DelphiX] Iso-Engine von der Theorie zur Praxis
 
Zitat:

Zitat von Seniman

Zu dem Mulitlayerproblem:
Fange in der Zeile ganz oben an und zeichne den untersten Layer, dann die nächsten Layer für diese Zeile (!!!). Dann kommt die zweite Zeile dran usw. Das ist eigentlich nicht so schwierig.

Das war mir schon klar, aber das dient ja eigentlich der Darstellung des Backgrounds. Wenn ich das aber mit

Delphi-Quellcode:
DxImageList1.Items[n].Draw
mache, dann bekomme ich es doch aber nicht hin, dass z.B. das Playersprite hinter eine Baum läuft, da ich ja für das Draw keinen Z-Wert angeben kann (oder doch???) und somit nicht identifiziert werden kann, dass das Bild wie folgt aufgebaut wird (Sicht von hinten nach vorne aufgebaut):

a) normaler Hintergrund
b) PlayerSprite
c) Baum

Also der Baum vor dem Player (dieser scheint an den transparenten Bereichen des Baums durch) steht und der Player vor dem normalen Hintergrund.

Gruß Kay

Seniman 23. Jan 2004 22:30

Re: [DelphiX] Iso-Engine von der Theorie zur Praxis
 
Zitat:

Zitat von Igotcha

Das war mir schon klar, aber das dient ja eigentlich der Darstellung des Backgrounds. Wenn ich das aber mit

Delphi-Quellcode:
DxImageList1.Items[n].Draw
mache, dann bekomme ich es doch aber nicht hin, dass z.B. das Playersprite hinter eine Baum läuft, da ich ja für das Draw keinen Z-Wert angeben kann (oder doch???) und somit nicht identifiziert werden kann, dass das Bild wie folgt aufgebaut wird (Sicht von hinten nach vorne aufgebaut):

a) normaler Hintergrund
b) PlayerSprite
c) Baum

Also der Baum vor dem Player (dieser scheint an den transparenten Bereichen des Baums durch) steht und der Player vor dem normalen Hintergrund.

Die Problematik ist mir schon klar. Und so wie ich es meinte, war es auch richtig. Vielleicht habe ich es nicht vernünftig formuliert. Also ich meine nicht, dass du zuerst den untersten Layer (1) komplett zeichnest, dann (b) und dann (c), sondern, dass du in der hintersten (auf dem Bildschirm obersten) Zeile zuerst alle drei Layers zeichnest, dann in der zweiten Zeile usw.
Wenn nun der Baum weiter vorn steht als die Spielfigur, dann wird er nach dieser Methode auch später gezeichnet und überdeckt die Figur gegebenenfalls teilweise. Habe ich mich nun verständlich ausgedrück? :lol:

Grüße
Seniman

Igotcha 24. Jan 2004 10:02

Re: [DelphiX] Iso-Engine von der Theorie zur Praxis
 
Zitat:

Zitat von Seniman
Wenn nun der Baum weiter vorn steht als die Spielfigur, dann wird er nach dieser Methode auch später gezeichnet und überdeckt die Figur gegebenenfalls teilweise. Habe ich mich nun verständlich ausgedrück? :lol:

Ja, das war die bereits von mir zitierte Theorie ;-)

Ich möchte mein Spieler-Sprite - und natürlich auch meine Gegner, interaktive Objekte, etc. - aber nicht "Drawen", sondern als richtiges "Sprite" über die SpriteEngine darstellen, damit diese z.B.

- selbstständig animiert werden,
- automatisch auf bestimmte Ereignisse reagieren, z.B. Kollisionen

Und wenn ich Sprites über die SpriteEngine verwende, kann ich in den Aufbau des Hintergrunds, wie von Dir beschrieben nicht eingreifen - sofern ich den Hintergrund nicht ebenfalls durch Sprites darstelle. Denn nur durch Sprites habe ich die Möglichkeit, Z-Koordinaten zu nutzen, um festzustellen, ob ein Objekt vor oder hinter einem anderen ist, bzw. dies zu setzen.

Oder: Bestimmte Ebenen des Hintergrunds werden tatsächlich "gedrawt" und andere Sprite-Objekte werden zusätzlich verwendet, um den Hintergrund zu komplettieren.

Beispiel:

- per Draw eine Grasfläche zeichnen
- davor einen Zaun als Sprite
- dann den Spieler als Sprite, der sich je nach Z-Wert vor oder hinter dem Zaun befinden kann.

Gruß Kay

godman 24. Jan 2004 19:26

Re: [DelphiX] Iso-Engine von der Theorie zur Praxis
 
Also ich kann dir nur raten versuch es mit einen Komponenten od. anderen Engine für Delphi! Mit Delphix hab ich das auch net hin bekommen! Kann da nur raten die Turbosprite Komponenten kosten zwar um die 70 - 90 Euro, aber da hast du alles was du brauchst! Ich verwende Turbosprite und kann dir sagen die Delphix ist schwach und kann viele sachen scheinbar überhaupt net! (http://www.silicmdr.com/TurboSprite.htm)

MFG

Martin

Flogo 26. Jan 2004 20:58

Re: [DelphiX] Iso-Engine von der Theorie zur Praxis
 
Ich bin mir nicht ganz sicher ob ich dein Problem richtig verstehe aber ich würde an deiner Stelle Hintergrund (Boden / Sprite oder direkt "drawen") und Vordergrund (Bäume,... / Auch Sprites) unterscheiden.

Was spricht den hier gegen ein Array [0..100, 0..80] of Sprite für den Hintergrund (z = 0) und das gleiche mit z = 2 für den Vordergrund (z=1 für den Spieler)?

Igotcha 27. Jan 2004 12:15

Re: [DelphiX] Iso-Engine von der Theorie zur Praxis
 
Zitat:

Zitat von Flogo
Ich bin mir nicht ganz sicher ob ich dein Problem richtig verstehe aber ich würde an deiner Stelle Hintergrund (Boden / Sprite oder direkt "drawen") und Vordergrund (Bäume,... / Auch Sprites) unterscheiden.

Was spricht den hier gegen ein Array [0..100, 0..80] of Sprite für den Hintergrund (z = 0) und das gleiche mit z = 2 für den Vordergrund (z=1 für den Spieler)?

Doch, Du hast mein Problem genau verstanden :-D

Alles, was ich bisher über ISO-Engines gelesen habe geht auf dieses Problem aber nicht ein, sondern beschäftigt sich hauptsächlich damit, wie man Hintergründe zeichnet - Anforderungen, die sich aus dem Spiel selbst ergeben, werden dort nicht behandelt.

Wie Du in meinem Ausgangspost siehst, war ich bei meinen Überlegungen genau bei Deinem Vorschlag angelangt, hatte jedoch technische Fragen zur Umsetzung bzgl. evtl. Performanceprobleme. Bei Deinem Array (s.o.) wären das mal locker 8.000 Sprites, wenn das gesamte Spielfeld so abgebildet werden würde - deshalb meine o.g. Frage bzgl. eines "swapping" bei konstanter Spriteanzahl von "BenötigteAnzahlSpriteszurFüllungeinesScreens x Layeranzahl".

Gruß Kay


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 Uhr.
Seite 1 von 2  1 2      

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