Problem mit fliessender Tilesetbewegung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Problem mit fliessender Tilesetbewegung

BeitragMi, Dez 07, 2005 3:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ihr lieben, hier stelle ich mal eine kleine Frage an euch. Ich habe mal vor Jahren ein Spiel in BB angefangen und letztendlich scheiterte es u.a. an einem Problem. Unten im Code habe ich ein modifizierten Programmausschnitt (voll funktionsfähig ohne Laden von Bildern), welcher es ermöglicht mit der Maus fliessend in einer Tilemap zu wandern. Mein Problem ist allerdings (kommt selten vor), wenn die Positionskoordinaten ganz nahe zwischen zwei Tiles liegen (also ein Tilesprung/verschiebung bevor steht) dann kommt es manchmal zu falschen Rechnung. Sorry kann es nicht besser beschreiben. Man kann es selber mal ausprobieren, wenn man die Maus so positioniert, bis keine Bewegung mehr vorhanden ist und dann Space drückt. Wenn man dann langsam zur Seite geht springt manchmal die gesammte Tilemap um ein Tile zur Seite. In meinem Spiel kam es schon des öfteren vor, daß dann mein Raumschiff in der Wand drin steckte und bedingt einer Kollisionsprüfung beschädigt wurde. Der Fehler liegt an Rundungsfehlern von 'Mod'. Habe bereits diesen Befehl durch 'Int' und weiteren Berechnungen selber durchgeführt. Das Ergebnis war das selbe. Kennt jemand das Problem und kann es mir mal beschreiben oder muß ich wirklich annährende Nullwerte mit 0.0001 Addieren?

EDIT: Hier die korregierte Fassung
Code: [AUSKLAPPEN]
;Grafik setzten
Graphics 320,320,0,2
SetBuffer BackBuffer()

;Variablen festlegen
Dim xy%(99,99)   ;Spielfeldspeicher mit 100*100 Tiles
rxp#=1000   ;X-Position im Spielfeld
ryp#=1000   ;Y-Position im Spielfeld
dvx%=0   ;X-Faktor für Tileverschiebung
dvy%=0   ;Y-Faktor für Tileverschiebung
tpx%=0   ;X-Faktor für Dim-Tilesprung
tpy%=0   ;Y-Faktor für Dim-Tilesprung
mxp#=0   ;X-Position Maus
myp#=0   ;Y-Position Maus

;Felder
For y=0 To 99
 For x=0 To 99
  If Rand(0,10)>8 Then xy(x,y)=Rand(1,6)
 Next
Next

;Rahmen
For q=0 To 99
 xy(0,q)=6
 xy(q,0)=6
 xy(99,q)=6
 xy(q,99)=6
Next




;Hauptroutine
While Not KeyHit(1)

 ;Rechne
 mxp=MouseX()
 myp=MouseY()
 rxp=rxp-(160-mxp)/20
 ryp=ryp-(160-myp)/20
 If rxp<0 Then rxp=0
 If ryp<0 Then ryp=0
 If rxp>2943 Then rxp=2943
 If ryp>2943 Then ryp=2943
 dvx=rxp Mod 32
 dvy=ryp Mod 32
 tpx=Floor(rxp/32)
 tpy=Floor(ryp/32)

 ;Mit Space zwischen Nullwerten legen
 If KeyDown(57) Then rxp=320:ryp=320

 ;Tiles
 For y=0 To 8
  For x=0 To 8
   Color xy(x+tpx,y+tpy)*32,0,0
   Rect 32+x*32-dvx,32+y*32-dvy,32,32,1
  Next
 Next

 ;Info
 Color 255,255,255
 Rect 32,32,256,256,0
 Text 0,0,rxp
 Text 0,16,ryp
 Flip
 Cls
Wend
End
  • Zuletzt bearbeitet von hectic am Mi, Dez 07, 2005 15:47, insgesamt einmal bearbeitet

x-pressive

BeitragMi, Dez 07, 2005 11:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du schon mal probiert, mit Floor() abzurunden bzw. mit Ceil() aufzurunden? Int rundet ja bis .5 ab und darüber auf. Floor rundet IMMER ab und Ceil rundet IMMER nach oben.
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Dez 07, 2005 15:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh man Shocked bin ich blöd! Wie konnte ich das nur übersehen?! Dabei habe ich gestern erst einem Beitrag in diesem Forum noch über Floor/Ceil und Int berichtet. Danke, jetzt funzt es wunderbar!

Habe folgende Zeilen:Code: [AUSKLAPPEN]
 tpx=(rxp+16)/32
 tpy=(ryp+16)/32

Durch diese ersetzt:Code: [AUSKLAPPEN]
 tpx=Floor(rxp/32)
 tpy=Floor(ryp/32)

Der korregierte Code ist im vorigem Beitrag jetzt funktionsfähig! Jetzt steht dem Entwickeln des Spiels wieder nichts mehr im Wege. Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group