Flüssige Bewegung Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Sterbendes Lüftlein

Betreff: Flüssige Bewegung Problem

BeitragSo, März 06, 2011 12:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt

Holzchopf

Meisterpacker

BeitragSo, März 06, 2011 12:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm. Was genau soll denn daran nicht funktionieren? Bremsen ist das selbe wie Beschleunigen gegen die Fahrtrichtung. Wenn du also quasi stillstehst, wird das "Bremsen" bewirken, dass du plötzlich nach "hinten" fährst.

Ich denke, dass, was du vorhast (Bremsen bis zum Stillstand und nicht weiter, richtig?), ist gar nicht so einfach umsetzbar. Du müsstest einen Status einführen, der besagt, ob du nun bremst oder nicht (je Richtung). Wenn dieser false ist darf die Geschwindigkeit in entgegengesetzte Richtung grösser als 0 werden, sonst wird bei 0 abgeklemmt. Er wird true, wenn du zB in +x fährst (x-Geschwindigkeit >0) und die -x Taste anhaust, und false, wenn weder +x noch -x Taste gedrückt sind.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

BlitzMoritz

BeitragSo, März 06, 2011 13:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, Totensturm.
Erst einmal weiß ich nicht, warum du FlushKeys() am Anfang deiner Schleife stehen hast - da werden doch ständig ALLE Eingaben gelöscht.
Und was klappt denn beim Bremsen nicht? Ich nehme an, dein Bild bleibt nicht stehen, sondern rutscht weiter "zurück", obwohl du nichts mehr machst.
Das liegt daran, dass deine Float-Variablen nicht, wie du dir wünschst, bei einem exakten Vielfachen von 0.1 bleiben, sondern ungenau werden: Addiere zwanzigmal 0.1 dazu und subtrahiere sie wieder, schwupps bist du bei 0.099999... und danach bei einer negativen Zahl gelandet und deine Bedingung > 0 greift nicht mehr. Abhilfe? Nimm z.B. für die Speed-Variablen lieber Integer-Größen
Code:
PLAYER_SPEED_RIGHT% = PLAYER_SPEED_RIGHT% - 1

und verkleinere sie beim echten Bewegen mit einem Float-Verkleinerungsfaktor
Code:
PLAYER_X# = PLAYER_X# + 0.1 * PLAYER_SPEED_RIGHT%
  • Zuletzt bearbeitet von BlitzMoritz am So, März 06, 2011 13:15, insgesamt 2-mal bearbeitet
 

Sterbendes Lüftlein

BeitragSo, März 06, 2011 13:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt
 

Sterbendes Lüftlein

BeitragSo, März 06, 2011 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Text entfernt

BlitzMoritz

BeitragSo, März 06, 2011 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Irgendwie verpassen wir ständig unsere Edits und ich antworte 2 Sekunden zu spät Rolling Eyes
Oben siehst du es ja: ich hab' ein paar Codezeilen ergänzt. Smile
  • Zuletzt bearbeitet von BlitzMoritz am So, März 06, 2011 15:16, insgesamt einmal bearbeitet
 

Jumper

BeitragSo, März 06, 2011 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
So geht's auch mit Float. Das Image bremst bis zum Stillstand, wenn keine der Pfeiltasten gedrückt wird.

BlitzBasic:
Global IMG = LoadImage("bild.png")

Global FPS_TIMER = CreateTimer(58)
Global PLAYER_X# = 20
Global PLAYER_Y# = 20
Global PLAYER_SPEED_X# = 0
Global PLAYER_SPEED_Y# = 0
Global PLAYER_SPEED_X_Old# = 0
Global PLAYER_SPEED_Y_Old# = 0

Repeat
Cls
If KeyDown(200)
PLAYER_SPEED_Y = PLAYER_SPEED_Y - 0.1
EndIf
If KeyDown(208)
PLAYER_SPEED_Y = PLAYER_SPEED_Y + 0.1
EndIf
If KeyDown(203)
PLAYER_SPEED_X = PLAYER_SPEED_X - 0.1
EndIf
If KeyDown(205)
PLAYER_SPEED_X = PLAYER_SPEED_X + 0.1
EndIf
If PLAYER_SPEED_Y = PLAYER_SPEED_Y_Old
If PLAYER_SPEED_Y > 0
PLAYER_SPEED_Y = PLAYER_SPEED_Y - 0.1
ElseIf PLAYER_SPEED_Y < 0
PLAYER_SPEED_Y = PLAYER_SPEED_Y + 0.1
EndIf
If Abs(PLAYER_SPEED_Y) < 0.1 Then PLAYER_SPEED_Y = 0
EndIf
If PLAYER_SPEED_X = PLAYER_SPEED_X_Old
If PLAYER_SPEED_X > 0
PLAYER_SPEED_X = PLAYER_SPEED_X - 0.1
ElseIf PLAYER_SPEED_X < 0
PLAYER_SPEED_X = PLAYER_SPEED_X + 0.1
EndIf
If Abs(PLAYER_SPEED_X) < 0.1 Then PLAYER_SPEED_X = 0
EndIf
PLAYER_SPEED_Y_Old = PLAYER_SPEED_Y
PLAYER_SPEED_X_Old = PLAYER_SPEED_X
PLAYER_X = PLAYER_X + PLAYER_SPEED_X
PLAYER_Y = PLAYER_Y + PLAYER_SPEED_Y
DrawImage(IMG,PLAYER_X,PLAYER_Y)
WaitTimer(FPS_TIMER)
Flip(0)
Until KeyHit(1)

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group