Char Bewegung in einem RPG

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: Char Bewegung in einem RPG

BeitragSa, Jan 28, 2012 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
hi leute, mein problem besteht darin die camera richtig zu positioneren.
die camera soll das tile erst dann malen wenn der char die mitte des bildes erreicht oder überschritten hat...

ich finde kein ansatz....

Code: [AUSKLAPPEN]
Graphics 1920, 1080, 1
Global ScreenWidth:Int = GraphicsWidth() / 32
Global ScreenHeight:Int = GraphicsHeight() / 32

SeedRnd MilliSecs()

Global TileSetz:TImage = LoadAnimImage("Data\Tiles.bmp", 32, 32, 0, 3)

Global camx
Global camy
Global cam_speed = 1
Global tilemap:Int[1000, 1000, 3]

Global MX:Int = MouseX()
Global MY:Int = MouseY()
Global MouseTile_0:Int
Global MouseTile_1:Int
Global MouseTile_2:Int

Global PlayerX:Int
Global playerY:Int
 
For x = 0 To 999
     For y = 0 To 999
       sTileImage = Rnd(2)
      
      If sTileImage = 0 Then tilemap(x, y, 0) = 1
      If sTileImage = 1 Then tilemap(x, y, 0) = 2
     Next
Next





SetColor 255,255,255
'Die Hauptschleife
While Not KeyHit(KEY_ESCAPE)
   Cls
   Cam_Control()
      GetMouse()
   DrawTileMap()
   DrawPlayer()
      DrawText "Cam: " + camx + " X  | " + camy + " Y  Mouse: " + MX + " X  | " + MY + " Y  | Tile: Ebene 0=" + MouseTile_0 + " Ebene 1=" + MouseTile_1 + " Ebene 2=" + MouseTile_2 + "  | Player:" + PlayerX + " X |" + playerY + " Y", 0, 0
      Flip
Wend
EndGraphics
End

Function DrawPlayer()
   DrawRect PlayerX, playerY, 32, 32
End Function

Function GetMouse()
   MX:Int = MouseX() / 32 + camx
   MY:Int = MouseY() / 32 + camy
   
   MouseTile_0 = tilemap(MX, MY, 0)
   MouseTile_1 = tilemap(MX, MY, 1)
   MouseTile_2 = tilemap(MX, MY, 2)
End Function

Function DrawTileMap()
    xt:Int = 0
      yt:Int = 0
      For x = camx To camx + ScreenWidth
         For y = camy To camy + ScreenHeight
         For h = 0 To 2
               DrawImage TileSetz, xt * 32, TextHeight("W") + yt * 32, tilemap(x, y, h)
            Next
          yt = yt + 1
         Next
        xt = xt + 1
        yt = 0
      Next
End Function


Function Cam_Control()
   'Die Kamera wird hier mit Pfeiltasten gesteuert, Q und A beeinflussen den Speed
   If KeyDown(KEY_LEFT) Then
      PlayerX = PlayerX - 1
      End If
      If KeyDown(KEY_RIGHT) Then
      PlayerX = PlayerX + 1
      End If
      If KeyDown(KEY_UP) Then
      playerY = playerY - 1
      End If
      If KeyDown(KEY_DOWN) Then
      playerY = playerY + 1
      End If
       

'hier soll die genaue cam position um den char ermittelt werden.
   camx = PlayerX - ScreenWidth / 2 * 32
   
   If camx < 0 Then camx = 0
      If camy < 0 Then camy = 0
      If camx > 999 - ScreenWidth Then camx = 999 - ScreenWidth
      If camy > 999 - ScreenHeight Then camy = 999 - ScreenHeight
End Function



welche rechnung muss ich nehm damit mein zeil erreicht werden kann, derzeit habe ich das hier
Code: [AUSKLAPPEN]
camx = PlayerX - ScreenWidth / 2 * 32

Jolinah

BeitragSa, Jan 28, 2012 5:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Ansatz ist soweit richtig, wahrscheinlich nur ein Fehler in der Formel (etwas umgeformt?)

Versuchs mal mit:

Code: [AUSKLAPPEN]
camx = (PlayerX - ScreenWidth / 2) / 32


Im Prinzip zieht man von der Spielerposition die Hälfte des Screens ab, das ist da wo die Darstellung der Tiles starten müsste, damit der Spieler in der Mitte ist (Pixel-Wert). Wenn man das ganze noch durch 32 teilt, erhält man wiederum den Rasterwert.

Die Formel oben kommt von diesem Ansatz hier:

Code: [AUSKLAPPEN]
RasterX = PlayerX / 32
AnzahlTilesX = ScreenWidth / 32
HalbeAnzahlTilesX = AnzahlTilesX / 2
camx = RasterX - HalbeAnzahlTilesX


Oder anders geschrieben:

Code: [AUSKLAPPEN]
camx = PlayerX / 32 - (ScreenWidth / 32) / 2


Und wenn man das vereinfacht kriegt man die 1. Formel ganz oben Wink

Mathias-Kwiatkowski

BeitragSo, Jan 29, 2012 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
ja auf die idee bin ich auch gekomm, nur leider funktioniert es nicht, irgendwann is der char ausser bild und die map noch lang nich am ende ^^

Jolinah

BeitragSo, Jan 29, 2012 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich baue persönlich meistens einen Pixel-Scrollwert ein:

Code: [AUSKLAPPEN]
Local scrollX:Float = 0

...

startx = scrollX / 32
endx = (scrollX + screenWidth) / 32

If startx < 0 Then startx = 0
If startx >= mapSizeX Then startx = mapSizeX - 1
If endx < 0 Then endx = 0
If endx >= mapSizeX Then endx = mapSizeX - 1

For Local x:Int = startx To endx
   DrawImage ... x * 32 - scrollX ...
Next

Und prüfe startx und endx auf die Array- bzw. Map-Grenzen. Und scrollx erhöhe ich immer wenn der Spieler in die nähe eins Rands kommt, mit Hilfe einer Funktion, die zurückgibt ob überhaupt gescrollt wurde:

Code: [AUSKLAPPEN]
Function Scroll:Int(value:Float)
  scrollX :+ value
  If scrollX < 0 Then
    scrollX = 0
    Return False 'Es kann nicht mehr weiter gescrollt werden
  ElseIf scrollX > screenWidth - (screenWidth / 32)
    scrollX = screenWidth - (screenWidth / 32)
    Return False 'Es kann nicht mehr weiter gescrollt werden
  EndIf

  Return True 'Es wurde gescrollt bzw. kann vermutlich noch gescrollt werden
End Function


Code: [AUSKLAPPEN]
If playerX - scrollX > rechterRand Then
  If Not Scroll(1) Then
    'Wenn nicht gescrollt wurde kann man hier nun die Spielerpos erhöhen statt des Scrollwerts,
    'damit der Spieler bis an das Ende der Karte läuft
  EndIf
EndIf


Der Code ist nur zur Veranschaulichung und aus dem Kopf raus. Funktioniert vermutlich so nicht direkt Wink

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group