Registriert: Fr Jan 28, 2011 12:24 Beiträge: 18
Programmiersprache: Delphi,AS3,C++,VB
Hallo DGL Community,
jeder fängt klein an und für mein erstes project hatt ich mir vorgenommen ein kleines 2D spiel zu programieren allein schon vom lernefect her nur bin ich jetzt an einer hürde gestoßen habe hier im Forum schon alles abgesucht und nix für 2d gefunden die wiki toturials bin ich jetzt bis zur Toturial 2D gekommen habe bei den anderen schon mal reingeschnuppert aber auch da nix gefunden.
ich habe ein feld fenstergröße "1024 x 765" meine object ist "32x32" kugel. Die kugel möchte ich nun per mausklick in die richtung bewegen wo ich die maus klicke.
Nur fehlt mir hier der ansatz wie ich das nun umsetze bzw. wie ich die position berechne und die bewegung steuere. eine erklärung dazu habe ich hier leider nicht gefunden. kann mir bitte jemand helfen.
Ich benutze delphi 7
_________________ Es gibt zwei Dinge die unendlich sind - das Universum und die menschliche Dummheit...................beim Universum bin ich mir nicht so sicher.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wie ist dein Spiel aufgebaut? Schaust du senkrecht von Oben auf deine Karte?
Wenn ja, dann kannst du bei einem Mausklick leicht herausfinden was unter der Maus lag bzw. die Koordinaten auf der Karte bestimmen. Dann musst du nur noch deine Kugel bewegen. Das machst du, indem du die Kugel in jedem Renderdurchlauf um ein Stück verschiebst.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Fr Jan 28, 2011 12:24 Beiträge: 18
Programmiersprache: Delphi,AS3,C++,VB
ja ich schaue senkrecht von Oben auf deine Karte!!
Ich lade mal mein versuch hoch. der code sollte noch sehr unordendlich sein bitte rückicht nehmen bin erst seit 2 tagen dabei und es ist mein erster versuch.
Dort kann ich zwar schon den player per gedrückter taste bewegen aber das war nicht mein ziel.. habe schon mehreres versucht aber ohne erfolg.
Die bewegung sollte wie bei Planeto gesteuert werden.
_________________ Es gibt zwei Dinge die unendlich sind - das Universum und die menschliche Dummheit...................beim Universum bin ich mir nicht so sicher.
_________________ Es gibt zwei Dinge die unendlich sind - das Universum und die menschliche Dummheit...................beim Universum bin ich mir nicht so sicher.
Ich kenne zwar auch Dark Orbit nicht, aber unter C&C kann ich mir was vorstellen. Trotzdem ist mir noch nicht 100%ig klar was du möchtest: 1. Der Ball soll sich auf gerader Linie auf die vom Benutzer angeklickte Position bewegen? Das wäre recht einfach zu realisieren. 2. Du möchtest das sich der Ball auf die geklickte Position bewegt, dabei aber eventuelle Hindernisse im Weg berücksichtigt? Hier brauchst du "Pathfinding". Im Wiki finden sich dazu zwei Tutorials.
zu 1.: Der Ball bekommt eine Zielposition. Immer wenn der Nutzer irgendwo hin klickt setzt du diese Position neu. Die Bewegung in jedem Frame wird dann wie folgt realisiert:
Code:
direction := positionZiel - positionBall; distance := length(direction); direction := (1/distance) * direction; if (speed * timeElapsed >= distance) then begin // Ziel wird in diesem Frame erreicht bzw. der Ball ist schon da positionBall := positionZiel; end else begin // mit Geschwindigkeit speed auf das Ziel zu bewegen positionBall := positionBall + (speed * timeElapsed) * direction; end;
Anmerkungen: positionZiel, positionBall und direction sind 2D-Vektoren. Sie haben also jeweils eine X- und eine Y-Komponente Die Funktion length berechnet die Länge eines Vektors: sqrt(x*x + y*y) speed ist die Geschwindigkeit in "Einheiten pro Sekunde" timeElapsed ist die Zeit in Sekunden die seit dem letzten Frame vergangen ist. Ich programmiere in C++/Java....ich hoffe ich habe die Delphi-Syntax halbwegs getroffen.
Registriert: Fr Jan 28, 2011 12:24 Beiträge: 18
Programmiersprache: Delphi,AS3,C++,VB
also hindernisse muss er nicht ausweichen es geht mir nur um die bewegung dort hin. Den syntax ist richtig werde es mal ausprobieren. gebe dann bescheit ob ich es hinbekomme. wo muss ich den von dir genanten code eintragen. bei Render oder neue Prozedure anlegen und diese dann abrufen
_________________ Es gibt zwei Dinge die unendlich sind - das Universum und die menschliche Dummheit...................beim Universum bin ich mir nicht so sicher.
wo muss ich den von dir genanten code eintragen. bei Render oder neue Prozedure anlegen und diese dann abrufen
Ähm, soweit ich weiß kann Delphi nicht mit Vektoren umgehen. Also quasi sämtliche Aufrufe bei denen 2D-Vektoren vorkommen musst du einmal für X und einmal für Y machen. Jedenfalls kannst du den Code nicht 1:1 übernehmen
Da das ganze eigentlich nichts mit dem rendern zu tun hat würde ich es nicht in die render-Methode packen. Ich mache das üblicherweise so das ich eine Methode mainloop() habe die in jedem Frame aufgerufen wird. Diese nimmt die Zeitmessung vor und ruft dann update() und render() auf.
Edit: Übrigens sehe ich beim Blick auf deinen Code das deine Zeitmessung falsch ist. Du misst nur die Zeit die du zum rendern benötigst. Der Computer verbringt aber auch eine Menge Zeit in bei der Verarbeitung von Events (z.B. Maus/Keyboard) oder gar in anderen Anwendungen. Du solltest die Zeit messen die vom Anfang der Render-Methode bis zum nächsten Anfang der Render-Methode vergeht.
Registriert: Fr Jan 28, 2011 12:24 Beiträge: 18
Programmiersprache: Delphi,AS3,C++,VB
danke für den hinweis ist mir nicht aufgefallen werde es gleich mal ändern wegen der zeitmessung. das der code nicht 1:1 übernommen werden kann da du ja schon sagtest du machst ja nur Java und C++, ich hätte jetzt mehrere varianten durch versucht irgendwann komm ich dann drauf aber ein anfang ist es schon mal..
_________________ Es gibt zwei Dinge die unendlich sind - das Universum und die menschliche Dummheit...................beim Universum bin ich mir nicht so sicher.
Da es ja nur ein paar Zeilen sind hab ich das nochmal fix ausgeschrieben. So müsste es auch in Delphi gehen:
Code:
directionX := positionZielX - positionBallX; directionY := positionZielY - positionBallY; distance := sqrt(directionX*directionX + directionY*directionY); directionX := directionX / distance; directionY := directionY / distance; if (speed * timeElapsed >= distance) then begin // Ziel wird in diesem Frame erreicht bzw. der Ball ist schon da positionBallX := positionZielX; positionBallY := positionZielY; end else begin // mit Geschwindigkeit speed auf das Ziel zu bewegen positionBallX := positionBallX + (speed * timeElapsed) * directionX; positionBallY := positionBallY + (speed * timeElapsed) * directionY; end;
Diese kannst du statt dem X und Y natürlich auch benutzen. In C++ würde man sich etwas ähnliches definieren und dann die Operatoren +-*/ usw. dafür definieren. Dann kann man die Vektoren in C++ tatsächlich so intuitiv benutzen wie in meinem ersten Post beschrieben. Delphi hat dafür andere Dinge die ich in C++ vermisse
Registriert: Fr Jan 28, 2011 12:24 Beiträge: 18
Programmiersprache: Delphi,AS3,C++,VB
ich werde mal mein glück versuchen.. und schauen ob ich es hin bekomme.
_________________ Es gibt zwei Dinge die unendlich sind - das Universum und die menschliche Dummheit...................beim Universum bin ich mir nicht so sicher.
Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.