kostenloser Webspace werbefrei: lima-city


C# - Spieleprogrammierung - Kommunikation zw. Spielfigur und Map

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    m*4

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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
  4. Autor dieses Themas

    m*4

    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.
  5. 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
  6. Autor dieses Themas

    m*4

    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
  7. e********l

    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 ^^
  8. Autor dieses Themas

    m*4

    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.
  9. e********l

    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.
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!