Problem bei Tilemap Scrolling & Charakter Steuerung

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

eleXity

ehemals "BlackProgrammer"

Betreff: Problem bei Tilemap Scrolling & Charakter Steuerung

BeitragMo, Okt 22, 2012 9:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten morgen alle miteinander,
Ich schreibe die letzten 3 tage wieder mit BlitzMax und habe auf bb.com einen Link zu dem
(wie ich finde super Tile Editor gefunden) Tiled .
Da ich diesen sehr interessant fand und ich auch sonnst nichts anderes zu tun hatte dachte ich mir schreibst ne
Laderoutine für die maps die mit Tiled erstellt wurden. Wink

Soviel zur Vorgeschichte, jetzt habe ich konkret das Problem das ich eine Figur mit den tasten auf der map umher bewegen
möchte, was auch klappt. Aber da die map auch mit scrollt und an den 'kanten' der map dann aufhört
bewegt sich die Figur dann schneller wenn die map scrollt und langsamer wenn die map es nicht mehr tut...

Ich hoffe es hat jetzt jemand verstanden was ich sagen will, ich habe mal ein Beispiel hoch geladen
damit ihr euch ein Bild davon machen könnt ! Link

Für hinweise wie ich das lösen könnte wäre ich sehr dankbar hab da entweder grade ne Denkblockade, oder bin
einfach zu blöde dafür -.-

mfg
nVidia 570GTX | AMD Phenom II X6 | 8 GB RAM | 1TB | Win 7 Ultimate 64 SP1 | B3D, BMAX, BP, C#

Projekt : Worklog
  • Zuletzt bearbeitet von eleXity am Mo, Okt 22, 2012 17:50, insgesamt einmal bearbeitet

Jolinah

BeitragMo, Okt 22, 2012 11:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo eleXity

Im Prinzip muss man nur das was man scrollt von der Bewegung des Spielers abziehen. Also wenn du so schnell scrollst wie der Spieler normal läuft, dann bleibt der Spieler auf der Stelle stehen und animiert nur noch. Wenn hingegen nicht gescrollt wird, dann wird auch nichts abgezogen und der Spieler bewegt sich in der normalen Geschwindigkeit.

Das mit dem stehen bleiben bezieht sich auf die Bildschirmposition. Relativ zur Karte bewegt er sich nämlich, da man ja die Karte hinten dran herumschiebt. Dadurch kann er während dem Scrollen auch nicht über den Bildschirmrand hinaus laufen, da er ja auf dem Bildschirm stehen bleibt und nur die Karte verschoben wird.

Hoffe das hilft dir weiter Wink
 

PhillipK

BeitragMo, Okt 22, 2012 11:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe das ganze immer ein wenig umständlicher gehandhabt, wie bereits beschrieben.

Grundidee war wie folgt: Die kamera bleibt "fest". Was sich bewegt, sind map + spieler.

Hierzu habe ich, je nach map, eine eigene Definition von meter gehabt. Wenns kacheln waren, war eine kachel = 1x1 meter (egal, ob iso oder nicht!)

Hierzu gibts dann immernoch die umrechnung von Positions-angabe und bildschirmkoordinate.

Heißt, wenn momentan der punkt "0,0" mittig im bild zu sehen ist, war es die oberste linke kachel, die genau mittig zu sehen war. Davon ausgehend konnte man immer eine feine rechnung basteln um offsets zum zeichnen einzufügen.
Dabei bezog sich alles auf den nullpunkt der map.

Bei dir klingt es eher so, als würde sich die "ansicht" auf den ursprung der map und der spieler auf den ursprung der ansicht beziehen.

Beispiel: Mittig ist grade tile 5/3, ein tile hat 32x32 px, Bildschirmbreite ist 1024, höhe ist 768.

Zeichenoffset x: -(1024/2) +(5 *32) - (32/2)
Zeichenoffset y: -(768/2) + (3* 32) - (32/2)

(hoffentlich habe ich nun nicht irgendeinen denkfehler.. erklären wir es lieber fix nochmal:
Ich nehme die halbe bildschirmbreite/höhe und ziehe sie von der aktuellen zeichenpositon ab. Darauf rechne ich nun das offset für die breite der kacheln und ziehe nochmal 1/2 kachelbreite ab, um das ganze wirklich mittig zu zentrieren)

Wenn du den Offset des Spielers ebenfalls auf eine solche weise errechnest, wird dieser immer auf der passenden "kachel" dargestellt, zumindest in meiner kleiner verkorksten welt Smile
Wichtig ist, das du in diesem fall einen Arrayindex der Map (sprich x / y koordinate der map) als Meter betrachten solltest.
Werte von 0.5 / 0.5 als spielerposition dürfte somitg genau mittig auf der kachel 0,0 liegen. 14.5 / 15.5 liegt mittig auf der Kachel 14 / 15.

kog

BeitragMo, Okt 22, 2012 12:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich habe einen kleinen Code geschrieben, wie ich meine Tileengines verwirkliche.
Vielleicht bringt er dir oder anderen was zur Verdeutlichung:

BlitzMax: [AUSKLAPPEN]
SuperStrict 

Framework brl.glmax2d
Import brl.random
Global ScrollX:Int=1,ScrollY:Int=1

Global PlayerX:Int=5*32,PlayerY:Int=5*32

Global TileSize:Int=32

Global map:Byte[50,50]

SeedRnd MilliSecs()
For Local x:Int=0 Until 50
For Local y:Int=0 Until 50
map[x,y]=Rand(0,255)
Next
Next


AppTitle = "TileTest"
Graphics 800,600,0,60
Repeat
If KeyHit(KEY_ESCAPE) Or AppTerminate() End

playerx:+(KeyDown(KEY_D)-KeyDown(KEY_A))*2
playery:+(KeyDown(KEY_S)-KeyDown(KEY_W))*2
ScrollTo(playerx,playery)
Cls
SetOrigin -ScrollX,-ScrollY
Local TileX:Int=(playerx/TILESIZE),TileY:Int=(playery/TILESIZE)

Local DrawX:Int=Scrollx/TILESIZE
Local DrawY:Int=SCrollY/TILESIZE
For Local x:Int=drawx Until drawx+26
For Local y:Int=drawy Until drawy+20
If x<0 Or y<0 Or x>=50 Or y>=50 Continue
SetColor map[x,y]-50,map[x,y]-50,map[x,y]-50
If x=tilex And y=tiley SetColor 0,255,0
DrawRect x*TILESIZE,y*TILESIZE,TILESIZE,TILESIZE
Next
Next

SetColor 255,0,0
DrawRect playerx-4,playery-4,8,8

SetOrigin 0,0
DrawText "PixelPos: "+Playerx+":"+PlayerY,10,10
DrawText "TilePos: "+TileX+":"+TileY,10,30
Flip 1
Forever

Function ScrollTo(x:Int,y:Int)
Scrollx=x-GraphicsWidth()/2
scrolly=y-GraphicsHeight()/2
End Function

eleXity

ehemals "BlackProgrammer"

BeitragMo, Okt 22, 2012 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke euch für die antworten, haben mir sehr geholfen, es funktioniert jetzt Very Happy
schuld war letztendlich die Tatsache die PhillipK erwähnt .. Wink
nVidia 570GTX | AMD Phenom II X6 | 8 GB RAM | 1TB | Win 7 Ultimate 64 SP1 | B3D, BMAX, BP, C#

Projekt : Worklog

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group