Problem mit der Sprungfunktion bei 2D J&R
Übersicht

maerkiBetreff: Problem mit der Sprungfunktion bei 2D J&R |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo liebe BlitzBasic-Gemeinde!
Ich bin zufälligerweise auf BB gestossen und muss sagen, soviel Spass und Erfolg beim Programmieren hatte ich noch nie ![]() 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 |
||
feiderehemals "Decelion" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hätte das mit einem Timer gemacht ![]() Die obere Kante welches Tiles überhaupt? |
||
feiderehemals "Decelion" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Woher weiß man denn, auf welchem Tile er landet?
Und ich meinte seinen Code, da sehe ich keinen Timer ![]() |
||
maerki |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group