Char Bewegung in einem RPG
Übersicht

![]() |
Mathias-KwiatkowskiBetreff: Char Bewegung in einem RPG |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group