flüssige Tilebewegung Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bloxel93

Betreff: flüssige Tilebewegung Problem

BeitragSo, Mai 13, 2012 11:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo mal wieder,
Ich hab mich jetzt ein wenig mit Tiles beschäftigt und bin nun soweit, dass ein Spieler eine flüssige bewegung von Tile zu Tile macht sofern die entsprechende Taste drückt. Allderdings hab ich da ein kleines Problem und zwar wenn man nach links und nach oben drückt stoppt der spieler nicht im nächsten tile sondern läuft unendlich weiter Hier der Code:

Code: [AUSKLAPPEN]
xmax=800
ymax=600
Graphics xmax,ymax,32,2
SetBuffer BackBuffer()


Dim map(mapx,mapy,1)

Const tilesize   = 30
Const mapy      = 100
Const mapx      = 100

Global      Spieler   =LoadImage("Graphiken\Spieler.bmp")
MidHandle   Spieler
MaskImage   Spieler   ,255,255,255

Global      Erde   =LoadImage("Graphiken\Erde.bmp")
MidHandle   Erde
MaskImage   Erde   ,255,255,255

Global      Maus   =LoadImage("Graphiken\Maustile.bmp")
MidHandle   Maus
MaskImage   Maus   ,255,255,255

Global SpielerX = 1, SpielerY = 1
Global frametimer = CreateTimer(60)

Repeat
WaitTimer frametimer

For x=0 To mapx
   For y=0 To mapy
      DrawImage Erde, x*tilesize, y*tilesize
   Next
Next


DrawImage Spieler, SpielerimgX, SpielerimgY

If KeyDown(205) Then
   MoveSpx = 1
EndIf
If KeyDown(203) Then
   MoveSpx = -1
EndIf
If KeyDown(208) Then
   MoveSpy = 1
EndIf
If KeyDown(200) Then
   MoveSpy = -1
EndIf

If MoveSpx = 1 Then
   SpielerimgX = SpielerimgX+1
   If SpielerimgX/tilesize = SpielerX Then
      SpielerX = SpielerX+1
      MoveSpx=0
   EndIf
ElseIf MoveSpx = -1 Then
   SpielerimgX = SpielerimgX-1
   If SpielerimgX/tilesize = SpielerX Then
      SpielerX = SpielerX-1
      MoveSpx=0
   EndIf
End If 



If MoveSpy = 1 Then
   SpielerimgY = SpielerimgY+1
   If SpielerimgY/tilesize = SpielerY Then
      SpielerY = SpielerY+1
      MoveSpy=0
   EndIf
ElseIf MoveSpy = -1 Then
   SpielerimgY = SpielerimgY-1
   If SpielerimgY/tilesize = SpielerY Then
      SpielerY = SpielerY-1
      MoveSpy=0
   EndIf
EndIf





Text 10, 10, "SpielerX "+SpielerX
Text 10, 30, "SpielerY "+SpielerY
Text 10, 50, "Movespx"   +MoveSpx
Text 10, 70, "Movespy"   +MoveSpy

Flip(0)
Cls
Until KeyHit(1)
End 


Das Problem ist dass wenn ich einmal links oder einmal oben drücke, dass dann der Movespx bzw "spy nicht mehr auf 0 zurückgeht und beide -1 bleiben. Bei den +1 für unten und rechts funktioniert es. Der Code ist jetzt nicht sehr schön sortiert weil das erstma son test ist.
Hoffe ihr könnt mir helfen
 

feider

ehemals "Decelion"

BeitragSo, Mai 13, 2012 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin mir nicht sicher, aber:

Code: [AUSKLAPPEN]
ElseIf MoveSpx = -1 Then
   SpielerimgX = SpielerimgX-1
   If SpielerimgX/tilesize = SpielerX Then
      SpielerX = SpielerX-1
      MoveSpx=0
   EndIf
End If

SpielerimgX/tilesize wird ja schon SpielerX, wenn es nach rechts bewegt wird.
versuchs mal mit:

Code: [AUSKLAPPEN]
ElseIf MoveSpx = -1 Then
   SpielerimgX = SpielerimgX-1
   If SpielerimgX/tilesize = SpielerX-1 Then
      SpielerX = SpielerX-1
      MoveSpx=0
   EndIf
End If


mfg
Dece

SpionAtom

Betreff: Mod

BeitragSo, Mai 13, 2012 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutze doch einfach mod, dann klappts!

Code: [AUSKLAPPEN]
If MoveSpx = 1 Then
   SpielerimgX = SpielerimgX+1
   ;If SpielerimgX/tilesize = SpielerX Then
   If SpielerimgX Mod tilesize = 0
      SpielerX = SpielerX+1
      MoveSpx=0
   EndIf
ElseIf MoveSpx = -1 Then
   Text 200, 0, "*"
   SpielerimgX = SpielerimgX-1
   If SpielerimgX Mod tilesize = 0
   ;If SpielerimgX/tilesize = SpielerX Then
      SpielerX = SpielerX-1
      MoveSpx=0
   EndIf
End If


If MoveSpy = 1 Then
   SpielerimgY = SpielerimgY+1
   ;If SpielerimgY/tilesize = SpielerY Then
   If SpielerimgY Mod tilesize = 0
      SpielerY = SpielerY+1
      MoveSpy=0
   EndIf
ElseIf MoveSpy = -1 Then
   SpielerimgY = SpielerimgY-1
   ;If SpielerimgY/tilesize = SpielerY Then
   If SpielerimgY Mod tilesize = 0
      SpielerY = SpielerY-1
      MoveSpy=0
   EndIf
EndIf
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

Bloxel93

BeitragSo, Mai 13, 2012 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Decelion danke für den ansatz hat aber leider nix gebracht ... vielen dank Spion atom .. den befehl kannte ich vorher garnicht damit klappt es ... ich würde nur gerne noch verstehen warum das jetzt funktioniert kannst du das vll kurz erklären ? weil so ganz kann ich mit der Definition davon unter Hilfe nichts anfangen

SpionAtom

Betreff: Erklärungsversuch

BeitragSo, Mai 13, 2012 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie die Hilfe schon sagt, Mod ist ein Operator, der den Rest einer Division zurückgibt.

Wenn du die Spielerposition durch die Tilegröße dividierst, kann entweder der Rest 0 rauskommen (dann geht die Division glatt auf), oder der Rest liegt zwischen 1 und Tilegröße-1.

Und jedesmal wenn Rest 0 rauskommt, ist die Spielerposition gerade auf einem neuen Tile angekommen. Dabei spielt die Richtung, aus der der Spieler kommt, keine Rolle.

Code: [AUSKLAPPEN]
Tilegröße: 5

SpielerpositionX:               0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20
SpielerpositionX MOD Tilegröße: 0   1   2   3   4   0   1   2   3   4   0   1   2   3   4   0   1   2   3   4   0
(also der Rest der Division)


man sieht, dass die null regelmäßig mit dem Abstand der Tilegröße auftaucht. Dies kann man sich für seine Tile-Berechnungen zunutze machen.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

Bloxel93

BeitragSo, Mai 13, 2012 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah ok vielen dank Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group