[jeu] load Map (et autres questions)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: quelques questions : scrolling, load/save game

Message par G-Rom »

je n'utilise pas de tuile (tile), car j'ai fait énormément de sprites et je n'ai pas envie de tout refaire (pour l'instant). En plus, les maps que j'ai déjà élaborées et que je compte convertir pour mon jeu en pb n'utilisent pas les tiles. J'avais prévu le principe, mais je ne l'ai pas utilisé.

Même si tu n'utilises pas des tuiles , tu ne vas pas t'amuser à afficher tout se qui en dehors de l'écran , tu devra forcement passer par un systeme de tuiles , je reconnais qu'au niveau des graphismes c'est chiant , mais tu peut toujours utilisé un système de région ( comparable à un octree en 3d par exemple ) , si tu est sage et que tu nous fait bavé avec tes graphismes ( car il sont beau ) , je t'aide à faire tout ce que tu veut :mrgreen:
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: quelques questions : scrolling, load/save game

Message par blendman »

G-Rom a écrit :Même si tu n'utilises pas des tuiles , tu ne vas pas t'amuser à afficher tout se qui en dehors de l'écran , tu devra forcement passer par un systeme de tuiles
un système de tableau par exemple ?
car effectivement, je ne comptais pas afficher ce qui n'était pas à l'écran (ou à coté) :).
Mais je n'ai pas encore réfléchi à cette technique (afficher que ce qu'il y a sur l'écran).
je reconnais qu'au niveau des graphismes c'est chiant , mais tu peut toujours utilisé un système de région ( comparable à un octree en 3d par exemple ) , si tu est sage et que tu nous fait bavé avec tes graphismes ( car il sont beau ) , je t'aide à faire tout ce que tu veut :mrgreen:
un système de région ? je sais pas trop ce que c'est, si tu as plus d'info là-dessus, n'hésites pas ;)

Sinon, pour ceux qui veulent tester voici un test d'affichage (je n'ai pas encore corrigé le scrolling) et j'ai un bug sur le les centres des sprites (uniquement pour les arbres 1 et 3, et je ne comprends pas trop pourquoi)

Note : Comtois m'avait corrigé le code, pour le tri et ça marcher avec un seul sprite d'arbre, mais si j'en utilise plusieurs d'arbres, ça ne marche plus, je ne sais pas pourquoi.

Code : Tout sélectionner

;{ **************** variable, constantes.****************** ..
;Eléments Windows
Enumeration
  #WINDOW_MAIN
  #text
  #ui
EndEnumeration


; ---------------------------------------------------------------------

; NOTE  : 

;il faut que je change toutes ces variables globales, en une Structure, 
;et ajouter à cette structures soit un tableau Dim Global, 
;soit utiliser des pointeurs, pour éviter d'avoir trop de choses globales.

; ---------------------------------------------------------------------

;variable générales : taille de la vue, de la map (room), etc..
;taille de la "map" (ou Room)
Global room_width = 4000 
Global room_height  = 3120 

; on vérifie si l'écran est suffisamment grand (pour les netbooks, pour toi, Dobro ;))
ExamineDesktops()
dw=DesktopWidth(0)
dh=DesktopHeight(0)
dc=DesktopDepth(0)

If dw<1024 Or dh<768
  Global ecranX =dw
  Global ecranY =dc
Else
  Global ecranX = 1024
  Global ecranY = 768
EndIf

; ici, on peut changer le "FPS". En dessous de 60, chez moi, ça commence à saccader
Global FPS_LIMIT = 120
Global CheckTime 

Global quit = 0 ; pour quitter

;gestion de la "caméra"


; scroll pour tous les objets, sauf le centre de la vue
Global scroll_x = 0
Global scroll_y = 0
; "scroll" pour l'objet central de la vue, lorsque celui-ci se rapproche du bord de l'écran
Global scroll_centre_cam_x = 0
Global scroll_centre_cam_y = 0

Global view_centre_x = ecranX /2 ; le centre de la vue
Global view_centre_y = ecranY /2 ; le centre de la vue

Global HorBord = 60 ;bordure verticale, au dela de celle-ci le personnage ne se rapproche plus du bord, mais la "caméra" bougede l'écran
Global VertBord = 40 ;bordure verticale, au dela de celle-ci le personnage ne se rapproche plus du bord, mais la "caméra" bougede l'écran

; vitesse de déplacement du personnage
Global vitesse = 2 ;* FPS_LIMIT/120


;}
 
;{ **************** Structures **************************** 

Structure objet
  Sprite.l
  x.l
  y.l
  newposition_x.l
  newposition_y.l
  centre_x.l
  centre_y.l
EndStructure
 
Global nombre_arbre = 200
 
Global Dim tableau_obj.objet(nombre_arbre)

;on crée le tableau contenant les données de chaque "objet" décor (sprite, x, y, centre,etc..)
For i = 0 To nombre_arbre
    tableau_obj(i)\Sprite = 1+Round(Random(2),0)
  
  If tableau_obj(i)\Sprite = 1
    tableau_obj(i)\centre_x = 104
    tableau_obj(i)\centre_y = 256
  ElseIf tableau_obj(i)\Sprite = 2
    tableau_obj(i)\centre_x = 52
    tableau_obj(i)\centre_y = 159
  ElseIf tableau_obj(i)\Sprite = 3
    tableau_obj(i)\centre_x = 83
    tableau_obj(i)\centre_y = 188
  EndIf
   
  tableau_obj(i)\y = Random(room_height)
  tableau_obj(i)\x = Random(room_width )
  tableau_obj(i)\newposition_x = tableau_obj(i)\x - tableau_obj(i)\centre_x
  tableau_obj(i)\newposition_y = tableau_obj(i)\y - tableau_obj(i)\centre_y
Next i
SortStructuredArray(tableau_obj(), #PB_Sort_Ascending, OffsetOf(objet\y), #PB_Sort_Long); on tri par le y

; le personnage est considéré comme étant le centre de la caméra. Il est donc 
; le seul à avoir comme paramètre les scroll_centre_cam

tableau_obj(0)\Sprite = 0
tableau_obj(0)\centre_x = 17
tableau_obj(0)\centre_y = 80
tableau_obj(0)\x = ecranX/2
tableau_obj(0)\y = ecranY/2
 
tableau_obj(0)\newposition_x = tableau_obj(0)\x - tableau_obj(0)\centre_x - scroll_centre_cam_x
tableau_obj(0)\newposition_y = tableau_obj(0)\y - tableau_obj(0)\centre_y - scroll_centre_cam_y
 
 
;}
 
Declare evenement()
Declare update()
 
;{ **************** initialisation ************************** 
 
InitSprite()
InitSprite3D()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
 
;}
 
 
;{ ********************** openWindow ************************ 
 
OpenWindow(#WINDOW_MAIN,150,150,EcranX,EcranY,"3 Arks - test - "+Str(CheckTime),#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(#WINDOW_MAIN),0,0,EcranX,EcranY,0,0,0,#PB_Screen_WaitSynchronization ) 
;ClearScreen(RGB(128,128,128))
 
;}
 
;{ loading (sprites)


LoadSprite(0,"perso.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture )
CreateSprite3D(0,0)

 For i = 1 To 3
LoadSprite(i, "arbre"+Str(i)+".png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture )
CreateSprite3D(i,i)
Next i

;interface
;LoadSprite(#ui, "message.png",#PB_Sprite_AlphaBlending|#PB_Sprite_Texture )
;CreateSprite3D(#ui,#ui)



;}

 
Repeat
  
  Event.l = WindowEvent()
  evenement()
  If (ElapsedMilliseconds() > CheckTime + 1000 / FPS_LIMIT)
    CheckTime = ElapsedMilliseconds()
    update() 
    FlipBuffers() 
    ClearScreen(RGB(128,128,128))
                     
  Else
    Delay(1)
  EndIf
  
Until Event = #PB_Event_CloseWindow Or quit = 1
 
 
Procedure evenement()
  ;ExamineMouse()
  If ExamineKeyboard()
    
    If KeyboardPushed(#PB_Key_Up) 
      If view_centre_y > HorBord
        scroll_centre_cam_y - vitesse
        view_centre_y - vitesse
      ElseIf scroll_y >0
          scroll_y - vitesse
      EndIf
    EndIf
    
    
    If KeyboardPushed(#PB_Key_Down) And scroll_y < room_height - ecranY 
      If view_centre_y < ecranY - HorBord
        scroll_centre_cam_y + vitesse
        view_centre_y + vitesse
      Else  
          scroll_y + vitesse
      EndIf
    EndIf
      
    
    If KeyboardPushed(#PB_Key_Left) 
      If view_centre_x > VertBord
        scroll_centre_cam_x - vitesse
        view_centre_x - vitesse
      ElseIf  scroll_x >0 
          scroll_x - vitesse
      EndIf
    EndIf
    
    
    If KeyboardPushed(#PB_Key_Right) And scroll_x < room_width - ecranX
      If view_centre_x < ecranX - VertBord
        scroll_centre_cam_x + vitesse
        view_centre_x + vitesse
      Else 
          scroll_x + vitesse
      EndIf
    EndIf
    
      
    If KeyboardPushed(#PB_Key_Escape)
      quit = 1
    EndIf
    
  EndIf
  
EndProcedure
 
Procedure update()
  Dim temp.objet(nombre_arbre)
  CopyArray(tableau_obj(), temp())
  
  For i=0 To nombre_arbre
    If temp(i)\Sprite <> 0
      temp(i)\newposition_y - scroll_y
    ElseIf temp(i)\Sprite = 0
      temp(i)\newposition_y + scroll_centre_cam_y - temp(i)\centre_y
      temp(i)\newposition_x + scroll_centre_cam_x - temp(i)\centre_x
    EndIf
  Next i
  
  SortStructuredArray(temp(), #PB_Sort_Ascending, OffsetOf(objet\newposition_y), #PB_Sort_Long) 

  For i=0 To nombre_arbre
    If temp(i)\Sprite <> 0
      temp(i)\newposition_y + scroll_y
    ElseIf temp(i)\Sprite = 0
      temp(i)\newposition_y - scroll_centre_cam_y + temp(i)\centre_y
      temp(i)\newposition_x - scroll_centre_cam_x + temp(i)\centre_x
    EndIf
  Next i
  
  CopyArray(temp(), tableau_obj())
  
  Start3D() 
  
  For i=0 To  nombre_arbre
    If tableau_obj(i)\Sprite <> 0
      DisplaySprite3D(tableau_obj(i)\Sprite, tableau_obj(i)\newposition_x - scroll_x,tableau_obj(i)\newposition_y - scroll_y)
    ElseIf tableau_obj(i)\Sprite = 0
      DisplaySprite3D(tableau_obj(i)\Sprite, tableau_obj(i)\newposition_x + scroll_centre_cam_x,tableau_obj(i)\newposition_y + scroll_centre_cam_y)     
      
    EndIf
  Next i    
   ; DisplaySprite3D(#ui,0,0)    ;interface  
      
  Stop3D()
  
EndProcedure
les images (ce ne sont pas les images définitives, juste des images de tests) :
http://blendman.free.fr/dev/pb/arbre1.png
http://blendman.free.fr/dev/pb/arbre2.png
http://blendman.free.fr/dev/pb/arbre3.png
http://blendman.free.fr/dev/pb/perso.png
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: quelques questions : scrolling, load/save game

Message par blendman »

salut les z'amis :)

Actuellement, je travaille sur le loading de map, et je voulais avoir votre avis très éclairé et toujours de bon conseil à ce propos :D.

Voilà, lorsque l'on charge une map (ou carte, ou un niveau) dans le jeu, il peut se passer plusieurs opérations :
- on libère toutes les images qu'on utilisait avant
- on garde en mémoire les variables que l'on veut garder
- on ouvre les nouvelles images et on place les sprites au bon endroit
- on initialise/on change les variables que l'on veut.
- on lance/relance la boucle du jeu

Il peut y avoir d'autres opérations bien sûr.

D'un point de vue programmation, comment fait-on un changement de map ?

Par exemple, imaginons que j'ai le code suivant (schématisé) :

Code : Tout sélectionner

init() ; initialise les constances, variables, structures, etc.. ainsi que les autres inits (keyboard, souris, usejpgdecoder, etc..)
openwindow() ;  ouvre la venêtre + le screen par exemple

loadingSprite() ; charge les sprites
main() ; la boucle principale
C'est très schématique, mais c'est pour bien comprendre :).

Lorsque je charge une map, logiquement cela s'opère avec loadingSprite() et main().

Mais comment faire "boucler" ceci, doit-on utiliser un goto vers un label, ou une boucle repeat avec un certain paramètre pour sortir de la boucle, par exemple :

Code : Tout sélectionner

repeat
; le code lié à la map
loadingSprite() 
loadmap()
load_destrucs()
; puis la boucle du jeu ou plutôt de la map ou du niveau en question (on boucle jusqu'à ce que l'on sorte de ce niveau ou que l'on quitte le jeu
repeat
; ici, on a tous les evenements liés au jeu
affichage()
action()
flipbuffers()
until quit = 1 or quit = 2
freemap()

; autre action, par exemple revenir au menu ou event pour sortir du jeu
until quit = 2
end
ou ce genre-là :

Code : Tout sélectionner

Procedure changemap()
   FreeMap()
  Goto labal_map
EndProcedure

label_Map :
loadingSprite() ; charge les sprites
loadmap()
load_destrucs()
repeat
; le code lié à la map
action()
affichage()
flipbuffers()
changeMap()
until quit = 1
end
Quelle serait d'après vous la meilleure technique (peut être est-ce encore autre chose, d'ailleurs) ?

Merci d'avance
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: [jeu] load Map (et autres questions)

Message par case »

j'ai fait comme ça pour pure dash

Code : Tout sélectionner

;
initialisation des données du jeu
déclaration des procédures etc... 
;

mainmenu() ; vas dans le menu principal

procedure mainmenu()

   if choix=jouer
       jouer()
   endif

repeat
until quit ;le joueur sélectionne quitter
end
endprocedure
;
;
; procedures
;
;

procedure jouer()
 loadmap()
 repeat 
   ; boucle principale du jeu 
   ; affichage
   etc...
   if niveausuivant
      loadmap
   endif
until playerdeath,quit
if player dead
 if hiscore
  hiscore()
 else
  gameover()
endif
endif

endprocedure

procedure gameover()

repeat
 affichage score
until timer return to title
endprocedure
procedure hiscore 
   saisie du hiscore
 repeat
   saisie du score 
 until le_hiscore_est_saisi
endprocedure


procedure loadmap()
   freemap()        ; efface les données de la map precedente
   loadsprites()    ; charge les sprites
   loadmapdata() ; charge les datas de la map   
endprocedure

comme ca au lancement on vas dans la procédure mainmenu, j'aurais pu mettre la boucle en dehors d'une procédure mais j'ai fait comme ca,)

la on gère l'affichage , le deplacement dans le menu, etc..
si le joueur choisis 'jouer' on lance la procedure jeu.

le premier niveau se charge.

le jeu commence a chaque fois qu'on passe a un autre niveau on charge le niveau suivant sans sortir de la boucle du jeu.

si le joueur n'a plus de vie on sort de la boucle principale
si il est mort on vas afficher le game over
a la fin du game over on reviens a l'endroit ou on l'a appelé

ce qui entraine la sortie de la procédure et donc le retour vers le menu principal.
ImageImage
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: [jeu] load Map (et autres questions)

Message par blendman »

Merci pour l'exemple ;).

Finalement, j'ai aussi intégré une procédure pour le chargement de map/changement de map.
Répondre