iso-mapping , maus + kamera prob
Übersicht

![]() |
Mathias-KwiatkowskiBetreff: iso-mapping , maus + kamera prob |
![]() Antworten mit Zitat ![]() |
---|---|---|
mhh hab da so ein tollen code, aber keine ahnung wie ich es machen soll das nur die tiles angezeigt werden die innerhalb der kamera liegen,
problem 2 ist wie kann ich es machen das er das tile anzeigt wenn man mit der maus drüber fährt? danke im vorraus und hier der code: Code: [AUSKLAPPEN] Global mapBreite = 40
Global mapHoehe = 40 Global offsetX = 0 Global offsetY = 0 Global x,y,mx,my,tile = 1,mapx,mapy Dim Karte$(mapBreite-1,mapHoehe-1) Graphics 1024,768,32,2 SetBuffer BackBuffer() Global tileset = LoadAnimImage("data\tiles.png",32,16,0,2):MaskImage tileset,255,0,255 Karte$(38,38) = 1 While Not KeyHit(1) Cls scrolling() cX = xMax / 2 + offsetX cY = 0 + offsetY For Zeile = 0 To mapHoehe - 1 aktuelleTileX = cX aktuelleTileY = cY For Spalte = 0 To mapBreite - 1 DrawImage tileset,aktuelleTileX - 32, aktuelleTileY,Karte$(zeile,spalte) aktuelleTileX = aktuelleTileX + 16 aktuelleTileY = aktuelleTileY + 8 Next cX = cX - 16 cY = cY + 8 Next If KeyHit(78) Then tile = tile + 1 If KeyHit(74) Then tile = tile - 1 mx = MouseX() my = MouseY() Text 0,0,"Ausgewähltes Tile: "+tile Flip 0 Wend End Function scrolling() If KeyDown(203) And offsetX < (mapBreite * 64) * 0.6 Then offsetX = offsetX + 8 ;LEFT ElseIf KeyDown(205) And offsetX > -(mapBreite * 64) * 0.6 Then offsetX = offsetX - 8 ;RIGHT EndIf If KeyDown(200) And offsetY < 228 Then offsetY = offsetY + 8 ;UP ElseIf KeyDown(208) And offsetY > -(mapHoehe * 64) * 0.4 Then offsetY = offsetY - 8 ;DOWN EndIf End Function |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
eigentlich musst du dich nur eine IF-Abfrage in die Malschleife einfügen, oder?
BlitzBasic: [AUSKLAPPEN] For Spalte = 0 To mapBreite - 1 Dadurch werden nur die Tile gezeichnet, die sich in dr Nähe der Mausbefinden. Mit der "Camera" bin ich mir nicht so sicher, was du meinst, aber eigentlich "malt" ein Grafiktreiber sowieso nur das, was auf dem Bildschirm sichtbar ist. Tiles, die außerhalb des Bildschirm liegen schaden der Performance kaum. |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
mhh nein so habe ich es nicht gemeint, ich meinte viel mehr, wie kann ich nur die tiles zeichnen lassen die man auch sieht z.b. wenn ich ne map von 400 x 400 habe muss man ja nicht alle tiles zeichnen, und da is mein prob. das mit der maus habe ich schon hinbekommen aber funktioniert nicht wirklich siehe hier vll sogar ma testen
Code: [AUSKLAPPEN] Global mapBreite = 40
Global mapHoehe = 40 Global offsetX = 0 Global offsetY = 0 Global x,y,mx,my,tile = 1,mapx,mapy Global PickedTileX,PickedTileY Dim Karte$(mapBreite-1,mapHoehe-1) Graphics 1024,768,32,2 SetBuffer BackBuffer() Global tileset = LoadAnimImage("data\tiles.png",32,16,0,2):MaskImage tileset,255,0,255 Karte$(38,38) = 1 While Not KeyHit(1) Cls scrolling() cX = xMax / 2 + offsetX cY = 0 + offsetY For Zeile =0 To mapBreite-1 aktuelleTileX = cX aktuelleTileY = cY For Spalte = 0 To mapHoehe-1 DrawImage tileset,aktuelleTileX - 32, aktuelleTileY,Karte$(zeile,spalte) aktuelleTileX = aktuelleTileX + 16 aktuelleTileY = aktuelleTileY + 8 Next cX = cX - 16 cY = cY + 8 Next If KeyHit(78) Then tile = tile + 1 If KeyHit(74) Then tile = tile - 1 mx = MouseX() my = MouseY() If MouseDown (1) Then PickTile( mx,my ) Karte$(PickedTileX,PickedTileY)=1 EndIf Text 0,0,"Ausgewähltes Tile: "+tile Text 0,20,PickedTileX+" "+PickedTileY Flip 0 Wend End Function PickTile( px, py ) Local tg#, x, y, tx, ty ; Koordinaten transformieren x = Floor(( px +(py -23)*2 ) /92.0) ; 23 = Tilehöhe /2, 92 = Tilebreite y = Floor(( py -(px -46)*0.5 ) /46.0) ; 46 = Tilebreite /2, 46 = Tilehöhe ; Indizes transformieren tx = Floor((x-y)/2) ty = y +x ; Gepickte Koordinaten zuweisen PickedTileX = tx PickedTileY = ty End Function Function scrolling() If KeyDown(203) And offsetX < (mapBreite * 64) * 0.6 Then offsetX = offsetX + 8 ;LEFT ElseIf KeyDown(205) And offsetX > -(mapBreite * 64) * 0.6 Then offsetX = offsetX - 8 ;RIGHT EndIf If KeyDown(200) And offsetY < 228 Then offsetY = offsetY + 8 ;UP ElseIf KeyDown(208) And offsetY > -(mapHoehe * 64) * 0.4 Then offsetY = offsetY - 8 ;DOWN EndIf End Function danke nochmal |
||
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
du zeichnest jetzt immer von ...
BlitzBasic: [AUSKLAPPEN] For Zeile =0 To mapBreite-1 eigentlich müsstes du ausrechnen, bei welchem n... BlitzBasic: [AUSKLAPPEN] xMax / 2 + offsetX +n*16 ...gerade größer als 0 geworden ist. Dann hast du die Tile-Nummer, die bereits auf dem Bildschirm ist: Zitat: xMax / 2 + offsetX +n*16=0
n*16=0-xMax/2-offsetX n=(0-xMax/2-offsetX)/16 bei deiner Rechnung blick ich nicht ganz durch *(siehe Anmerkung). Es könnte auch sein, dass ein einfaches: BlitzBasic: [AUSKLAPPEN] n=offsetX/16
bereits reicht. Jedenfalls startet dann die FOR/NEXT mit... BlitzBasic: [AUSKLAPPEN] For Zeile =n To n+40 das "n+40" kann auch eine andere Zahl sein (das weisst du besser), aber klar ist, wenn der linke StartTile ertstmal gefunden ist, dann wird immer die gleiche Anzahl an Tiles auf den Bildschirm passen also z.b. 40 Stück waagrecht rüber, oder so. Das gleiche dann mit den y-Werten... *)Anmerkung Normalerweise wird ein Tile-Feld so gezeichnet: BlitzBasic: [AUSKLAPPEN] For Zeile =0 To mapBreite-1 gibt es einen Grund, warum das bei dir so kompliziert aussieht? |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group