Page 1 sur 1

Un moteur de vue isométrique

Publié : mar. 08/juin/2004 12:00
par Crystal Noir
Tenez, je vous refile un snippets qui vous montre comment faire un moteur pour un jeu en vue isométrique.

Commencez par recopier ce code :

Code : Tout sélectionner

;-Initialisation des composants
InitSprite()
InitKeyboard()

;-Initialisation des constantes et variables
  ;Variables Globales
  Global MaFenetre    ;Fenêtre principale
  
  ;Constantes
  #Main_Window = 1
  
  
;-Création de la fenêtre principale 
SetRefreshRate(60)
MaFenetre = OpenWindow(#Main_Window, 0, 0, 640, 480, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Test") 
OpenWindowedScreen(MaFenetre,0,0, 640, 480,0, 0, 0)
If MaFenetre  = 0 
  MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
EndIf

;-Construction de la vue isométrique
cx = 320  ;On initialise les valeurs
cy = 150  ;de cx et cy

For yy = 0 To 10
  ax = cx
  ay = cy
  
  For xx = 0 To 10
    StartDrawing(ScreenOutput())
    If xx < 10
      LineXY(ax,ay,ax+32,ay+16,RGB(255,255,255))
    EndIf
    
    If yy < 10
      LineXY(ax,ay,ax-32,ay+16,RGB(255,255,255))
    EndIf
    StopDrawing()
    
    ax = ax + 32
    ay = ay + 16
  Next
  cx = cx - 32
  cy = cy + 16
Next

FlipBuffers()

;-Boucle Principale
Repeat
  EID = WindowEvent()
Until EID = #PB_Event_CloseWindow
Ici vous avez la base. Si vous lancez le code vous avez le squelette de votre moteur. En fait on trace une grille en calculant les coordonnées des points des droites en fonction de x et y. Vous pouvez incrémenter la boucle pour mettre plus de tile :)

Maintenant voyons ce qu'on peut faire. Commencez par télécharger ce fichier, ce sont les graphismes dont vous aurez besoin, à dezipper dans le même répertoire de votre fichier source :

http://www.2dev.org/snippets/Iso/Iso.zip

Maintenant, changeons le code, Effacez ce que vous avez fait et mettez ceci :

Code : Tout sélectionner

;-Initialisation des composants
InitSprite()
InitKeyboard()

;-Initialisation des constantes et variables
  ;Variables Globales
  Global MaFenetre    ;Fenêtre principale
  
  ;Constantes
  #Main_Window = 1
  #Tile = 2
  #Maison = 3

;-Création de la fenêtre principale 
SetRefreshRate(60)
MaFenetre = OpenWindow(#Main_Window, 0, 0, 640, 480, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Test") 
OpenWindowedScreen(MaFenetre,0,0, 640, 480,0, 0, 0)
If MaFenetre  = 0 
  MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
EndIf

;-Chargment des Sprites
LoadSprite(#Tile,"tile.bmp")
TransparentSpriteColor(#Tile,0,0,0)

LoadSprite(#Maison,"maison.bmp")
TransparentSpriteColor(#Maison,0,0,0)

;-Construction de la vue isométrique
cx = 320  ;On initialise les valeurs
cy = 150  ;de cx et cy

For yy = 0 To 10
  ax = cx
  ay = cy
  
  For xx = 0 To 10
    If xx < 10 And yy < 10
    DisplayTransparentSprite(#Tile,ax-32,ay)
    EndIf
    
    If xx = 5 And yy = 5
      DisplayTransparentSprite(#Maison,ax-32,ay-32)
    EndIf
    
    StartDrawing(ScreenOutput())
    If xx < 10
      ;LineXY(ax,ay,ax+32,ay+16,RGB(255,255,255))
    EndIf
    
    If yy < 10
      ;LineXY(ax,ay,ax-32,ay+16,RGB(255,255,255))
    EndIf
    StopDrawing()
    
    ax = ax + 32
    ay = ay + 16
  Next
  cx = cx - 32
  cy = cy + 16
Next

FlipBuffers()

;-Boucle Principale
Repeat
  EID = WindowEvent()
Until EID = #PB_Event_CloseWindow
On a juste charger les sprites et on les a positionné, suivant la grille. J'ai mis les instructions Line en commentaire pour éviter d'avoir les lignes de la grille :)

Et voilà le tour est joué !

Ce procédé est une adaptation d'un code Blitz que j'ai fait pour pure, profitez en bien !

Publié : mar. 08/juin/2004 12:12
par Fred
Sympa l'example. C'est typiquement le genre de cas ou l'utilisation des data est pratique. Je l'ai un peu modifier pour montrer comment faire une carte rapidement à l'aide de data:

Code : Tout sélectionner

;-Initialisation des composants 
InitSprite() 
InitKeyboard() 

;-Initialisation des constantes et variables 
  ;Variables Globales 
  Global MaFenetre    ;Fenêtre principale 
  
  ;Constantes 
  #Main_Window = 1 
  #Tile = 2 
  #Maison = 3 

;-Création de la fenêtre principale 
SetRefreshRate(60) 
MaFenetre = OpenWindow(#Main_Window, 0, 0, 640, 480, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Test") 
OpenWindowedScreen(MaFenetre,0,0, 640, 480,0, 0, 0) 
If MaFenetre  = 0 
  MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok) 
EndIf 

;-Chargment des Sprites 
LoadSprite(#Tile,"tile.bmp") 
TransparentSpriteColor(#Tile,0,0,0) 

LoadSprite(#Maison,"maison.bmp") 
TransparentSpriteColor(#Maison,0,0,0) 

;-Construction de la vue isométrique 
cx = 320  ;On initialise les valeurs 
cy = 150  ;de cx et cy 

Dim MyMap(9, 9)

Restore Mymap
For y=0 To 9
  For x=0 To 9
    Read MyMap(x,y)
  Next
Next


For yy = 0 To 9
  ax = cx 
  ay = cy 
  
  For xx = 0 To 9
    If MyMap(xx,yy) = 1
      DisplayTransparentSprite(#Maison,ax-32,ay-32) 
    Else
      DisplayTransparentSprite(#Tile,ax-32,ay) 
    EndIf 
    
    StartDrawing(ScreenOutput()) 
    If xx < 10 
      ;LineXY(ax,ay,ax+32,ay+16,RGB(255,255,255)) 
    EndIf 
    
    If yy < 10 
      ;LineXY(ax,ay,ax-32,ay+16,RGB(255,255,255)) 
    EndIf
    
    StopDrawing() 
    
    ax = ax + 32 
    ay = ay + 16 
  Next 
  cx = cx - 32 
  cy = cy + 16 
Next 

FlipBuffers() 

;-Boucle Principale 
Repeat 
  EID = WindowEvent() 
Until EID = #PB_Event_CloseWindow

DataSection

  MyMap:
    Data.l 0,0,0,0,0,0,0,0,0,0
    Data.l 0,0,0,0,0,0,0,0,0,0
    Data.l 0,0,0,0,0,0,0,0,0,0
    Data.l 0,0,0,0,0,0,0,0,0,0
    Data.l 0,0,1,0,1,0,0,0,0,0
    Data.l 0,0,1,1,1,0,0,0,0,0
    Data.l 0,0,1,0,1,0,0,0,0,0
    Data.l 0,0,0,0,0,0,0,0,0,0
    Data.l 0,0,0,0,0,0,0,0,0,0
    Data.l 0,0,0,0,0,0,0,0,0,0                                    

Publié : mar. 08/juin/2004 12:15
par Crystal Noir
effectivement :) cependant je ne suis pas très fortiche dans les datas :p

Publié : mar. 08/juin/2004 13:30
par Fred
C'est l'occasion de s'y mettre :). Pour changer de map, tu as juste a changer la partie data, le moteur ne change pas..

Publié : mar. 08/juin/2004 19:45
par Keph
Ya plus qu'à faire un editeur de niveau qui génere les Data à la volée :)

Publié : jeu. 10/juin/2004 20:45
par Polux
Très sympa ce code! :wink:

Publié : ven. 11/juin/2004 14:16
par Polux
Ce qui serait interessant c'est de voir comment on peut faire pour gérer les collisions ( un exemple: lors du passage d'un curseur, la case survolée est traçée )...

Publié : ven. 11/juin/2004 14:20
par Crystal Noir
tu veux dire mise en surbrillance ?

Publié : ven. 11/juin/2004 14:22
par Polux
ouep par exemple :oops: ( j'm'exprime comme un pied cet aprèsm )