Exemple de carte isometrique zoomable

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Exemple de carte isometrique zoomable

Message par Fig »

Si ça peut servir à quelqu'un un jour...
Les 2 nouveautés, par rapport à ce qui a déjà été fait, sont le zoom et l'affichage des tiles uniquement présentes à l'écran pour les grandes cartes. (et du fond vers l'avant évidemment)

Zoom avec la roulette, souris au bord de l'écran pour scroller.

Code : Tout sélectionner

#x=1024:#y=768
If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()=0:MessageRequester("Error","Error DirectX",0):EndIf
If OpenWindow(0,200,0,#x,#y, "test carte isometric zoomable ", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
    If OpenWindowedScreen(WindowID(0),0,0,#x,#y,0,0,0,#PB_Screen_WaitSynchronization)=0:MessageRequester("Erreur", "Impossible d'ouvrir un écran dans la fenêtre!", 0):End:EndIf
EndIf
;taille de la carte en nb de Tiles
#xmax=512:#ymax=512
;cste ground
;taille de la tile la plus grande 320
Global GroundTileWidth.i=320
Global GroundTilewidthInit.i=GroundTileWidth
Global GroundTileWidthHalf.i=GroundTileWidth/2
Global GroundTileHeight.i=GroundTileWidth/2
Global GroundTileHeightHalf.i=GroundTileHeight/2
;vitesse du scroll
Global CameraSpeed.i=10
Global zoom.i=100

#herbe1=0
#mouse=101

;point de départ de la "camera"
Global XCamera.i=-#x/2
Global YCamera.i=-#y/2

Dim ground(#xmax-1,#ymax-1)

;converti les coordonnées de l'ecran vers iso
Macro XScreenToMap(x,y)
Int(((X/GroundTileWidthhalf) + (Y/GroundTileheighthalf))/2)
EndMacro
Macro YScreenToMap(x,y)
Int(((Y/GroundTileheighthalf) - (X/GroundTilewidthhalf))/2)
EndMacro
;inverse la conversion
Macro XMapToScreen(x,y)
(x-y)*GroundTileWidthHALf
EndMacro
Macro YMapToScreen(x,y)
(x+y)*GroundTileheightHALF
EndMacro


;{ CreateIsoSprite()
CreateSprite(#mouse,10,10)
StartDrawing(SpriteOutput(#mouse))
Box(0,0,10,10,#Yellow)
StopDrawing()
CreateSprite(#herbe1,GroundTileWidth,GroundTileheight)
StartDrawing(SpriteOutput(#herbe1))
Box(0,0,GroundTileWidth,GroundTileheight,#Red)
Box(2,2,GroundTileWidth-2,GroundTileheight-2,#Blue)
StopDrawing()
TransformSprite(#herbe1,GroundTileWidthHalf,0,GroundTileWidth,GroundTileheightHalf,GroundTileWidthHalf,GroundTileHeight,0,GroundTileHeightHalf)
;}

Macro affiche_dimetric()
nbtile.i=0
  x1 =XScreenToMap(Xcamera,ycamera)-2
  y1 =YScreenToMap(xcamera,ycamera)
  x2=x1
  y2=y1
  Repeat
      Repeat
          If x1>-1 And x1<#Xmax And y1>-1 And y1<#ymax
              DisplaySprite(ground(x1,y1),XMapToScreen(x1,y1)-GroundTileWidthHalf-xcamera,yMapToScreen(x1,y1)-ycamera)
              nbtile+1
          EndIf
          x1+1
          y1-1
      Until XMapToScreen(x1,y1)-GroundTileWidthHalf-xcamera>#X
      y2+1
      x1=x2:y1=y2
      Repeat
          If x1>-1 And x1<#Xmax And y1>-1 And y1<#ymax
              DisplaySprite(ground(x1,y1),XMapToScreen(x1,y1)-GroundTileWidthHalf-xcamera,yMapToScreen(x1,y1)-ycamera)
              nbtile+1
          EndIf
          x1+1
          y1-1
      Until XMapToScreen(x1,y1)-GroundTileWidthHalf-xcamera>#X
      x2+1
      x1=x2:y1=y2
  Until yMapToScreen(x1,y1)-ycamera>#y
EndMacro

Macro Mouse()
ExamineMouse()
Mx=MouseX()+XCamera
My=MouseY()+YCamera
DisplayTransparentSprite(#mouse,MouseX(),MouseY())
;coordonnée de la souris sur les tiles
IsoMouseX=XScreenToMap(Mx,My)
IsoMouseY=YScreenToMap(Mx,My)
Debug XScreenToMap(Mx,My)
Debug YScreenToMap(Mx,My)

Debug "Largeur de la tile: "+Str(GroundTileWidth)
Debug "nbtile :"+Str(nbtile)
Debug " "
;offset Camera
If MouseX()=0 And IsoMouseX>-1 And IsoMouseY<#ymax:XCamera-CameraSpeed:EndIf
If MouseX()=#X-1 And IsoMouseX<#xmax And IsoMouseY>-1:XCamera+CameraSpeed:EndIf
If MouseY()=0 And IsoMouseX>-1 And IsoMouseY>-1:YCamera-CameraSpeed:EndIf
If MouseY()=#Y-1 And IsoMouseX<#xmax And IsoMouseY<#ymax:YCamera+CameraSpeed:EndIf
;zoom
wheel=MouseWheel()
If (Wheel>0 And zoom<100) Or (Wheel<0 And zoom>5)
Zoom+Wheel
GroundTileWidth.i=GroundTilewidthInit*zoom/100
GroundTileWidthHalf.i=GroundTileWidth/2
GroundTileHeight.i=GroundTileWidth/2
GroundTileHeightHalf.i=GroundTileHeight/2
TransformSprite(#herbe1,GroundTileWidthHalf,0,GroundTileWidth,GroundTileheightHalf,GroundTileWidthHalf,GroundTileHeight,0,GroundTileHeightHalf)
EndIf
EndMacro

Repeat
FlipBuffers()
ClearScreen(#Black)
ExamineKeyboard()
WindowEvent()

affiche_dimetric()
Mouse()
Until KeyboardPushed(#PB_Key_Escape)
Dernière modification par Fig le jeu. 05/juin/2014 9:56, modifié 7 fois.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Exemple de carte isometrique zoomable

Message par falsam »

Il doit manquer quelque chose : constante #undermouse introuvable
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Exemple de carte isometrique zoomable

Message par Fig »

En virant ce qui était superflu, j'ai laissé un pb de constante.
C'est bon. :wink:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Exemple de carte isometrique zoomable

Message par falsam »

Plutôt bien, mais la carte disparaît trop vite au lancement du code.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Exemple de carte isometrique zoomable

Message par Fig »

Parce que la souris apparait sur un bord de l'écran dès le début... Bah, je vais rajouter une limite au scroll...
Voila, c'est fait... Mais bon, je ne voudrais pas trop surcharger le code.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Lemaquis
Messages : 271
Inscription : mer. 25/déc./2013 7:34
Localisation : la corse

Re: Exemple de carte isometrique zoomable

Message par Lemaquis »

le code marche pas j'ai un message d'erreur : constante #vide introuvable
LeMaquis
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Exemple de carte isometrique zoomable

Message par Fig »

C'est bon cette fois. :wink:
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Lemaquis
Messages : 271
Inscription : mer. 25/déc./2013 7:34
Localisation : la corse

Re: Exemple de carte isometrique zoomable

Message par Lemaquis »

merci ça marche
LeMaquis
Répondre