Page 1 sur 1

Exemple de carte isometrique zoomable

Publié : jeu. 29/mai/2014 16:58
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)

Re: Exemple de carte isometrique zoomable

Publié : jeu. 29/mai/2014 17:57
par falsam
Il doit manquer quelque chose : constante #undermouse introuvable

Re: Exemple de carte isometrique zoomable

Publié : jeu. 29/mai/2014 18:15
par Fig
En virant ce qui était superflu, j'ai laissé un pb de constante.
C'est bon. :wink:

Re: Exemple de carte isometrique zoomable

Publié : jeu. 29/mai/2014 18:21
par falsam
Plutôt bien, mais la carte disparaît trop vite au lancement du code.

Re: Exemple de carte isometrique zoomable

Publié : jeu. 29/mai/2014 18:24
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.

Re: Exemple de carte isometrique zoomable

Publié : mar. 03/juin/2014 18:49
par Lemaquis
le code marche pas j'ai un message d'erreur : constante #vide introuvable

Re: Exemple de carte isometrique zoomable

Publié : jeu. 05/juin/2014 9:57
par Fig
C'est bon cette fois. :wink:

Re: Exemple de carte isometrique zoomable

Publié : ven. 06/juin/2014 16:28
par Lemaquis
merci ça marche