PlayerX+MapX ist nämlich auch nicht die pixelgenaue Position,
wie ich gerade feststellen musste... der Wert von MapX+PlayerX
geht nur alle 3 oder 4 Pixel um eins hoch (nach meinen Eindruck)
und so kann das ja gar nicht hinhaun.
Übrigens meinte ich damit, dass nach ungefähr 12 Tiles über
die ich schon gegangen bin, erst die Variable aktualisiert wird,
keine ahnung was für einen ungeheueren Wert ich für
OffSet dann benutzen muss, 4 und 16 sind jedenfalls
eindeutig zu wenig... womit wir wieder bei der Frage des Beginns
dieses Threads wären, wie krieg ich hier denn die pixelgenaue
Position raus?
Aktueller Code:
Code: Alles auswählen
If InitSprite() And InitKeyboard() And InitMouse() = 0
MessageRequester("Error", "DirectX could not be initialized.")
End
EndIf
;- Constants
#SCREEN_X = 1024
#SCREEN_Y = 768
#SCREEN_DEPHT = 16
#TILESIZE = 32
#GFX_PATH = "Data\gfx\"
#GFX_FILETYPE = ".bmp"
#MAP_HEIGHT = 256
#MAP_LENGHT = 256
#MAP_PATH = "Data\map\"
#MAP_FILE = 0
#MAP_FILENAME = "map.cdm"
#MAP_TILESX = 32
#MAP_TILESY = 24
;- Map Array
Global Dim Map(256, 256 )
Structure Tiles
id.l
walkable.b
type.l
EndStructure
Global Dim MyTiles.Tiles(1)
MyTiles(0)\id = 0
MyTiles(0)\walkable = 0
MyTiles(0)\type = 0
MyTiles(1)\id = 1
MyTiles(1)\walkable = 1
MyTiles(1)\type = 1
;- Procedures
Procedure GFX_Load()
For id = 0 To 2
LoadSprite(id+1000, #GFX_PATH+Str(id+1000)+#GFX_FILETYPE)
Next
EndProcedure
Procedure MAP_Load()
For n=0 To 256
For t=0 To 256
Map(n, t) = MyTiles(Random(1))\id
Next
Next
EndProcedure
Macro MAP_Draw()
For SY=0 To 24
For SX = 0 To 32
DisplaySprite(Map(MapX+SX, MapY+SY)+1000, 32*SX - FineX , 32*SY - FineY )
Next SX
Next SY
EndMacro
;- Variables
PlayerX.l = 512
PlayerY.l = 320
FineStep.l = 2
TestX.l
TestY.l
TestTile.l
If OpenScreen(#SCREEN_X, #SCREEN_Y, #SCREEN_DEPHT, "")
TransparentSpriteColor(-1, RGB( 255, 0, 255 ))
GFX_Load()
MAP_Load()
LoadSprite(0, #GFX_PATH+"char.bmp")
LoadSprite(1, #GFX_PATH+"cursor.bmp")
Repeat
ExamineKeyboard()
ExamineMouse()
MausX = MouseX()
MausY = MouseY()
ActTileX = (MausX + FineX) / #TILESIZE + MapX
ActTileY = (MausY + FineY) / #TILESIZE + MapY
TestX = ( PlayerX + MapX + 4) / 32
TestY = ( PlayerY + MapY + 4) / 32
TestTile = Map( TestX, TestY )
MAP_Draw()
DisplayTransparentSprite(0, PlayerX, PlayerY)
DisplayTransparentSprite(1, MausX, MausY)
If KeyboardPushed(#PB_Key_Left)
FineX-FineStep
If FineX < 0
FineX = #TILESIZE
MapX-1
If MapX < 0
MapX = 0
FineX = 0
EndIf
EndIf
EndIf
If KeyboardPushed(#PB_Key_Right)
FineX+FineStep
If FineX > #TILESIZE - FineStep
FineX = 0
MapX+1
If MapX > #MAP_LENGHT - #TILESIZE
MapX = #MAP_LENGHT - #TILESIZE
FineX = #TILESIZE - FineStep
EndIf
EndIf
EndIf
If KeyboardPushed(#PB_Key_Up)
FineY-FineStep
If FineY < 0
FineY = #TILESIZE - FineStep
MapY-1
If MapY < 0
MapY = 0
FineY = 0
EndIf
EndIf
EndIf
If KeyboardPushed(#PB_Key_Down)
FineY+FineStep
If FineY > #TILESIZE - FineStep
FineY = 0
MapY+1
If MapY > #MAP_HEIGHT - #MAP_TILESY
MapY = #MAP_HEIGHT - #MAP_TILESY
FineY = #TILESIZE - FineStep
EndIf
EndIf
EndIf
StartDrawing(ScreenOutput())
DrawText(0, 0, "Pos: " + Str(PlayerX + MapX) + "/" + Str(PlayerY + MapY))
DrawText(0, 15, "Pos: " + Str(TestX) + "/" + Str(TestY))
DrawText(0, 30, "Col: " + Str(TestTile))
StopDrawing()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
EndIf
End
nett!