Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Vorschläge für Grafische 2D welt (https://www.delphipraxis.net/185818-vorschlaege-fuer-grafische-2d-welt.html)

C00D3R4TIV 8. Jul 2015 23:19

Vorschläge für Grafische 2D welt
 
Hall0
bisher habe ich 2D Welten immer so programmiert das im Hintergrund sich ein image_Hintergrund befindet und darauf bewegt sich image_Spieler jedoch ist dann die Welt nur auf die Fenstergröße reduziert.

Ich möchte jetzt die Grenzen erweitern ^.^


// Mein Aktueller Stand
image_hintergrund .Top / Left := image_hintergrund + - Etwas;

dabei kann man eine super große "Welt" erstellen, jedoch das folgende Problem ist!
sobald ein weites image_nps vorhanden ist bleibt es auf dem Fenster genauso stehen wie image_Spieler mit anderen Worten die Distanz zum anderem nicht Hintergrund image und dem image_Spieler verändert sich nicht beim laufen.

Jetzt die Frage
Gibt es eine Variante wie ich eine 2D-Welt für spiele in Delphi/Lazarus erstellen kann ?
oder muss ich fuer jedes weiter imageNps einen code schreiben damit er sich der Welt anpasst ?


Habe schon ganz oft überlegt alle images mit image_Hintergrund (außer dem imagespieler) zu "verbinden" sodass sie sich harmonisch mit dem hintergrund mitbewegen und dazu noch ihre eigene Bewegung besitzen.

Memnarch 9. Jul 2015 09:18

AW: Vorschläge für Grafische 2D welt
 
Dafür musst du dir eine kleine auf dein Spiel angefertigte Engine basteln, die das für dich übernimmt.

Zuersteinmal hat jedes Element fürs zeichnen X/Y Koordinaten(Spieler, Hintergrundelemente, Vordergrundelemente). Ein element sollte kein TImage kapseln, sondern eher ein TBitmap. Wenn du ein Element Zeichnest, zeichnest du es aktuell ausgehend von der oberen Linken Kante des Bildschirms. Besser ist es:

Du definierst eine Klasse namens TView. Im einfachsten sinne beinhaltet TView einen 2D Vector (TPoint) für die Position der View in deiner Welt sowie die Höhe/Breite. Gezeichnet wird so:

Delphi-Quellcode:
for Element in Elements do
begin
  Canvas.Draw(Element.X - View.X + View.Width div 2, Element.Y - View.Y + View.Height div 2, Element);
end;
Die Daten der View werden benutzt um Offsets auf die Positionen der Elemente aufzurechnen.

Das hat mehrere vorteile:

1) Dein System behandelt alle zu zeichnenden Elemente Gleich. Was dass ist, ist erstmal egal.
2) Das System ist nicht an den Spieler gebunden. Soll die View dem Spieler folgen, muss die Position der View vor jedem Zeichnen einfach auf die Position des Spielers gesetzt werden.
3) Wenn du den Canvas als Property deiner View definierst(Willkommen bei Rendertargets), kannst du der Zeichen routine verschiedene Views übergeben und sie zeichnet die Welt in verschiedene Views mit verschiedenen Positionen. Splittscreen Multiplayer gefällig? :D

PS: Beachte dass ich bei meinen Kalkulationen immer von einem 0-Punkt in der Mitte des Bildschirms ausgehe. Dies erreiche ich, in dem ich die Halbe dimension(Höhe, Breite) dazurechne. Das führt dazu, dass wenn die View an XY(0,0) steht und der spieler an X/Y(0,0) steht, dieser in der mitte des Bildschirms ist.


Soweit zu meinem Crashcurs^^

mkinzler 9. Jul 2015 09:48

AW: Vorschläge für Grafische 2D welt
 
Oder man nimmt etwas "Fertiges" wie Andorra2D, ZenGL, Terra, Quad o.ä.

CHackbart 9. Jul 2015 12:46

AW: Vorschläge für Grafische 2D welt
 
Du kannst ja hier mal gucken: http://www.fmxexpress.com/free-minic...droid-and-ios/

Abgesehen von diversen Memoryleaks funktioniert das prima.


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