Voila le code, ça marche avec toutes les dimensions ici une carte de 1024x1024.
Pas de ralentissement je reste au fps maximum.
Par contre comme promis c'est programmé comme un sagoin et le code ne prévoit pas un changement de taille de Tiles (les miennes font 64x64 -64x32- affichées).
Mon ftp free n'est pas encore validé donc je n'ai pas pu mettre en ligne les sprites. (l'interface fait 1024x168). je les mettrais des que possible.
Code : Tout sélectionner
InitSprite()
InitKeyboard()
InitMouse()
InitSound()
OpenScreen(1024,768,32,"")
Structure monde
x.l
y.l
z.b
type.b
perso.w
EndStructure
Structure element
spritedebase.b
spritecourant.b
nbsprite.b
x.l
y.l
xdes.l
ydes.l
repere.w
EndStructure
;-constantes
#taillex=1023
#tailley=#taillex
#TailleTileX = 64
#TailleTileY = #TailletileX/2
#Relief=5
#nbelement=2000
Macro FPSec
; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
; CALCUL ET AFFICHAGE DU FPS
If FPST.l<ElapsedMilliseconds()
FPST.l=ElapsedMilliseconds()+1000
fps.l=FPSC.l
FPSC=0
EndIf
FPSC+1
StartDrawing(SpriteOutput(1))
DrawText(0,0,Str(fps)+" fps")
StopDrawing()
; *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
EndMacro
Macro Test
If ScrollY<(#tailley+1)/2+2
x1=ScrollX+ScrollY-2
y1=ScrollY-ScrollX-16
If x1<0:x1=0:EndIf
If y1<0:y1=0:EndIf
Else
x1=ScrollY<<1-#tailley-4
If ScrollX>(ScrollY-#tailley-1):x1=x1+ScrollX-ScrollY+#tailley+2:EndIf
y1=#TailleY-15
If ScrollX>(ScrollY-#tailley-1):y1=y1-ScrollX+ScrollY-#tailleY-1:EndIf
EndIf
x2=x1+35
If x2>#taillex:x2=#taillex:EndIf
y2=y1+35
If y2>#tailley:y2=#tailley:EndIf
affiche_terrain=1
EndMacro
;-variables
Global scrollx.l=-127
Global scrolly.l=127
Global x1.l=0
Global y1.l=0
Global x2.l=x1+35
Global y2.l=y2+35
;-booleens d'états
Global Debugg.b=0
Global affiche_terrain.b=1
;Global
Global Dim monde.monde(#taillex,#tailley)
Global Dim element.element(#nbelement)
Global Dim fct.w(#taillex)
Declare createminimap(x,y)
Declare CreateMapIsometric(Taille_Map_X.l,Taille_Map_Y.l,TileType.b)
Declare updatemap()
Declare minicarte()
;SortStructuredArray (perso(), 0, OffsetOf (perso\y), #PB_Sort_Long )
;LoadSound(0,"Oui.wav")
;-Charge les sprites
TransparentSpriteColor(#PB_Default,RGB(255,255,255))
Restore interfac
For i=1 To 2
Read a$
LoadSprite(i,a$)
Next i
Restore herbe
;herbes
For i=3 To 4
Read a$
LoadSprite(i,a$)
Next i
Restore arbre
;arbres
For i=20 To 120
Next i
Restore objet
;objets
For i=120 To 121
Read a$
LoadSprite(i,a$)
Next i
TransparentSpriteColor(121,RGB(0,0,0))
StartDrawing(SpriteOutput(1))
DrawText(350,22,"TAPER 1 pour le mode debugg qui affiche les coordonnées de chaque Tile")
StopDrawing()
DataSection
Interfac:
Data.s "taskbar.bmp","fleche.bmp"
herbe:
Data.s "herbe1.bmp","repereherbe.bmp"
arbre:
Data.s ""
objet:
Data.s "repere.bmp","bas1.bmp"
montagne:
Data.l 1111221111,1112332111,1123443211,1234554321,2345665432,2345665432,1234554321,1123443211,1112332111,1111221111
EndDataSection
CreateMapIsometric(#tailleX,#tailleY,3)
;monde(1,1)\perso=1
;element(1)\x=1:element(1)\y=1:element(1)\xdes=1:element(1)\ydes=1:element(1)\spritedebase=121
;element(1)\spritecourant=121:element(1)\nbsprite=1:element(1)\repere=120
createminimap(155,155)
monde(3,3)\z=2
monde(4,3)\z=3
monde(4,4)\z=7
;-boucle principale
Repeat
FlipBuffers()
If affiche_terrain=1
updatemap()
affiche_terrain=0
GrabSprite(0,0,0,1024,768)
Else
DisplaySprite(0,0,0)
EndIf
DisplaySprite(1,0,600);affiche interface
ExamineMouse()
x=MouseX():y=MouseY()
ExamineKeyboard ()
;deplacement ecran
If x<2 And ScrollX>-#taillex/2
;If KeyboardReleased(#PB_Key_Left)
ScrollX-1
test
EndIf
If x>1022 And ScrollX<#taillex/2
;If KeyboardReleased(#PB_Key_Right)
ScrollX+1
test
EndIf
If y<2 And ScrollY>0
;If KeyboardReleased(#PB_Key_Up) And ScrollY>0
ScrollY-1
test
EndIf
If y>766 And ScrollY<#tailley-13
;If KeyboardReleased(#PB_Key_Down) And ScrollY<242
ScrollY+1
test
EndIf
;affiche la souris
DisplayTransparentSprite(2,x,y)
FPSec
;ExamineKeyboard ()
If KeyboardReleased(#PB_Key_1):Debugg=~(Debugg):affiche_terrain=1:LoadSprite(3,"herbe1.bmp"):EndIf
Until KeyboardPushed ( #PB_Key_Escape )
End
Procedure createminimap(X,Y)
UseBuffer(1)
ratx.f=X/#taillex
raty.f=Y/#tailley
For i=0 To #tailleX
For j=0 To #tailleY
k=monde(i,j)\perso
L=element(monde(i,j)\perso)\repere
DisplaySprite (monde(i,j)\type+1,i*ratx+862,j*raty+5)
If monde(i,j)\perso<>0:DisplaySprite(element(monde(i,j)\perso)\repere,i*ratx+862,j*raty+5):EndIf
Next j
Next I
UseBuffer(-1)
EndProcedure
Procedure CreateMapIsometric(Taille_Map_X.l,Taille_Map_Y.l,TileType.b)
Shared DecalageX.l,DecalageY.l,Offset.l
For y = 0 To Taille_Map_Y
For x = 0 To Taille_Map_X
DecalageX = DecalageX + (#TailleTileX/2)
DecalageY = DecalageY + (#TailleTileY/2)
monde(x,y)\x=DecalageX
monde(x,y)\y=DecalageY
monde(x,y)\z=Random(#relief)
monde(x,y)\Type=TileType
monde(x,y)\perso=0
Next x
Offset+1
DecalageX = -(Offset*(#TailleTileX/2))
DecalageY = (#TailleTileY/2)*Offset
Next y
EndProcedure
Procedure UpdateMap()
Shared TilePosX.l,TilePosY.l
ClearScreen(RGB(0,0,0))
For y=y1 To y2
For x=x1 To x2
TilePosX = monde(x,y)\x- ScrollX*#TailleTileX
TilePosY = monde(x,y)\y-ScrollY*#TailleTileY-monde(x,y)\z
If Debugg<>0
StartDrawing(SpriteOutput(monde(x,y)\type))
DrawText(12,6,Str(x)+"/"+Str(y)+" ",RGB(255,0,0));coordonnées x,y
;DrawText(12,6,Str(monde(x,y)\z)+" ",RGB(255,0,0));coordonnées en z
StopDrawing()
EndIf
DisplayTransparentSprite(monde(x,y)\type ,TilePosX,TilePosY)
Next x
Next y
If Debugg<>0
StartDrawing(SpriteOutput(1))
DrawText(402,42,"ScrollX="+Str(ScrollX)+" ScrollY="+Str(ScrollY)+" ")
DrawText(402,72,"x1="+Str(x1)+" x2="+Str(x2)+" Surface Tiles affichée="+Str((x2-x1)*(y2-y1))+" ")
DrawText(402,102,"y1="+Str(y1)+" y2="+Str(y2)+" ")
StopDrawing()
EndIf
EndProcedure