wenn ich mich richtig erinner sollten nur die gezeichet werden die man tatsächlich sieht.
im code von antic city in der drawing.pbi steht folgendes:
(Das ist die einzige Procedure die fürs zeichnen der Map zuständsig ist)
k und i sind die durchlaufvariablen für x und y
dabei halt nicht x und y in pixeln, sondern fürs tile aus dem array
also tile nummer k,i ^^
dieses wird dann an position x,y auf dem screen gemalt, weil es auf position x2,y2 auf der map ist
jaja sehr kompliziert;)
also:
k,i, startX, startY, endeX, endeY sind die Tile-nummern
pos\x & pos\y sind die reale position in pixeln auf der map
screenX und screenY sind die position in pixeln auf dem screen
Den rest habe ich als kommentar in den code geschrieben
Code: Alles auswählen
Procedure map_draw()
Static startX.l, endeX.l, startY.l, endeY.l
Static i.l, k.l, ScreenX.l, ScreenY.l
startX = Pos\x/tile\x-2
endeX = Pos\x/tile\x+anzahlx+2
startY = Pos\y/tile\y-2
endeY = Pos\y/tile\y+anzahly+2
; zeige alle tiles an die sichtbar sind PLUS 2 oben, unten, rechts, links, damit wirklich keine lücke am rand sichtbar ist.
; das "erste" X- Tile ist also an der realen position "pos\x" geteilt durch die Tilebreite "tile\x" -2 (sicherheitsabstand)
If Start3D()
For k = startY To endeY
For i = startX To endeX
; in 2 schleifen somit den ganzen x,y bzw k,i bereich durchgehen
If i > 0 And i < #Map_W And k > 0 And k < #Map_H
; wenn man sich am rand der karte befindet überprüfen, das man nicht auf tiles auserhalb der karte zugreifen will
ScreenX = (i*tile\x)-Pos\x
; screenposition bestimmen (vorher ja nur mit realer position gerechnet)
;x in pixel auf screen = (i (=x-nummer des tiles) mal die größe eines tiles) minus die aktuelle x position in real
; gleiche mit y
If i & 1
ScreenY = (k*tile\y)-Pos\y
Else
ScreenY = (k*tile\y)-Pos\y + tile\y / 2
EndIf
; überprüfen, ob die map an der k,i position in dem layer ein tile besitzt, wenn ja sprite überprüfen und aneigen
; das zoomen wird durch eine andere funktion geändert, die automatisch die tilegrößen tile\x und tile\y verändert
If Map(i,k)\Layer1
If IsSprite3D(Map(i,k)\Layer1)
ZoomSprite3D(Map(i,k)\Layer1, tile\x*2, tile\y)
DisplaySprite3D(Map(i,k)\Layer1, ScreenX, ScreenY, 255)
EndIf
EndIf
If Map(i,k)\Layer2
If IsSprite3D(Map(i,k)\Layer2)
ZoomSprite3D(Map(i,k)\Layer2, tile\x*2, tile\y)
DisplaySprite3D(Map(i,k)\Layer2, ScreenX, ScreenY, 255)
EndIf
EndIf
If Map(i,k)\Layer3
If IsSprite3D(Map(i,k)\Layer3)
ZoomSprite3D(Map(i,k)\Layer3, tile\x*2, tile\y)
DisplaySprite3D(Map(i,k)\Layer3, ScreenX, ScreenY, 255)
EndIf
EndIf
If Map(i,k)\Layer4
If IsSprite3D(Map(i,k)\Layer4)
ZoomSprite3D(Map(i,k)\Layer4, tile\x*2, tile\y)
DisplaySprite3D(Map(i,k)\Layer4, ScreenX, ScreenY, 255)
EndIf
EndIf
If Map(i,k)\Layer5
If IsSprite3D(Map(i,k)\Layer5)
ZoomSprite3D(Map(i,k)\Layer5, tile\x*2, tile\y)
DisplaySprite3D(Map(i,k)\Layer5, ScreenX, ScreenY, 255)
EndIf
EndIf
EndIf
Next
Next
Stop3D()
EndIf
EndProcedure