Problem mit fliessender Tilesetbewegung
Übersicht

![]() |
hecticSieger des IS Talentwettbewerb 2006Betreff: Problem mit fliessender Tilesetbewegung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Oh man ![]() 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. ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group