Problem mit einer Bewegungsroutine

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Chrissa

Betreff: Problem mit einer Bewegungsroutine

BeitragDi, März 23, 2010 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute!
Ich bin gerade dabei eine Bewegungsroutine für den Spieler zu schreiben. Wenn ich irgendow hinklicke soll er sich automatisch dorthin bewegen. Die Bewegung ist aber noch nciht ganz rund und der "Spieler" bewegt sich nicht auf der Diagonale des Rechtecks, das sich bei der Bewegung ergibt... Hier der Code:

BlitzBasic: [AUSKLAPPEN]
Graphics 800,600,0,0


Global player_x =10
Global player_y =10
Global player_x_new =0
Global player_y_new =0
Global bewegung =0
Global Faktor_x_1 =0
Global Faktor_y_1 =0
Global faktor_x =0
Global faktor_y =0

While Not KeyDown(1)

mhit= MouseHit(1)
mx =MouseX()
my =MouseY()

Cls

If mhit = 1 Then
player_x_new=mx
player_y_new=my
bewegung=1
EndIf


If bewegung=1

If player_x>player_x_new
player_x=player_x-Faktor_x_1
EndIf

If player_x<player_x_new
Rechnung_x_1()
player_x=player_x+Faktor_x_1
EndIf

If player_y>player_y_new
player_y=player_y-Faktor_y_1
EndIf

If player_y<player_y_new
Rechnung_y_1()
player_y=player_y+Faktor_y_1
EndIf

EndIf

If player_x=player_x_new And player_y_player_y_new
bewegung=0
EndIf

Text player_x,player_y,"X"
Line player_x,okayer_y,player_x_new,player_y_new

Flip
Wend

Function Rechnung_x_1()

Faktor_x_1=player_x_new/player_x

End Function


Function Rechnung_y_1()

Faktor_y_1=player_y_new/player_y

End Function

Thunder

BeitragDi, März 23, 2010 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne mir jetzt genau angeschaut haben, wie du die Bewegung realisierst: Mir sind 2 Tippfehler aufgefallen( jedenfalls sieht es so aus, als wären es welche):

BlitzBasic: [AUSKLAPPEN]
If player_x=player_x_new And player_y_player_y_new ;ursprünglich
If player_x=player_x_new And player_y=player_y_new ; war so gemeint oder?


BlitzBasic: [AUSKLAPPEN]
Line player_x,okayer_y,player_x_new,player_y_new ; und das ...
Line player_x,player_y,player_x_new,player_y_new ; war sicher auch so gemeint oder?


In diesen Fällen werden von BB intern die Variablen "okayer_y" und "player_y_player_y_new" definiert und du wirst gar nicht vom Compiler gewarnt.
Das Problem mit der unrunden Bewegung habe ich auch noch nicht gelöst, aber ich denke, dass es was mit Winkelfunktionen zu tun haben könnte.

mfg Thunder


Edit: Ich schau mir gleich die ganze Routine an.

Edit2: Darth war zu schnell. Wichtig ist aber, dass du BlitzBasic dazu bringst Float zum Berechnen zu verwenden.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am Di, März 23, 2010 14:08, insgesamt 2-mal bearbeitet

Chrissa

BeitragDi, März 23, 2010 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja diese Fehler sind mir auch aufgefallen. SInd im jetzigen Code verbessert. Die Probleme sind aber immer noch die gleichen... Der Code ist ja auch so, dass ihn jeder mal ausprobieren kann. So könnt ihr vll mein Problem besser verstehn Wink

Aber danke, dass du so genau hinschaust Wink

darth

BeitragDi, März 23, 2010 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

Wenn du eine geradlinige Bewegung willst dann macht man das meistens so:

A = Spielerposition
B = Zielposition

v = Geschwindigkeit

Zuerst die Richtung:

Code: [AUSKLAPPEN]
Dx# = Bx# - Ax#
Dy# = By# - Ay#


Jetzt weiss man, in welche er gehen soll. Allerdings wäre er jetzt in einem Schritt dort. Nun kann man entweder eine konstante Geschwindigkeit (v = const), oder eine Zeit für die Bewegung angeben (v=s/t). Damit der Spieler auch linear bewegt wird, muss man den D Vektor normalisieren.

Code: [AUSKLAPPEN]
L# = Sqr(Dx*Dx + Dy*Dy) ;das ist übrigens auch die Länge der Strecke
Dx = Dx/L * v ;Strecken mit der Geschwindigkeit
Dy = Dy/L * v


Jetzt weiss man die Schrittweite. Also kann man nun den Spieler bis zum Erreichen des Ziels bewegen.

Code: [AUSKLAPPEN]
While Not AtDestination
   PlayerX = PlayerX + Dx
   PlayerY = PlayerY + Dy


Und das wäre schon alles.

MfG,
Darth
Diese Signatur ist leer.

Chrissa

BeitragDi, März 23, 2010 14:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hmm stimmt das so? wenn ja dann geht es nich...

BlitzBasic: [AUSKLAPPEN]
AppTitle "test"

Graphics 800,600,0,0

Global player_x =10
Global player_y =10
Global ziel_x
Global ziel_y
Global speed =3
Global x#
Global y#
Global bewegung =0
Global Strecke
Global mx
Global my

While Not KeyDown(1)

mhit = MouseHit(1)
mx = MouseX()
my = MouseY()

Cls

If mhit=1 Then

ziel_x=mx
ziel_y=my
bewegung=1

EndIf

If bewegung=1 Then

x# = ziel_x-player_x
y#= ziel_y-player_y
Strecke = Sqr(x*x + y*y)

x# = x#/Strecke*speed
y# = y#/Strecke*speed

EndIf

If player_x=ziel_x And player_y=ziel_y Then
bewegung=0
Strecke=0
x=0
y=0
EndIf

player_x=player_x+x#
player_y=player_y+y#

Text player_x,player_y,"X"
Text 50,10,x#
Text 50,30,y#

Flip
Wend


PS: Vektoren machen wir erst nächstes Jahr. Deshlab hab ich das nur zur Hälfte verstanden...


EDIT: Wie sich mit DebugLog herusstellte, bleibt x und y immer 0. Nur den Fehler, warum das so ist, finde ich nicht...


EDIT 2: Gelöst: Das problem war, dass x und y als Integer definiert waren, nicht als doubles. Warum es nicht mit Integers geht weiß ist mir unklar...
Das neue Problem: Bei jeder 2. Bewegung fängt der "Spieler an zu wackeln... Einen Toleranzbereich einzustellen geht nicht, da sonst die Bewegung dauerhaft ausgeführt wird...

Hubsi

BeitragMi, März 24, 2010 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn der Spieler im Toleranzbereich ist stellst Du ihn einfach au fdie entsprechende Fixposition.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Chrissa

BeitragMi, März 24, 2010 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
hat jemadn eine Idee wie ich dieses Gewackel, das ich jetzt habe abstellen kann? Code ist oben gepostet...

Und die zweite Sache: Geht das ganze auch flüssiger? Denn im Moment ruckelt mein "X" in der Gegend rum...

Danke schon mal für die Hilfe.

LG Chrissa

EDIT: Ich kann eben keinen Toleranzberiche einstellen. Sonst bewegt er sich ja immer weiter... Und noch was: der Wert, den ich addiere, ruckelt zwischen 3 und 3.0000?! Das ist dch das selbe oder ist letzteres einfach minimalst größer/kleiner?

Pokoyo

BeitragMi, März 24, 2010 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, bitte folgenden Code einmal verinnerlichen :

Code: [AUSKLAPPEN]
Graphics 800,600,32,0
SetBuffer BackBuffer()

Global PW#;winkel
Global PV#=0.5;geschwindigkeit
Global PX#,PY#,ZX#,ZY# ; Player/Ziel Koordinaten

While Not KeyDown(1)
   
   Cls
   If MouseHit(1)
      ZX#   =   MouseX()
      ZY#   =   MouseY()
      PW# =ATan2(PX#-ZX#, PY#-ZY#)
   EndIf
   
   If Int(px)<>Int(zx) Or Int(py)<>Int(zy) ; Ziel noch nicht erreicht
      PX#=PX#-Sin(PW#)*PV#
      PY#=PY#-Cos(PW#)*PV#
   EndIf
   
   Text px,py,"Player"
   Text zx,zy,"Ziel"
   Text MouseX(),MouseY(),"Mouse"
      
   Flip
Wend


mfg Pokoyo Smile

edit: Es hat sich ein Fehler eingeschlichen...
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax|
  • Zuletzt bearbeitet von Pokoyo am Mi, März 24, 2010 22:29, insgesamt 2-mal bearbeitet

Hubsi

BeitragMi, März 24, 2010 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Beispiel mit stark übertriebenen Werten:

Toleranz = +/- 2

Code: [AUSKLAPPEN]
if spieler_rennt_rum then
  if pos_ist > pos_ziel - 2 and pos_ist < pos_ziel + 2 then
    pos_ist = pos_ziel
    spieler_rennt_rum=false
  endif
endif


Oder meintest Du etwas ganz anderes? Dann vergiss den Quatsch einfach Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Chrissa

BeitragDo, März 25, 2010 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
@pokoyo: Die Routine funktioniert nicht ganz. Es kommt vor, dass der Spieler über das Ziel hinaus schießt... Würde es gerne über Winkelfunktionen machen, aber das ist mir noch etwas zu hoch bzw. ich verstehs noch nicht so ganz...

@Hubsi: Ich habe jetzt mal einen minimalen Spielraum von 0,0001 reingemacht und auch mal auf 0,001 vergrößert, aber das bringt leider nichts...

TimBo

BeitragDo, März 25, 2010 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst ja "cheaten" und sagen , dass wenn der Abstand x und y jeweils in einem bestimmten Bereich ist, dass dann der Gamer automatisch ans Ziel versetzt wird. Very Happy
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

mpmxyz

BeitragDo, März 25, 2010 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Nutze darths Lösungs und erweitere sie leicht:
BlitzBasic: [AUSKLAPPEN]
If aktuellerAbstand>GrößeDerGeschwindigkeit
Position=Position+Geschwindigkeit ;normale Bewegung
Else ;Die normale Bewegung würde jetzt "überschwingen".
Position=Zielposition
Geschwindigkeit=0 ;Das Ziel wurde ja erreicht.
EndIf

Das Verstehen von darths Code kommt bestimmt noch. Smile
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Chrissa

BeitragDo, März 25, 2010 15:07
Antworten mit Zitat
Benutzer-Profile anzeigen
habe ich gemacht, aber er hopst immer noch rum!?!

Hier der Code:
BlitzBasic: [AUSKLAPPEN]
AppTitle "test"

Graphics 800,600,0,0

Global player_x =10
Global player_y =10
Global ziel_x
Global ziel_y
Global speed# =2.5
Global x#
Global y#
Global bewegung =0
Global Strecke
Global mx
Global my

While Not KeyDown(1)

mhit = MouseHit(1)
mx = MouseX()
my = MouseY()

Cls

If mhit=1 Then

ziel_x=mx
ziel_y=my
bewegung=1

EndIf

If bewegung=1 Then

x# = ziel_x-player_x
y#= ziel_y-player_y
Strecke = Sqr(x*x + y*y)

x# = x#/Strecke*speed#
y# = y#/Strecke*speed#


player_x=player_x+x#
player_y=player_y+y#

EndIf

If player_x=ziel_x And player_y=ziel_y Then
bewegung=0
Strecke=0
x=0
y=0
player_x=ziel_x
player_y=ziel_y
EndIf



Text player_x,player_y,"X" ;Das hier mit DrawImage() ersetzen bzw. mit der Animation

Flip
Wend

TimBo

BeitragDo, März 25, 2010 15:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Stichwort : Pythaguras

Wurzel ( xabs² + yabs² ) = Abstand von 2 Punkten
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Xeres

Moderator

BeitragDo, März 25, 2010 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Deine Strecke ist kein Float - das kann beim teilen und multiplizieren unangenehm auffallen.

Edit: Und um Glatte Bewegungen zu bekommen, müssen die Positionen auch Nachkommastellen bekommen:
BlitzBasic: [AUSKLAPPEN]
AppTitle "test"

Graphics 800,600,0,2

Global player_x# =10
Global player_y# =10
Global ziel_x#
Global ziel_y#
Global speed# =0.125
Global x#
Global y#
Global bewegung =0
Global Strecke#
Global mx
Global my

While Not KeyDown(1)

mhit = MouseHit(1)
mx = MouseX()
my = MouseY()

Cls

If mhit=1 Then

ziel_x=mx
ziel_y=my
bewegung=1

EndIf

If bewegung=1 Then

Color(255,0,0)
Oval(ziel_x-4,ziel_y,16,16,False)

x# = ziel_x-player_x
y#= ziel_y-player_y
Strecke = Sqr(x*x + y*y)

x# = x#/Strecke*speed#
y# = y#/Strecke*speed#


player_x=player_x+x#
player_y=player_y+y#

EndIf

If player_x=ziel_x And player_y=ziel_y Then
bewegung=0
Strecke=0
x=0
y=0
player_x=ziel_x
player_y=ziel_y
EndIf


Color(255,255,255)
Text player_x,player_y,"X" ;Das hier mit DrawImage() ersetzen bzw. mit der Animation

Flip
Wend
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am Do, März 25, 2010 15:19, insgesamt einmal bearbeitet

Chrissa

BeitragDo, März 25, 2010 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
@TimBo: Soll ich das dann da einfügung wo Strecke berechnet wird? Im Prinzip ist das ja aber das selbe...

@Xeres: Ist jetzt ein Float, ändert aber nichts.


@all: Er ruckelt jetzt nicht mehr. Nur die Bewegung ist so gesamt unflüssig. Liegt das an der Art, wie ich das mache oder kann man da noch etwas optimieren?

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group