Presqu'un jeu ! Question sur le subsystem directx (MAJ code)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Presqu'un jeu ! Question sur le subsystem directx (MAJ code)

Message par Huitbit »

Hello,
Je bosse sur Oldskull4 et Oldskull3 (même si ça ne plaît pas à Norton :lol: ).
Pour le Oldskull4, ça devrait ressembler à un Boulderdash avec quelques changements.
Je poste ce début de code, ça peut servir à quelqu'un(avec quelques explications, ça pourrait servir de tuto, non?).
J'utilise Usebuffer pour n'agir que sur les cases du décor où il se passe quelque chose.
Mon problème, c'est que si je ne mets pas SubSystem = directx7 dans les options du compilateur, ben la fonction Usebuffer ne fait pas son boulot.(Merci KCC :wink: )

Comment ça marche avec les pilotes supérieurs à directx7 ? Directx9 ne reconnaît plus Usebuffer?

Voilà le code (n'oubliez pas d'aller dans les options du compilateur et d'écrire "directx7")
(flèches pour se déplacer)

[EDIT] grosse MAJ des éboulements ! [EDIT]

Légende :
carré rouge : oldskull
carré bleu clair : diamant à prendre (il y a un compteur dans le code)
carré marron : roche à pousser, à faire tomber
Eboulement si deux éléments sont empilés, si les cases à côté sont libres et si on passe à proximité


Dites-moi s'il y a des bugs(possibilité d'interférence entre les évènements pendant les "mini animations" de 16 pixels) :wink:

Code : Tout sélectionner

;boulderdash remake
;pb v4.41
;*********************************
#largeur_ecran=1024
#hauteur_ecran=768

Enumeration
  #spr_couche_galerie
  #spr_bordure
  #spr_galerie
  #spr_couche_terre
  #spr_terre
  #spr_roche
  #spr_diamant
  #spr_skull
  #spr_monstre1
  #depart_eblt_roche
  #arrivee_eblt_roche
  #depart_chte_roche
  #arrivee_chte_roche
  #depart_eblt_diamant
  #arrivee_eblt_diamant
  #depart_chte_diamant
  #arrivee_chte_diamant
EndEnumeration

Btype_tuile.b
Wx_skull.w
Wy_skull.w
Bdx_skull.b
Bdy_skull.b
Bcompteur_animation_skull.b=16

Structure carte
  Btuile.b
  Bcompteur_animation_tuile.b
EndStructure

Dim carte.carte(63,47)

Macro creer_sprite(nom_sprite,couleur)
CreateSprite(nom_sprite,16,16)
StartDrawing(SpriteOutput(nom_sprite))
Box(0,0,16,16,couleur)
StopDrawing()
EndMacro

Macro clavier(direction,dx,dy)
If Bcompteur_animation_skull=16
  If KeyboardPushed(direction) 
    If carte(Int(Wx_skull/16)+dx,Int(Wy_skull/16)+dy)\Btuile<>#spr_bordure
      If carte(Int(Wx_skull/16)+dx,Int(Wy_skull/16)+dy-1)\Bcompteur_animation_tuile=0  
        
        ;->>déplacement normal
        If carte(Int(Wx_skull/16)+dx,Int(Wy_skull/16)+dy)\Btuile=#spr_terre Or carte(Int(Wx_skull/16)+dx,Int(Wy_skull/16)+dy)\Btuile=#spr_galerie
          Bdx_skull=dx
          Bdy_skull=dy
          Bcompteur_animation_skull=0
        EndIf
        
        ;->>récupération diamant
        If carte(Int(Wx_skull/16)+dx,Int(Wy_skull/16)+dy)\Btuile=#spr_diamant
          Bdx_skull=dx
          Bdy_skull=dy
          Bcompteur_animation_skull=0
          nbre_diamant=nbre_diamant+1
        EndIf
        
        ;->>pousser roche 
        If  carte(Int(Wx_skull/16)+2*dx,Int(Wy_skull/16))\Btuile=#spr_galerie
          If carte(Int(Wx_skull/16)+dx,Int(Wy_skull/16))\Btuile=#spr_roche 
            If carte(Int(Wx_skull/16)+dx,Int(Wy_skull/16)+1)\Btuile<>#spr_galerie
              Bdx_skull=dx
              Bdy_skull=dy
              Bcompteur_animation_skull=0
              pousser_tuile=1
            EndIf
          EndIf 
        EndIf
        
      EndIf
    EndIf
  EndIf
EndIf 
EndMacro
  
Macro eboulement(dx)
If carte(x+dx,y)\Btuile=#spr_galerie And carte(x+dx,y+1)\Btuile=#spr_galerie
  If carte(x,y+1)\Btuile=#spr_roche
    carte(x,y+1)\Btuile=#depart_eblt_roche
    carte(x+dx,y+1)\Btuile=#arrivee_eblt_roche
  EndIf
  If carte(x,y+1)\Btuile=#spr_diamant
    carte(x,y+1)\Btuile=#depart_eblt_diamant
    carte(x+dx,y+1)\Btuile=#arrivee_eblt_diamant
  EndIf
EndIf
EndMacro

Macro animation_eblt(type_tuile,dx,arrivee)
If carte(x+dx,y)\Btuile=arrivee
  carte(x,y)\Bcompteur_animation_tuile=carte(x,y)\Bcompteur_animation_tuile+2
  UseBuffer(#spr_couche_terre)
  DisplaySprite(#spr_galerie,x*16,y*16)
  DisplaySprite(type_tuile,x*16+carte(x,y)\Bcompteur_animation_tuile*dx,y*16)
  UseBuffer(#PB_Default)
  If carte(x,y)\Bcompteur_animation_tuile=16
    carte(x,y)\Btuile=#spr_galerie
    carte(x+dx,y)\Btuile=type_tuile
    carte(x,y)\Bcompteur_animation_tuile=0
  EndIf
EndIf
EndMacro

Macro animation_chute(type_tuile,depart,arrivee)
If  carte(x,y)\Btuile=depart
  If carte(x,y+1)\Btuile=arrivee
    carte(x,y)\Bcompteur_animation_tuile=carte(x,y)\Bcompteur_animation_tuile+2
    UseBuffer(#spr_couche_terre)
    DisplaySprite(#spr_galerie,x*16,y*16)
    DisplaySprite(type_tuile,x*16,y*16+carte(x,y)\Bcompteur_animation_tuile)
    UseBuffer(#PB_Default)
    If carte(x,y)\Bcompteur_animation_tuile=16
      carte(x,y)\Btuile=#spr_galerie
      carte(x,y+1)\Btuile=type_tuile
      carte(x,y)\Bcompteur_animation_tuile=0
    EndIf
  EndIf
EndIf      
EndMacro  

;-PROGRAMME PRINCIPAL
InitSprite()
InitKeyboard()
OpenWindow(0,0,0,#largeur_ecran,#hauteur_ecran,"Boulderdash_remake",#PB_Window_ScreenCentered|#PB_Window_SystemMenu  )
OpenWindowedScreen(WindowID(0),0,0,#largeur_ecran,#hauteur_ecran,0,0,0)

 ;-sprites
creer_sprite(#spr_terre,RGB(67, 44, 17))
creer_sprite(#spr_bordure,RGB(98, 19, 157))
creer_sprite(#spr_galerie,RGB(0,0,0))
creer_sprite(#spr_roche,RGB(134, 102, 50))
creer_sprite(#spr_diamant,RGB(186, 250, 243))
creer_sprite(#spr_monstre1,RGB(78, 50, 181))
creer_sprite(#spr_skull,RGB(255,0,0))

CreateSprite(#spr_couche_galerie,#largeur_ecran,#hauteur_ecran)
StartDrawing(SpriteOutput(#spr_couche_galerie))
Box(0,0,#largeur_ecran,#hauteur_ecran,RGB(255,255,255));fond blanc
For i=0 To 63
  For j=0 To 47
    If (i+j)%2=0 
      Box(i*16,j*16,16,16,RGB(128,128,128));cases grises
    EndIf
  Next j
Next i
StopDrawing()

CreateSprite(#spr_couche_terre,#largeur_ecran,#hauteur_ecran)
UseBuffer(#spr_couche_terre)
For x=0 To 63
  For y=0 To 47
    
    If x=0 Or x=63 Or y=0 Or y=47
      carte(x,y)\Btuile=#spr_bordure
      DisplaySprite(#spr_bordure,x*16,y*16)
    Else
      tirage_tuile=Random(100)
      If tirage_tuile<95
        carte(x,y)\Btuile=#spr_terre
        DisplaySprite(#spr_terre,x*16,y*16)
      Else
        If tirage_tuile<98
          carte(x,y)\Btuile=#spr_roche
          DisplaySprite(#spr_roche,x*16,y*16)
        Else
          carte(x,y)\Btuile=#spr_diamant
          DisplaySprite(#spr_diamant,x*16,y*16)
        EndIf
      EndIf
    EndIf
    
    ;zone diamantifère pour test d'éboulement
    If (x>10 And x<20) And (y>5 And y<15)
      carte(x,y)\Btuile=#spr_diamant
      DisplaySprite(#spr_diamant,x*16,y*16)
    EndIf 
    ;zone rocheuse pour test d'éboulement
    If (x>20 And x<30) And (y>5 And y<15)
      carte(x,y)\Btuile=#spr_roche
      DisplaySprite(#spr_roche,x*16,y*16)
    EndIf 
    
  Next y
Next x
UseBuffer(#PB_Default)
    
Wx_skull=16
Wy_skull=16
;-BOUCLE PRINCIPALE
Repeat
  FlipBuffers() 
  ;-affichage des sprites
  DisplaySprite(#spr_couche_galerie,0,0)
  DisplayTransparentSprite(#spr_couche_terre,0,0)
  DisplaySprite(#spr_skull,Wx_skull,Wy_skull)
  ;-tests sur les tuiles
  For x=0 To 63
    For y=0 To 47
      Btype_tuile=carte(x,y)\Btuile
      If Btype_tuile=#spr_roche Or Btype_tuile=#spr_diamant
        
        ;->>éboulement 
        If   carte(x,y+1)\Btuile=#spr_roche Or carte(x,y+1)\Btuile=#spr_diamant
          ;éboulement à droite
          eboulement(1)
          ;éboulement à gauche
          eboulement(-1)
        EndIf
        
        ;->>chute normale roche ou diamant si case vide en dessous 
        If  carte(x,y+1)\Btuile=#spr_galerie
          If Btype_tuile=#spr_roche
            carte(x,y)\Btuile=#depart_chte_roche
            carte(x,y+1)\Btuile=#arrivee_chte_roche
          EndIf
          If Btype_tuile=#spr_diamant
            carte(x,y)\Btuile=#depart_chte_diamant
            carte(x,y+1)\Btuile=#arrivee_chte_diamant
          EndIf
        EndIf
      EndIf
      
      ;-gestion de l'animation
      ;-animation chute roche
      animation_chute(#spr_roche,#depart_chte_roche,#arrivee_chte_roche)
      ;-animation éboulement roche
      If  carte(x,y)\Btuile=#depart_eblt_roche
        ;animation éboulement à droite
        animation_eblt(#spr_roche,1,#arrivee_eblt_roche)
        ;animation éboulement à gauche
        animation_eblt(#spr_roche,-1,#arrivee_eblt_roche)
      EndIf
      
      ;-animation chute diamant
      animation_chute(#spr_diamant,#depart_chte_diamant,#arrivee_chte_diamant)
      ;-animation éboulement diamant
      If  carte(x,y)\Btuile=#depart_eblt_diamant
        ;animation éboulement à droite
        animation_eblt(#spr_diamant,1,#arrivee_eblt_diamant)
        ;animation éboulement à gauche
        animation_eblt(#spr_diamant,-1,#arrivee_eblt_diamant)
      EndIf
      
    Next y
  Next x
  
  ;-gestion du clavier
  ExamineKeyboard()
  clavier(#PB_Key_Right,1,0) 
  clavier(#PB_Key_Up,0,-1) 
  clavier(#PB_Key_Left,-1,0) 
  clavier(#PB_Key_Down,0,1) 
  
  If Bcompteur_animation_skull<16
    
    Bcompteur_animation_skull=Bcompteur_animation_skull+1
    Wx_skull=Wx_skull+Bdx_skull
    Wy_skull=Wy_skull+Bdy_skull
    carte(Int(Wx_skull/16),Int(Wy_skull/16))\Btuile=#spr_skull
    
    UseBuffer(#spr_couche_terre)
    If pousser_tuile=1
      DisplaySprite(#spr_roche,Wx_skull+16*Bdx_skull,Wy_skull)
    EndIf    
    DisplaySprite(#spr_galerie,Wx_skull,Wy_skull)
    UseBuffer(#PB_Default)
    
    If Bcompteur_animation_skull=16
      carte(Int(Wx_skull/16-Bdx_skull),Int(Wy_skull/16-Bdy_skull))\Btuile=#spr_galerie
      If pousser_tuile=1
        carte(Int(Wx_skull/16)+Bdx_skull,Int(Wy_skull/16))\Btuile=#spr_roche
        pousser_tuile=0
      EndIf
    EndIf
    
  EndIf
  
  Delay(10)
Until WindowEvent() = #PB_Event_CloseWindow  

; IDE Options = PureBasic 4.41 (Windows - x86)
; CursorPosition = 1
; Folding = -
; SubSystem = directx7

Hasta la vista !
Dernière modification par Huitbit le jeu. 25/févr./2010 4:37, modifié 3 fois.
Elevé au MSX !
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Presqu'un jeu !! Question sur le subsystem directx

Message par case »

je pense que la condition 'si on passe a coté' est mal vue j'ai vu le cas suivant tu trace une grande cheminée juste au dessus d'un bloc et tu laisse de la place sur le coté vers le bas tu remonte assez haut et tu pousse un bloc dans cette cheminée, le bloc tombe, se pose sur le bloc deja en bas et reste empilé il ne tombe que si l'on passe a coté comme si la gravité n'attendait que nous pour reprendre ses droits

je m'étais lancé dans un remake il y a quelques années en blitz ,) et pour moi tu devrais créer une liste chainée des tuiles en mouvement et a chaque boucle tester les elements dans la liste pour voir si il peuvent encore réagir avec l'environnement. a noter que le mouvement du personnage principal doit se faire en début de boucle sans quoi il pourrais se faire écraser par un rocher avant de pouvoir bouger ce qui est faux dans le boulder dash original ou l'on pouvais courir un rocher aux fesses tout le long du tableau et esquiver au dernier moment
ImageImage
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: Presqu'un jeu !! Question sur le subsystem directx

Message par Huitbit »

@case
Tu as raison pour la chute des pierres, c'est bizarre :lol: !
Déjà que les pierres tombent toujours du côté du joueur(quelle malchance ce Oldskull :twisted: )
Je vais le modifier(par contre, il y a un petit bug dans l'éboulement, des fois, les pierres ne finissent pas leur animation car un autre évènement a lieu, il faudra que je rajoute une condition, à suivre.... )

Code : Tout sélectionner

  ;->>éboulement 
       ; If Wy_skull>16*y     <<<<---l'éboulement se déclenchait dès que y_skull>y_"zone à risque"
          If Wx_skull>16*x     
            Bdx_tuile=1
          Else
            Bdx_tuile=-1
          EndIf
       ; Else 
       ;   Bdx_tuile=0
       ; EndIf
Il reste encore le cas où l'éboulement est impossible du côté du joueur, je devrai changer ça aussi!

Pour la liste chainée, idem. Avec le tableau choisi, 64*48(=3072 tuiles), j'ai toute de suite vu que je ne pouvais pas afficher toutes les tuiles (le ventilo faisait avancer mon PC :lol: )
Pour l'instant je travaille avec les tableaux pour voir ce que ça donne.

Merci pour les conseils!

Hasta la vista!
Elevé au MSX !
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Presqu'un jeu !! Question sur le subsystem directx

Message par case »

j'avais rien de spécial a faire cet après midi , aussi j'ai décidé de m'y remettre aussi ;)

j'ai pas mal avancé reste un éditeur de niveau et gérer les ennemis les objets spéciaux ;)
basiquement la on peux se déplacer et ramasser les diamants, se faire tuer par les rochers, il y a du son des sprites basiques eux aussi

c'est un source avec les images et les sons tout cela est 100% fait maison :)

voila c'est la

http://zorgrage.dyndns.org/boulder.rar
ImageImage
Robrock55
Messages : 65
Inscription : lun. 01/févr./2010 17:04
Localisation : Meuse
Contact :

Re: Presqu'un jeu !! Question sur le subsystem directx

Message par Robrock55 »

C'est bon ca ! 8)
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Re: Presqu'un jeu !! Question sur le subsystem directx

Message par Huitbit »

Hello,

Après un tsunami de copies et de bulletins me revoilà :P !

@case
Ca promet :P !
Les fondations de ton boulder sont prêtes, y a plus qu'à mettre un peu d'huile dans tes tuiles!

J'ai fait une grosse mise à jours du code (voir premier post).
Ca buggait pas mal quand il y avait beaucoup de cailloux alors j'ai fait le ménage dans le code.

Je n'ai pas été chiche avec les macros et les constantes car je ne voulais pas agrandir la structure ".carte" juste pour les éboulements.
Pour plus de clarté, j'ai mis les animations bien à part.

Il y a deux grosses zones de cailloux pour faire mumuse :mrgreen: !

Hasta la vista !

PS : (n'oubliez pas d'aller dans les options du compilateur et d'écrire "directx7")
D'ailleurs, personne n'a répondu à ma question :( :
A part mettre directx7, y a-t-il un autre moyen pour que UseBuffer() fonctionne de manière classique dans ce code ?
Elevé au MSX !
Répondre