Problem mit der Sprungfunktion bei 2D J&R

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

maerki

Betreff: Problem mit der Sprungfunktion bei 2D J&R

BeitragMi, Sep 03, 2008 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe BlitzBasic-Gemeinde!

Ich bin zufälligerweise auf BB gestossen und muss sagen, soviel Spass und Erfolg beim Programmieren hatte ich noch nie Very Happy Ich programmiere nun seit ca. 2 Monaten und habe auch schon ein kleines "Tastenhämmer-Spiel" gemacht, was für mich schon ein kleiner Erfolg war!

Nun habe ich mit einem kleinen Jump and Run à la Mario begonnen. Eine Zeit lang hatte ich auch keinerlei Probleme, doch seit ca. einer Woche bereitet mir die Sprungfunktion Sorgen. Ich habe folgende Methode gewählt:

Code: [AUSKLAPPEN]
If KeyDown (space) Then
   If jump = False
      jump = True
      Jump_Temp = 18
   EndIf
EndIf

If jump = True Then
        Jump_Temp = Jump_Temp - 0.5
        PlayerY = PlayerY + Jump_Temp
EndIf


Ich habe diese Zeilen einfach so abgetippt, das heisst wenns nicht funktioniert egal, das soll nur die Funktionsweise des Sprungs zeigen.

Rundherum um meine Figur habe ich an jeder Ecke einen Kollisions-Punkt bestimmt. Fällt nun die Figur nach dem Sprung nach unten, wird erfragt, ob einer der unteren Punkte auf einem Tile liegt, welches ein Bound beinhaltet. Da ich die Karte mit TileStudio gemacht habe, kann ich direkt über eine generierte Funktion auf die ArrayFelder und somit auf die gespeicherten Zahlen (z.B. 1 wenn an der oberen Tile-Kante ein Bound ist) zugreifen.

Wenn dort nun eine 1 ist, wird jump = 0 gesetzt.

Folgendes Problem taucht nun bei mir auf:
Da die Abfrage bei jedem Frame durchgeführt wird, kann es sein, dass die Figur einmal genau auf der Kante ist, und einmal, weil jump_temp grösser ist, ein paar Pixel unter der oberen Kante des Tile ist.

Habt ihr einen konkreten Vorschlag wie ich dieses Problem lösen kann? Ich habe es schon versucht mit einer Berechnung des Abstands "Untere Kante Figur - Obere Kante Tile" und dies dann zu PlayerY addieren. Dies führt jedoch zu einem Sprung der Figur, was nicht gerade schön aussieht. Ausserdem kann es sein, dass die Figur 32 Pixel über dem Tile ist, je nachdem wie gerundet wird.

Ich hoffe Ihr könnt mir helfen!

Viele Grüsse maerki
 

feider

ehemals "Decelion"

BeitragMi, Sep 03, 2008 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hört sich für mich so an, als würdest du erst die Figur an die von der Sprungfunktion berechnete Position setzen, die Figur dann zeichnen und erst dann an die richtige Y-Position setzen.
Wenn du die Figur an die erhöhte Y-Position setzt, bevor das Bild gezeichnet wird, sollte es zu diesem "Sprung" nicht kommen.

mfg
Dece

sheldon

BeitragDo, Sep 04, 2008 11:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hätte das mit einem Timer gemacht Wink
Die obere Kante welches Tiles überhaupt?
 

feider

ehemals "Decelion"

BeitragDo, Sep 04, 2008 12:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke, es ist das Tile gemeint, auf dem die Spielfigut landet.
Und ich wüsste nicht, wo bei meiner Lösung ein Timer ausgeschlossen ist?!?

sheldon

BeitragDo, Sep 04, 2008 13:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Woher weiß man denn, auf welchem Tile er landet?
Und ich meinte seinen Code, da sehe ich keinen Timer Wink
 

maerki

BeitragDo, Sep 04, 2008 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit der oberen Kante meine ich dort wo die Figur drauf stehen soll.

Hier mal ein Bild zur Veranschaulichung. Das Bild zeigt die Figur nachdem jump = False gesetzt wurde:

http://img152.imageshack.us/my...telez8.png

Eigentlich sollte die Figur ca 10-15 Pixel höher stehen. Das mit dem zuerst berechnen, dann Zeichnen kann sein, da ich zuerst die DrawPlayer Funktion aufrufe und erst dann die DoJump Funktion.

Wie meint ihr das mit dem Timer? Wie funktioniert das?

Liebe Grüsse

Edit: Das Bild ist ohne die Abstands-Berechnung. Mit der Abstandsberechnung steht er genau drauf, aber ist sozusagen zuerst 10 Pixel drunter und dann genau drauf. Dies erzeugt einen Sprung. Ich habe beide Funktionen vertauscht, Problem bleibt aber das selbe!

sheldon

BeitragDo, Sep 04, 2008 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
So funktioniert das mit dem Timer:

Code: [AUSKLAPPEN]

Global timer = CreateTimer()

;...

timer = MilliSecs()

Repeat
If Millisecs() = timer + [Intervall] then
If FigurY = BodenY - FigurHöhe then FigurY = FigurY + 1 ;Beispiel für Erdanziehungskraft.
;Sonstiges Bla^^
End If
Until KeyHit(1)

End
 

maerki

BeitragDo, Sep 04, 2008 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm dann heisst das also dass der Timer so ca das Gleiche macht wie wenn ich mit WaitTimer eine FPS-Begrenzung einbaue? Oder hat der Timer noch einen anderen Effekt? Was ist mit Intervall gemeint? Die Zeit in Millisekunden, in denen die Figur jeweils durch den Sprung die Position um ein paar Pixel verändert?

Liebe Grüsse

sheldon

BeitragDo, Sep 04, 2008 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
maerki hat Folgendes geschrieben:
Was ist mit Intervall gemeint? Die Zeit in Millisekunden, in denen die Figur jeweils durch den Sprung die Position um ein paar Pixel verändert?


Also mal ein Beispiel:

Programm wird gestartet.
Dann der Mainloop ausgeführt (darin befindet sich die Aktion mit dem Timer (Intervall 5 Millisekunden)).
Alles was IN ihm drin ist.
Nachdem 5 Millisekunden abgelaufen sind (Intervall), wird das Männchen ein Pixel nach unten bewegt.

Beispiel Ende...

Post Ende^^

Eingeproggt

BeitragDo, Sep 04, 2008 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
sheldon, ich sags nur ungern aber dein Code is kompletter Müll.
Jetzt mal abgesehen davon ob es bei dem Problem hilft oder nicht, hab mich ehrlich gesagt nicht vollständig damit auseinander gesetzt. Würde aber eher drauf tippen, dass die Kollisionsabfrage zu spät gemacht wird, wie Decelion schrieb.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

maerki

BeitragDo, Sep 04, 2008 19:01
Antworten mit Zitat
Benutzer-Profile anzeigen
So habs endlich geschafft! Und zwar mit einer simplen Lösung: Anstatt das Jump_Temp direkt zu addieren, habe ich einfach eine For-Schleife genommen, die Jump_Temp-Mal durchgeführt wird. Jedes mal wird 1 Pixel addiert. Sobalg Jump_Temp negativ ist, wird im Schleifenkopf Jump_Temp einfach mit -1 multipliziert, damit die Schleife noch richtig funktioniert. Mit negativen Zahlen gehts ja nicht Very Happy

Allerdings hatte ich weiterhin ein Problem mit dem Boden... wieder war der Spieler drunter. Solange bis ich erkannt habe, dass die Funktion tile_drunter mit einem aktuellen PlayerY-Wert laufen sollte und nicht mit dem, der vor der Jump-Funktion angenommen wird. PlayerY wird ja in jedem Schleifendurchgang geändert, die Funktion rechnet aber immer noch mit dem von vorhin (Da ich PlayerY direkt in die Funktion geschrieben und nicht übergeben habe).

Hauptsache nun funktionierts, ich bedanke mich für die Hilfe, vor allem das mit der Abfrage/Figur zeichnen hat den Ausschlag gegeben

Liebe Grüsse

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group