Presqu'un jeu ! Question sur le subsystem directx (MAJ code)
Publié : sam. 20/févr./2010 6:03
Hello,
Je bosse sur Oldskull4 et Oldskull3 (même si ça ne plaît pas à Norton
).
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
)
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)
Hasta la vista !
Je bosse sur Oldskull4 et Oldskull3 (même si ça ne plaît pas à Norton

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

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)

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 !