iso-mapping , maus + kamera prob

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: iso-mapping , maus + kamera prob

BeitragSa, Apr 24, 2010 0:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Apr 24, 2010 8:42
Antworten mit Zitat
Benutzer-Profile anzeigen
eigentlich musst du dich nur eine IF-Abfrage in die Malschleife einfügen, oder?

BlitzBasic: [AUSKLAPPEN]
      For Spalte = 0 To mapBreite - 1
If Abs(AktuelleTileX-MouseX()<32
If Abs(AktuelleTileY-MouseY()<32
DrawImage tileset,aktuelleTileX - 32, aktuelleTileY,Karte$(zeile,spalte)
EndIf
EndIf
aktuelleTileX = aktuelleTileX + 16
aktuelleTileY = aktuelleTileY + 8
Next

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

BeitragSa, Apr 24, 2010 11:19
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 25, 2010 1:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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
aktuelleTileX = xMax / 2 + offsetX +Zeile*16

For Spalte = 0 To mapHoehe-1
aktuelleTileY = 0 + offsetY + Spalte*8

DrawImage tileset,aktuelleTileX, aktuelleTileY, Karte$(zeile,spalte)
Next
Next

gibt es einen Grund, warum das bei dir so kompliziert aussieht?

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group