Code Map2D Isométrique

Programmation avancée de jeux en PureBasic
Anonyme

Message par Anonyme »

Voila , plus simple a comprendre :


Tu as juste cela a retenir :

ISO_X = X-Y
ISO_Y = (X+Y)/2

c'est la formule de projection.

Code : Tout sélectionner

; on defini les 4 cotés de notre carré 

X1 = 10
Y1 = 10

X2 = 90
Y2 = 10

X3 = 90
Y3 = 90

X4 = 10
Y4 = 90



OpenWindow(0,0,0,640,480,"")


TextGadget(#PB_Any,5,5,100,30,"Non isométrique")

TextGadget(#PB_Any,200,5,100,30,"Isométrique")



Repeat
event = WindowEvent()


  StartDrawing(WindowOutput(0))
  
  DecalageX = 20   ; Pour ne pas chevauché sur le texte , on décale
  DecalageY = 30
  
  LineXY(X1+DecalageX,Y1+DecalageY,X2+DecalageX,Y2+DecalageY,$0)
  LineXY(X2+DecalageX,Y2+DecalageY,X3+DecalageX,Y3+DecalageY,$0)
  LineXY(X3+DecalageX,Y3+DecalageY,X4+DecalageX,Y4+DecalageY,$0)
  LineXY(X4+DecalageX,Y4+DecalageY,X1+DecalageX,Y1+DecalageY,$0)
          
          
          
          
  DecalageX = 250   ; Pour ne pas chevauché sur le texte , on décale
  DecalageY = 30        
        
        
        
        
   iso_X1 =  X1 - Y1   
   iso_Y1 =  (X1 + Y1)/2
        
   iso_X2 =  X2 - Y2       
   iso_Y2 =  (X2 + Y2)/2    
            
   iso_X3 =  X3 - Y3        
   iso_Y3 =  (X3 + Y3)/2 
       
   iso_X4 =  X4 - Y4        
   iso_Y4 =  (X4 + Y4)/2     
           
        
  LineXY(iso_X1+DecalageX,iso_Y1+DecalageY,iso_X2+DecalageX,iso_Y2+DecalageY,$0)
  LineXY(iso_X2+DecalageX,iso_Y2+DecalageY,iso_X3+DecalageX,iso_Y3+DecalageY,$0)
  LineXY(iso_X3+DecalageX,iso_Y3+DecalageY,iso_X4+DecalageX,iso_Y4+DecalageY,$0)
  LineXY(iso_X4+DecalageX,iso_Y4+DecalageY,iso_X1+DecalageX,iso_Y1+DecalageY,$0)
                                                     
         
        
          
          
          
                                                
  StopDrawing()



Until event = #PB_Event_CloseWindow
powerpsy
Messages : 2
Inscription : mar. 25/août/2009 21:26

Message par powerpsy »

Alors,
1/ Atomo, merci beaucoup !
effectivement un simple global devant la déclaration marche bien ! Il reste plein de choses après coup, mais je m'en sors à peu près dans la mise à jour.

2/ Enorme merci cpl.bator, si j'ai bien suivi avec les transformations, si maintenant j'ajoute la hauteur (en Z), il vient sur la projection:

X' = X-Y
Y' = (X+Y) / 2 - Z/2

du coup, en posant un point au centre du carré mais en hauteur, il vient:

Code : Tout sélectionner

; on definit les 4 cotés de notre carré

Z0 = 0 ; hauteur
Z1 = 50

X1 = 10
Y1 = 10

X2 = 90
Y2 = 10

X3 = 90
Y3 = 90

X4 = 10
Y4 = 90

XC = 50
YC = 50

OpenWindow(0,0,0,640,480,"")

TextGadget(#PB_Any,5,5,100,30,"Non isométrique")

TextGadget(#PB_Any,200,5,100,30,"Isométrique")

Repeat
event = WindowEvent()

  StartDrawing(WindowOutput(0))
 
  DecalageX = 20   ; Pour ne pas chevaucher sur le texte , on décale
  DecalageY = 30
 
  LineXY(X1+DecalageX,Y1+DecalageY,X2+DecalageX,Y2+DecalageY,$0)
  LineXY(X2+DecalageX,Y2+DecalageY,X3+DecalageX,Y3+DecalageY,$0)
  LineXY(X3+DecalageX,Y3+DecalageY,X4+DecalageX,Y4+DecalageY,$0)
  LineXY(X4+DecalageX,Y4+DecalageY,X1+DecalageX,Y1+DecalageY,$0)
         
  LineXY(XC+DecalageX,YC+DecalageY,X1+DecalageX,Y1+DecalageY,$0)
  LineXY(XC+DecalageX,YC+DecalageY,X2+DecalageX,Y2+DecalageY,$0)
  LineXY(XC+DecalageX,YC+DecalageY,X3+DecalageX,Y3+DecalageY,$0)
  LineXY(XC+DecalageX,YC+DecalageY,X4+DecalageX,Y4+DecalageY,$0)
  
  DecalageX = 250   ; Pour ne pas chevaucher sur le texte , on décale
  DecalageY = 30       
       
   iso_X1 =  X1 - Y1   
   iso_Y1 =  (X1 + Y1)/2 - Z0/2
       
   iso_X2 =  X2 - Y2       
   iso_Y2 =  (X2 + Y2)/2 - Z0/2  
           
   iso_X3 =  X3 - Y3       
   iso_Y3 =  (X3 + Y3)/2 - Z0/2
       
   iso_X4 =  X4 - Y4       
   iso_Y4 =  (X4 + Y4)/2 - Z0/2    
       
   iso_XC =  XC - YC       
   iso_YC =  (XC + YC)/2 - Z1/2    
       
  LineXY(iso_X1+DecalageX,iso_Y1+DecalageY,iso_X2+DecalageX,iso_Y2+DecalageY,$0)
  LineXY(iso_X2+DecalageX,iso_Y2+DecalageY,iso_X3+DecalageX,iso_Y3+DecalageY,$0)
  LineXY(iso_X3+DecalageX,iso_Y3+DecalageY,iso_X4+DecalageX,iso_Y4+DecalageY,$0)
  LineXY(iso_X4+DecalageX,iso_Y4+DecalageY,iso_X1+DecalageX,iso_Y1+DecalageY,$0)
                                                     
  LineXY(iso_XC+DecalageX,iso_YC+DecalageY,iso_X1+DecalageX,iso_Y1+DecalageY,$0)
  LineXY(iso_XC+DecalageX,iso_YC+DecalageY,iso_X2+DecalageX,iso_Y2+DecalageY,$0)
  LineXY(iso_XC+DecalageX,iso_YC+DecalageY,iso_X3+DecalageX,iso_Y3+DecalageY,$0)
  LineXY(iso_XC+DecalageX,iso_YC+DecalageY,iso_X4+DecalageX,iso_Y4+DecalageY,$0)
                                               
  StopDrawing()

Until event = #PB_Event_CloseWindow
Après, je vais reprendre l'idée de map en début de topic et chercher à intégrer cela...

Sam
Répondre