C# - Spieleprogrammierung - Kommunikation zw. Spielfigur und Map
lima-city → Forum → Programmiersprachen → Programmieren mit .NET & Mono
ansatz
benutzt beitrag
bewegung
boden
falle
figur
kollision
objekt
pixel
position
problem
problemlos abschalten
reine ansichtssache
run
schritt
spielfigur
sprung
stoppen
strecke
verpassen
-
Ich habe mir vorgenommen ein Jump\'n\'Run mit C# und DirectX zu programmieren. Bisher habe ich schon die TileEngine geschrieben, mit der ich Mapdateien laden und anzeigen. Jetzt bin ich gerade dabei die Spielfiguren zu schreiben. Bisher hat man ein ca. 10x10 px großen Punkt auf dem Bildschirm, mit dem man laufen und springen kann.
Mein Problem besteht jetzt darin diese beiden Elemente miteinander richtig kommunizieren zu lassen. Damit die kollision mit Wänden u.s.w. funktioniert.
Bisher habe ich es so gelöst, dass der Spieler einen Zeiger auf das Map-Objekt bekommt und dem MapObjekt sagen kann, ich bin jetzt auf Position x/y. Die Map spuckt dann einen Statuswert für diese Position aus (z.B. 0 für unpassierbar). Wenn die Map aber jetzt 0 zurückgibt, befindet sich die Spielfigur bereits in der Wand, oder im Boden.
Jetzt habe ich einen einen Schleife für sowas geschrieben, die den Spiel, falls er sich im Boden befindet und z.B. durch eine Y Bewegung dorthingelangt ist, er einfach solange zurückverschoben wird, bis sich der Status geändert hat. Allerdings sieht das nicht besonder schön aus und funktioniert auch nicht einwandfrei.
Gibt es da vielleicht irgendeine simplere Lösung für? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
ich weiss ja nicht genau wie deine engine funktioniert
aber du könntest der figur eine eigenschaft verpassen
die aussagt ob sie fällt oder nicht
und bei collision dann auf false setzt
und damit die bewegung abschaltet
if collision mit objekt then fall=false
if fall=false then y=y+10
ich hoffe das is ein ansatz für dich
weil selbst hab ich mich schon öfter an jump\'n\'run versucht bin aber immer zu faul levels zu design
aber nebenbei ich finds schon kurios das du c# benutzt ^^
Beitrag geändert: 26.5.2008 13:39:09 von aero23 -
Die Bewegung kann ich problemlos abschalten.
***
Zur Erklärung am Rande:
Ich benutze zwei variablen für die Bewegungsgeschwindigkeit:
float h_speed; // für die horizontale
float v_speed; // für die vertikale
... und dann noch zweit für Beschleudigung und Bremsung:
float acceleration;
float retardation;
Wenn ich jetzt einen Sprung ausführe, wird \"jump\" auf true gesetzt und \"v_speed\" auf irgendeinen positiven Wert (z.B. 10.0f). Dann wird \"retardation\" z.B. auf 1.0f gesetzt. Damit springt die Figur nach oben, verliert an Geschwindigkeit und fällt wieder zu Boden. Um das ganze zu Stoppen, gibt es eine Methode StopJump().
***
Mein Problem besteht also nicht darin, den Sprung ansich zu stoppen, sondern den Sprung zur richtigen Zeit zu stoppen ... und zwar genau dann, wenn die Spielfigur auf dem Boden steht, bzw. an die Decke stösst.
aero23 schrieb:
aber nebenbei ich finds schon kurios das du c# benutzt ^^
Wieso? Nur weil\'s nicht C++ ist?? Ich programmier sowohl in C++, als auch in C#. Im Moment findes ich C# probiere ich halt mit C# rum. Das ist garnicht so schlecht. -
du wirst ständig die kollision prüfen müssen
um zu wissen ob du den sprung beenden kannst oder nicht
du hast ja selber gesagt das deine map engine dir das zurückliefern kann -
Eigentlich doch nur bei Bewegung. D.h., ich bewege die Spielfigur nach links und es wird vor jedem mal bewegen getestet, ob die Bewegung ausgeführt werden kann.
Manchmal hat man echt \'n Brett vor dem Kopf.
Danke. Ich werde mich nochmal dransetzen.
Beitrag geändert: 26.5.2008 15:20:50 von m84 -
Normalerweise prüft man erst die Kollision, bewegt das Objekt um die Mögliche Strecke und zeichnet dann die Grafiken. Alternativ kannst und würde ich direkt nach der Eingabe die Kollision prüfen, aber das ist reine Ansichtssache ^^
-
Ich hab \'s jetzt hinbekommen.
Wenn ich z.B. auf den Boden falle, wird bevor der nächste Schritte gemacht wird, dieser erst Pixel für Pixel getestet. Falls man bei dem Test auf ein Hindernis stößt, wird der Schritt nur bis zur maximal gültigen Position ausgeführt und die Bewegung (z.B. Sprung) beendet. -
Schon mal was von Kollisionsboxen gehört?
Du musst lediglich deine aktuelle Position + Bewegungsgeschwindigkeit vorberechnen, auf kollision prüfen und bei Bedarf die Entfernung bis zur Kollision als neue Bewegung setzen, falls die ursprüngliche Bewegung im KOllisionsbereich gelandet ist. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage