Seite 3 von 3

Verfasst: 28.02.2008 16:59
von Rubiko
Dann stimmt was mit meinen Werten nicht.
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 
@#NULL: Wenn es dir nichts ausmacht.... wäre
nett!

Verfasst: 28.02.2008 18:52
von #NULL
>> ..geht nur alle 3 oder 4 Pixel um eins hoch
das hängt ja auch von deiner player-geschwindigkeit ab. wenn du den player in 2-pixel-schritten laufen läßt, dann kann er auch nur auf jedem zweiten pixel stehen. (ich weiß nicht welchen code du damit meinest, in dem aus dem anderen thread bewegt sich der spieler immer um zwei pixel - siehe 'speed=2' in procedure Steuerung())

hier nochmal der andere code. ich hab noch playerI/K für die map hinzugefügt. (in 'test_new.pb')
- test.zip -

Verfasst: 28.02.2008 19:02
von Rubiko
Erstmal vielen Dank fürs hochladen...
was ich aber meinte, ich hab nen Speed von 2, sollte mich
wie zu erwarten aber dann auch um 2 Pixel bewegen, drücke
ich allerdings nur ganz kurz auf die Taste, bewegt sich die Figur,
aber die Spielerkoordinate (MapX+PlayerX) ändert sich nicht!

Ich denk also, dass irgendwas an der Berechnung der pixelgenauen
Koordinaten falsch ist

Verfasst: 28.02.2008 19:21
von #NULL
in deinem fall müsste es das sein:

Code: Alles auswählen

       PlayerX_map = PlayerX + MapX*32 + FineX
       PlayerY_map = PlayerY + MapY*32 + FineY
       PlayerI_map = PlayerX_map / 32
       PlayerK_map = PlayerY_map / 32
du hattest FineX/Y vergessen.
PlayerX_map ist dann pixel-pos auf map.
PlayerI_map ist index auf map.

für die maus (feld-cursor für map) machst du das gleiche, nur dass PlayerX/Y dann MouseX/Y sein muss.

Verfasst: 28.02.2008 19:49
von Rubiko
Ah... damit wär das elendige Thema Kollision wohl
gelöst, danke!