Figur kommt nach dem springen nicht auf den boden

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

BlackPhönix

Betreff: Figur kommt nach dem springen nicht auf den boden

BeitragDi, Aug 11, 2009 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, dass ich mit diesem alten Problem nerve aber ich bekomme das springen einfach nich hin.
Das grundlegende hab ich jetzt verstanden und es müsste auch funktionieren(müsste), aber es klappt immer noch nicht.
Ich hab auch schon im forum gesucht aber bin nicht wirklich weiter gekommen.

Der Code müsst doch so funktionieren, oder ? :

Code: [AUSKLAPPEN]
Graphics 800,600,0,2 

SetBuffer BackBuffer()
Global y=480                   
Global x=60
x7=1
y7=-160
y1=480
x1=60
Global frametimer=CreateTimer(60)
SeedRnd MilliSecs()

AppTitle "Freddys Adventures"





Global springen, sprungdauer, sprungart
Global Hintergrund1= LoadImage  ("Freddy_Adventures_Hintergrund1.bmp") ; Um die Bilder zu laden.
Global Hero= LoadImage ("Freddy1.bmp")


Repeat

If KeyDown(200) Then y=y-1 ; Die Steuerung von Freddy.
If KeyDown(203) Then x=x-1
If KeyDown(205) Then x=x+1
If KeyDown(208) Then y=y+1

If KeyDown(203) Then x7=x7+1 ; Um die Täuschung vom laufen durch die Welt zu simulieren.
If KeyDown(205) Then x7=x7-1
If KeyDown(200) Then y7=y7+1
If KeyDown(208) Then y7=y7-1

If KeyDown(203) And KeyDown (29) Then x=x-3  ; Die Funktion zum schneller laufen.
If KeyDown(205) And KeyDown (29) Then x=x+3
If KeyDown(203) And KeyDown (29) Then x7=x7+3
If KeyDown(205) And KeyDown (29) Then x7=x7-3





; Die Funktion zum Springen(Noch nicht fertig)

If KeyHit(44) Then
 springen = True
springen = 1
End If

If springen = True Then 
 sprungart = 1
If sprungart = 1 Then
sprungdauer = sprungdauer + 1
If sprungdauer = 10 Then sprungart = 2
Else If  sprungart = 2 Then
sprungdauer = sprungdauer - 1
If sprungdauer = 0 Then springen = False
End If
End If

ClsColor 0,0,0
Cls

DrawImage Hintergrund1,x7,y7 ; Um die Bilder anzuzeigen.
DrawImage Hero,x,y-sprungdauer

Flip

Forever

 
End
Mfg Chris

ozzi789

BeitragDi, Aug 11, 2009 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Clscolor musst du nicht in der Schleife setzen solange du nichts an der Farbe änderst

2.
If KeyHit(44) Then
springen = True
springen = 1
End If

Hier setzt du springen auf 1 und dann gleich nochmal auf 1 Wink


3.
Hier ein richtiger code, nicht abschreiben sondern verstehen ^^
Code: [AUSKLAPPEN]
Graphics 640,320,32,2

x=220
y=160


SetBuffer BackBuffer()


While Not KeyHit(1)
Cls

If KeyHit(57) And springen=0 Then ;WENN LEERTASTE und wir gerade nicht am springen sind
   springen=1
End If

If springen=1
   y=y/1.1  ; da nun die leertaste gedrückt wurde machen wir Y immer kleiner
EndIf

If y=5 ; falls wir oben angekommen sind
   springen=3 ; setzen wir springen auf 3, das hat zur folge das oben nicht mer y verkleindert wird
EndIf

If springen=3 ;SONDERN
   y=y*1.11 ; das Y wieder grösser wird (die figur wieder runtergeht
EndIf

If y>160 And springen=3 ;falls wir bei 160 angekommen sind (unser "boden") und wir im fall sind (springen=3)
   springen=0 ; Springen auf 0 setzen
EndIf


If KeyDown(205) x=x+2 ;Links rechts laufen ermöglichen
If KeyDown(203) x=x-2


Line 0,180,640,180
Text 0,0," y:"+y+"  x:"+x
Rect x,y,20,20


Flip 30
Wend



Das ganze könnte man noch in eine schöne Funktion packen (der übersichtlichkeits wegen), aber das überlass ich dir Wink


mfg ozzi
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5
 

Cyderic

BeitragDi, Aug 11, 2009 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast die IF Sätze recht ungünstig zusammengeschrieben. Zumindest ich verliere komplett den Überblick. Aber wenn man das dann mal eingerückt hat, merkt man das die IF Anweisungen falsch verschachtelt sind. Wenn wir uns nun mal die Mühe geben und das doofe Then weg lassen und stat dessen lieber einen Absatz machen, sehen wir das gleich viel schöner:


BlitzBasic: [AUSKLAPPEN]
If springen = True 
sprungart = 1
If sprungart = 1
sprungdauer = sprungdauer + 1
If sprungdauer = 10
sprungart = 2
Else If sprungart = 2
sprungdauer = sprungdauer - 1
If sprungdauer = 0
springen = False
End If
End If


Nun können wir uns das vernünftig ansehen. Was steht da also...Wenn springen 1 ist dann soll sprungart auf 1 gestellt werden. Okay...wenn Sprungart 1 ist soll sprungdauer um 1 erhöht werden. Leuchtet ein...
Und jetzt kommt der Knackpunkt:
Du schreibst wenn sprugndauer 10 ist dann soll sprungart gleich 2 sein um wieder runter zu zählen. Das ist ansich richtig, aber dann schreibst du: Wenn sprungdauer NICHT 10 ist (ElseIF) dann soll sprungart 2 sein. Das ist einfach eine falsche Verschachtelung. Wenn wir das ändern und gleichzeitig Variablen sparen wollen sieht es dann so aus:

BlitzBasic: [AUSKLAPPEN]
; Die Funktion zum Springen(Fixed by Cyd)

If KeyHit(44) And sprungart=0
sprungart=1
End If

;hoch springen
If sprungart = 1
sprungdauer = sprungdauer + 1
If sprungdauer = 10
sprungart = 2
EndIf
EndIf
;wieder runter fallen
If sprungart = 2
sprungdauer = sprungdauer - 1
If sprungdauer = 0
sprungart = 0
End If
End If


PS: Zum springen ist ozzis Code natürlich geeigneter. Ich wollte dir hier aber nur einmal deinen Fehler vor Augen führen und hoffe dass du es verstanden hast Smile

BlackPhönix

BeitragDi, Aug 11, 2009 17:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, funktioniert gut.
Aber er springt zu hoch. Ich habe schon den y-wert geändert und dabei ist mir aufgefallen, dass er immer bis zum oberen Bildschirmrand hüpft egal wie ich die y-koordinate ändere.
Der sprung fängt halt nicht unten an.(Ich könnte ihn unten anfangen lassen, aber dann ist mein hintergrund nicht mehr ganz im bild)
Danke für rückmeldungen.
Mfg Chris

faeX

BeitragMi, Aug 12, 2009 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Lösung von ozzi finde ich fragwürdig, ehrlich gesagt... Wink

Ich an deiner Stelle würde sowas machen:
Arrow Wenn die Leertaste gedrückt wurde und wir den Boden berühren, wird die Sprunggeschwindigkeit auf z.B. 4 gesetzt
Arrow Der Spieler wird um die Sprunggeschwindigkeit auf der Y-Achse bewegt
Arrow Sprunggeschwindigkeit wird um z.b. 0.5 reduziert
Arrow Und alles wieder von vorne

BlitzBasic: [AUSKLAPPEN]

Graphics 640, 480, 32, 2
SetBuffer BackBuffer()

Global FreddyX#, FreddyY# ; Nimm lieber Floats, die werden beim zeichnen sowieso gerunden
Global Sprunggeschwindigkeit#

Const Gravitation# = .2
Const Sprungkraft# = 8

Global Timer = CreateTimer(60)

FreddyX = GraphicsWidth()/2
FreddyY = GraphicsHeight()/2 ; in die Bildschirmmitte!

Repeat

FreddyX = FreddyX + 3*(KeyDown(205) - KeyDown(203))

AufDemBoden% = (FreddyY >= GraphicsHeight() - 10)

FreddyY = FreddyY - Sprunggeschwindigkeit
Sprunggeschwindigkeit = Sprunggeschwindigkeit - Gravitation

If AufDemBoden Then

Sprunggeschwindigkeit = 0 ; Nicht mehr fallen
FreddyY = GraphicsHeight() - 10 ; Auf den Boden

EndIf

If KeyHit(57) Then

If AufDemBoden Then

Sprunggeschwindigkeit = Sprungkraft
FreddyY = FreddyY - Sprunggeschwindigkeit

EndIf

EndIf

; Freddy zeichnen Wink
Cls

Text 0, 0, "AufDemBoden: " + AufDemBoden

Oval FreddyX - 16, FreddyY - 16, 32, 32
Flip

Until KeyHit(1)


Spiel mit den Konstanten ein bisschen rum, dieser Sprung ist um einiges bequemer und realistischer als die andere Lösung Wink

ozzi789

BeitragMi, Aug 12, 2009 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@faeX
Naja das ist wohl geschmackssache Rolling Eyes
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group