Un moteur de vue isométrique

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Un moteur de vue isométrique

Message 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 !
Fred
Site Admin
Messages : 2805
Inscription : mer. 21/janv./2004 11:03

Message 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                                    
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

effectivement :) cependant je ne suis pas très fortiche dans les datas :p
Fred
Site Admin
Messages : 2805
Inscription : mer. 21/janv./2004 11:03

Message 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..
Keph
Messages : 19
Inscription : mer. 21/janv./2004 21:00
Contact :

Message par Keph »

Ya plus qu'à faire un editeur de niveau qui génere les Data à la volée :)
Image
Avatar de l’utilisateur
Polux
Messages : 440
Inscription : mer. 21/janv./2004 11:17
Localisation : france
Contact :

Message par Polux »

Très sympa ce code! :wink:
Avatar de l’utilisateur
Polux
Messages : 440
Inscription : mer. 21/janv./2004 11:17
Localisation : france
Contact :

Message 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 )...
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

tu veux dire mise en surbrillance ?
Avatar de l’utilisateur
Polux
Messages : 440
Inscription : mer. 21/janv./2004 11:17
Localisation : france
Contact :

Message par Polux »

ouep par exemple :oops: ( j'm'exprime comme un pied cet aprèsm )
Répondre