Voila, ça donne une idée.
Le -4 et +4 c'est la vitesse du zoom, à ajuster... (zoom avec les fleches clavier avant et arriere)
3- Adapter le système de selection pour la taille variable des sprite (système que j'ai retiré du code pour ne pas l'encombrer, mais qui permet de sélectionner précisément les sprites sans passer par le test 2d de collision, mais en utilisant une table de hashing)
Enfin c'était juste un essais pour dire que c'est faisable.
Bonne soirée.
Code : Tout sélectionner
;***
;*** @Fig 12/05/2011
;*** PB 4.51
If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0 Or InitSprite3D()=0 Or InitSound()=0:MessageRequester("Error","Error DirectX",0):EndIf
ExamineDesktops():Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)
;{-structures
Structure carte1
tile.i
*element
X.i
Y.i
EndStructure
Structure ordre_affichage1
X.i
Y.i
EndStructure
Structure sprite1
spritedebase.i
biasX.i
biasY.i
EndStructure
;}
;{- Taille d'origine des tiles
X_Tilesize=64
Y_Tilesize=X_Tilesize/2
;}
;{-déclare les variables globales
Global xmax=DesktopWidth(0),ymax=DesktopHeight(0)
Global xscroll,yscroll,Xscrolliso,Yscrolliso
Global nbcaseX=Round(xmax/X_Tilesize,1);nombre de Case en hauteur en diagonal à afficher
Global nbcaseY=Round(ymax/Y_Tilesize,0);nombre de Case en largeur en diagonal à afficher
Global Scroll_X=80,Scroll_Y=80,IsoScroll_X=1,IsoScroll_Y=80,XX,YY
Global Scroll_X=80,Scroll_Y=80,IsoScroll_X=1,IsoScroll_Y=80,XX,YY
Global vitesse_scroll=32,miliscrol_X,miliscrol_Y,zoom_carte=4
;}
;{-déclare les variables "temporaires"
Global T_i,T_j,T_nb,T_DecX=0,T_DecY=0,T_offset=0
;}
;déclare l'aire de jeu
Global Dim carte.carte1(1023,1023)
;déclare le tableau d'ordre d'affichage des tiles
Global Dim ordre_affichage.ordre_affichage1(20000)
;liste des caractéristiques de l'animation des arbres
Global NewList sprite.sprite1()
;ouvre un écran
OpenScreen(xmax,ymax, DesktopDepth(0), "test")
;{-rempli la carte
;rempli de Tiles
For t_i=0 To 1023
For t_j=0 To 1023
carte(t_i,t_j)\tile=Random(2)+1
Next t_j
Next t_i
;initialise les arbres
For t_i=0 To 10000
Repeat
X=Random(1021)+1
Y=Random(1021)+1
AddElement(sprite())
sprite()\spritedebase=150
sprite()\biasX=-64
sprite()\biasY=-224
Until carte(x,y)\element=0
carte(X,Y)\element=@sprite()
Next t_i
;}
;pré-calcul l'ordre d'affichage des tiles à l'écran
Macro ordredaffichage
T_nb=0
ReDim ordre_affichage(60000)
For T_j=nbcaseY To -nbcaseY Step -1
For T_i=nbcaseX To -nbcaseX Step -1
T_nb+1
ordre_affichage(T_nb)\X=-T_j-T_i
ordre_affichage(T_nb)\Y=T_i-T_j
Next T_i
For T_i=nbcaseX To -nbcaseX+1 Step -1
T_nb+1
ordre_affichage(T_nb)\X=-T_j-T_i+1
ordre_affichage(T_nb)\Y=T_i-T_j
Next T_i
Next T_j
ReDim ordre_affichage(T_nb)
EndMacro
ordredaffichage
;{-création des sprites
T_T=100000
For t_j=1 To 3
;sprite de terrain :herbe verte, herbe sèche et terre nue
CreateSprite(t_j,256,256,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(t_j))
Box(0,0,256,256,RGB(0,0,0))
Box(0,0,256,256,RGB(196, 178, 86))
For T_i=1 To T_T
Plot(Random(256-1),Random(256-1),RGB(0,200,50))
Plot(Random(256-1),Random(256-1),RGB(0,127,0))
Next T_i
T_T/2
StopDrawing()
Next T_j
;sprite arbre
CreateSprite(150,256,256,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(150))
Box(107,64,42,255,RGB(1,1,1))
Box(108,64,40,255,RGB(173, 103, 82))
Circle(128,65,66,RGB(1,1,1))
Circle(128,65,64,RGB(0,200,0))
Circle(128,65,30,RGB(1,1,1))
Circle(128,65,28,RGB(0,0,0))
StopDrawing()
;sprite de la souris
CreateSprite(100,16,16,#PB_Sprite_Texture)
StartDrawing(SpriteOutput(100))
LineXY(0,0,15,5,RGB(255,255,255))
LineXY(0,0,5,15,RGB(255,255,255))
LineXY(15,5,5,15,RGB(255,255,255))
StopDrawing()
;transforme les sprites carrées en tiles losanges isométriques rapport 1/2
For T_i=1 To 3
CreateSprite3D(T_i,T_i)
TransformSprite3D(T_i,X_Tilesize/2,0,X_Tilesize,Y_Tilesize/2,X_Tilesize/2,Y_Tilesize,0,Y_Tilesize/2)
Next T_i
CreateSprite3D(150,150)
CreateSprite3D(100,100)
;}
;boucle principale
Repeat
FlipBuffers()
ClearScreen(RGB(0,0,0))
Delay(3)
ExamineKeyboard()
ExamineMouse()
XX=MouseX()
YY=MouseY()
;{-scroll+zoom de la carte
;zoomIN
If KeyboardPushed(#PB_Key_Up)
x_tilesize+zoom_carte
y_tilesize=x_tilesize/2
nbcaseX=Round(xmax/x_tilesize,1);nombre de Case en hauteur en diagonal à afficher
nbcaseY=Round(xmax/y_tilesize,1)
Start3D()
;change la taille des tiles
For T_i=1 To 3
TransformSprite3D(T_i,X_Tilesize/2,0,X_Tilesize,Y_Tilesize/2,X_Tilesize/2,Y_Tilesize,0,Y_Tilesize/2)
Next T_i
;change la taille des arbres
ratiox.f=X_tilesize/64
ratioy.f=y_tilesize/32
ZoomSprite3D(150,256*ratiox,256*ratioy)
Stop3D()
ordredaffichage
EndIf
;zoomOut
If KeyboardPushed(#PB_Key_Down) And x_tilesize>32
x_tilesize-zoom_carte
y_tilesize=x_tilesize/2
nbcaseX=Round(xmax/x_tilesize,1);nombre de Case en hauteur en diagonal à afficher
nbcaseY=Round(xmax/y_tilesize,1)
Start3D()
;change la taille des tiles
For T_i=1 To 3
TransformSprite3D(T_i,X_Tilesize/2,0,X_Tilesize,Y_Tilesize/2,X_Tilesize/2,Y_Tilesize,0,Y_Tilesize/2)
Next T_i
;change la taille des arbres
ratiox.f=X_tilesize/64
ratioy.f=y_tilesize/32
ZoomSprite3D(150,256*ratiox,256*ratioy)
Stop3D()
ordredaffichage
EndIf
If XX>xmax-20
If Scroll_X<1023 And Scroll_Y>0
miliscrol_X-vitesse_scroll
If miliscrol_X<=0
Scroll_X+1:Scroll_Y-1
IsoScroll_X+1
miliscrol_X=X_Tilesize
EndIf
EndIf
EndIf
If XX<20
If Scroll_X>0 And Scroll_Y<1023
miliscrol_X+vitesse_scroll
If miliscrol_X>=X_Tilesize
miliscrol_X=0
Scroll_X-1:Scroll_Y+1
IsoScroll_X-1
EndIf
EndIf
EndIf
If YY>ymax-20
If Scroll_X<1023 And Scroll_Y<1023
miliscrol_Y-vitesse_scroll/2
If miliscrol_Y<=0
Scroll_X+1:Scroll_Y+1:IsoScroll_Y+1:miliscrol_Y=Y_Tilesize
EndIf
EndIf
EndIf
If YY<20
If Scroll_X>0 And Scroll_Y>0
miliscrol_Y+vitesse_scroll/2
If miliscrol_Y>=Y_Tilesize
Scroll_X-1:Scroll_Y-1:IsoScroll_Y-1:miliscrol_Y=0
EndIf
EndIf
EndIf
;}
;{-Affichage sprites 3D
Start3D()
;affichage des tiles
For i=0 To T_nb
sx=Scroll_X+ordre_affichage(i)\X
sy=Scroll_Y+ordre_affichage(i)\Y
;Si dans le tableau de jeu...
If sx>=0 And sy>=0 And sy<=1023 And sx<=1023
T_Cases=carte(sx,sy)\tile
sxx=-sy*(X_Tilesize/2)+ sx*(X_Tilesize/2)-IsoScroll_X*X_Tilesize+xmax/2-X_Tilesize+miliscrol_X
syy=sy*(Y_Tilesize/2) + sx*(Y_Tilesize/2)-IsoScroll_Y*Y_Tilesize+ymax/2-Y_Tilesize-Y_Tilesize/2+miliscrol_Y
;affiche la case de terrain
DisplaySprite3D(T_Cases,sxx,syy)
EndIf
Next i
;affichage des éléments sur les tiles
For i=0 To T_nb
sx=Scroll_X+ordre_affichage(i)\X
sy=Scroll_Y+ordre_affichage(i)\Y
;Si dans le tableau de jeu...
If sx>=0 And sy>=0 And sy<=1023 And sx<=1023
sxx=-sy*(X_Tilesize/2)+ sx*(X_Tilesize/2)-(IsoScroll_X*X_Tilesize)+xmax/2-X_Tilesize+miliscrol_X
syy=sy*(Y_Tilesize/2) + sx*(Y_Tilesize/2)-IsoScroll_Y*Y_Tilesize+ymax/2-Y_Tilesize-Y_Tilesize/2+miliscrol_Y
If carte(sx,sy)\element
;affiche l'élément sur cette case
ChangeCurrentElement(sprite(),carte(sx,sy)\element)
sxx1=sxx+sprite()\biasX*ratiox
syy1=syy+sprite()\biasY*ratioy
DisplaySprite3D(sprite()\spritedebase,sxx1,syy1)
EndIf
EndIf
Next i
;affichage de la souris
DisplaySprite3D(100,XX,YY)
Stop3D()
;}
;{-affiche le texte
If Val(FormatDate("%ss", Date()))=sek
FPS+1
Else
FPS$=Str(FPS)
FPS=0
EndIf
sek=Val(FormatDate("%ss", Date()))
StartDrawing(ScreenOutput())
DrawText(1,1,"FPS: "+FPS$)
DrawText(1,15,"nombre de tiles affichées: "+Str(T_nb))
StopDrawing()
;}
Until KeyboardPushed(#PB_Key_Escape)