Objekte in xx Milisekunden xx Pixel bewegen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Düsi

Betreff: Objekte in xx Milisekunden xx Pixel bewegen

BeitragMo, Aug 03, 2009 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Moin,
ich bin gerade bei einer Bewegungsroutine eines Netzwerkspieles.
Vorweg: Das Spiel basiert auf einer Tilemap mit 32x32px größe.

So, nun zum Problem. Ich dachte mir, dass wenn sich ein Spieler zum nächsten Tile bewegen möchte, schickt er ein Paket alâ
Zitat:
TileX <-- = |
TileY <-- = Tile, zu dem sich der Spieler bewegt
MoveTime <-- Zeit, die ihm zum Bewegen bleibt, also Millisecs()+Zeit zum bewegen

Somit weiß dann ja jeder Spieler, bis zu welchem Zeitpunkt der Spieler an der Position sein muss und kann ihn dann in entsprechender Geschwindigkeit dorthin bewegen... Und genau das will einfach nicht so recht klappen. :/
Jeder Spieler weiß also über den zu bewegenden Spieler ->
Zitat:
Aktuelle Position
Position, die erreicht werden muss
Verbleibende Zeit zum bewegen

und mein Ansatz dazu ->
Code: [AUSKLAPPEN]
   If object_moveTime <> 0 Then
      ; Zeit
      objectMoveTime = object_moveTime-MilliSecs() ; (die verbleibende zeit)
      If objectMoveTime < 0 Then
         objectMoveTime = Abs(objectMoveTime)
      EndIf
      If objectMoveTime = 0 Then
         objectMoveTime = 1
      EndIf
      
      ; Differenz berechnen
      objectDiffX# = object_moveToPosX - object_posX# ; objectDiffX -> differenz, object_moveToPosX -> die position die erreicht werden mus, object_posX -> die aktuelle position
      objectDiffY# = object_moveToPosY - object_posY#
      If objectDiffX# <> 0 Then objectMoveX# = objectDiffX# / objectMoveTime
      If objectDiffY# <> 0 Then objectMoveY# = objectDiffY# / objectMoveTime
      
      ; Ausgabe
      DebugLog "Differenzen: "+objectDiffX#+"|"+objectDiffY#+" in "+objectMoveTime
      DebugLog "Bewege "+objectMoveX#+"|"+objectMoveY#
      
      ; Bewegen
      If objectDiffX# <> 0 Then
         object_posX# = object_posX# + objectMoveX#
      EndIf
      If objectDiffY# <> 0 Then
         object_posY# = object_posY# + objectMoveY#
      EndIf
   EndIf

   ; Zeiten zurücksetzten
   If object_moveTime-MilliSecs() <= 0 And object_moveTime <> 0 Then
      object_moveTime = 0
   EndIf


So, die Ausgabe sieht ddann in etwa so aus...
Zitat:
Position: 10.0|4.0
Differenzen: 0.0|-1.0 in 93
Bewege -0.0107527
Differenzen: 0.0|-0.989247 in 66
Bewege -0.0149886
Differenzen: 0.0|-0.974259 in 33
Bewege -0.029523
Differenzen: 0.0|-0.944736 in 1
Bewege -0.944736
Zeit zurückgesetzt

Das stimmt dann zwar im Endeffekt einigermaßen, aber die Geschwindigkeit ist alles andere als Konstant. Sad

Wüsste da jemand eine bessere Möglichkeit, das ganze zu lösen ?

Holzchopf

Meisterpacker

BeitragMo, Aug 03, 2009 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Position: 10.0|4.0
Differenzen: 0.0|-1.0 in 93
Bewege -0.0107527
Differenzen: 0.0|-0.989247 in 66
Bewege -0.0149886
Differenzen: 0.0|-0.974259 in 33
Bewege -0.029523
Differenzen: 0.0|-0.944736 in 1
Bewege -0.944736
Zeit zurückgesetzt


Du solltest die Differenz nicht nur durch die Soll-Zeit teilen, sondern auch noch mit der Ist-Zeit multiplizieren. Verstehst du was ich meine? Du berechnest die Geschwindigkeit in Pixel/Millisekunde, wendest sie aber nur einmal an, also, als ob es Pixel/Frame wäre. Du musst also die Geschwindigkeit noch mit Millisekunden/Frame multiplizieren.

mfG

Edit
Ausserdem brauchst du die Geschwindigkeit ja nur einmal auszurechnen, da sie ja konstant bleiben soll =)
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
 

Düsi

BeitragMo, Aug 03, 2009 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Dankeschön Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group