PureBoulder

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

ca reviendrais à dire que le perso ne doit pas passer sous les pierres sous peine de mourrir
Faux. Cela dit il y a des variantes de boulderdash. La plupart des boulders qui admet que la pierre tombe si le perso est au dessous, la pierre ne tombe pas de suite mais laisses quelques millisecondes pour déguerpiller. Voir le post que j'ai fait à ce sujet plus haut.

Si tu regardes mon exemple, tu peux faire la ligne de diamand sans meme te faire écraser si tu passes rapidement. ce qui peut donner une montée d'adrénaline supplémentaire quand tu dois justement courrir pour attraper une ligne de diamand et que les pierres tombent une à une derrière toi.

Je préfère cette version qui plus est, est plus logique : si ya une pierre au dessus de toi, non maintenant elle te tombe sur la tronche non :D ca me semble plus logique.

Cela dit je présice que mon but est de faire un boulder, et non un clone de boulder :D
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

bombseb a écrit : tu vois que tu peux rester sous une pierre ou un diamant sans te faire tuer
et puis n'oublie pas aussi que tu peux pousser les pierres, et aussi que les pierres et diamants peuvent tomber si il y a du vide à coté !
Dans tout les cas, il va être bien complexe à programmer, avec plein de jolis variables avec lequel il va falloir jongler...
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

J'en chie déjà en fait je suis parti sur une technique, le problème va être de l'adapter à tout.

Cela dit je ne prétend pas faire le jeu de l'année :oops:
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

teste, faut tester, tout tester... puis foncer !

Message par beauregard »

Crystal Noir a écrit :J'en chie déjà en fait je suis parti sur une technique, le problème va être de l'adapter à tout.
je te comprend, car j'ai commencé à "étudier" pb avec des sprites classiques, mais je trouve que ça complique inutilement le code.

As-tu testé mon 2ème code ? il gère la transparence (touche - et + du pavé numérique) des blocs solides ? Chez moi c'est la fluidité absolu alors que je n'ai pas une machine de l'espace.

Tu peux modifier aisément le code, en donnant de la transparence à tout les sprites 3D.
Dernière modification par beauregard le mar. 24/juil./2007 23:29, modifié 1 fois.
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

il est ou ton deuxième code ? :D

en fait mon pb vient pas vraiment de la gestion des sprites, mais de l'algorithme qui gère la scène ou le tableau de jeu. A défaut de case et je continue bien entendu de programmer par case, je vais devoir faire une structure perso pour chaque case pour pouvoir gérer certains effets plus simplement, notamment les déplacements de case.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

le modérateur va me tuer, mais tant pis, je me sacrifie:

Code : Tout sélectionner

; ------------------------------------------------------------
; droit dans le mur - 2007 - source purebasic 4. et des poussières
;
; Collision sans fonction.
;
; France - Toulouse - H. Philippe - pseudo: beauregard
; ------------------------------------------------------------

;UsePNGImageDecoder () ; oui, toi t'es obligatoire.

If InitMouse ()=0 Or InitSprite ()=0 Or InitKeyboard ()=0 Or InitSprite3D ()=0 
     MessageRequester ( "Error" , "Can't open DirectX 7 or later" , 0)
     End
EndIf

Enumeration ; ici, on donne un petit nom à nos sprites( non, chuis pas un numéro !):
; tout en sprites3D, même le décor (pourquoi s'embéter ?):
     #fondA 
     #fondA3D
; dirigé par le joueur durand la phase de jeu:
     #champi ; 
     #champi3D 
; bloc solide:
     #blocs
     #blocs3D
   
; permet au progammeur de repèrer les positions des divers objets qu'il teste à l'écran:         
     #repere
     #repere3D          
EndEnumeration

;Global page.w=0,niveau.w=1
;Global placemX=512,placemY=384



; chamcoll-> =1 collision à droite, =2 collision à gauche.
Global champX.w, champY.w,chamcoll.w,champsol.w,champlafond.w
Global champsaut.w,champsautH.w,champsautV.w,champsautM.w

Global nbrebs 

Structure balle
id.l 
x.w
Y.w
sensx.l
sensy.l
sr.w
attract.w
EndStructure

Global NewList bs.balle(); bloc solide, c'est à dire infranchissable des 4 côtés. 
Declare Fchampignon()
Declare Fcloneblocs()





; Si votre PC ne peut pas afficher une haute résoution résolution en 32bit, Alors arrêt du programme.

;If OpenScreen (1440, 900, 32, "droit dans le mur" )=0 
If OpenScreen (1024, 768, 32, "droit dans le mur" )=0 
     MessageRequester ( "Error" , "Can't open a 1024*768 - 32 bit screen !" , 0)
     End
EndIf


; fond:
CreateSprite ( #fondA ,64,64, #PB_Sprite_Texture ) 
 StartDrawing ( SpriteOutput ( #fondA ))
  BackColor ( RGB (0,0,0))
   Box (0,0, 64, 64, RGB (8,8,120))

  LineXY (0, 0, 32, 0, RGB (88,8,88))  
  LineXY (32, 0, 0, 32, RGB (88,8,88)) 
  LineXY (0, 32, 0, 0, RGB (88,8,88)) 

  LineXY (64, 63, 48, 63, RGB (88,8,88)) 
  LineXY (48, 63, 63, 48, RGB (88,8,88)) 
  LineXY (63, 48, 63, 63, RGB (88,8,88)) 
    
 StopDrawing ()
CreateSprite3D ( #fondA3D , #fondA ) ; osons les amis, osons ! 




; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; champignon:
CreateSprite ( #champi ,64,64, #PB_Sprite_Texture ) ; objet dirigé par le joueur.
 StartDrawing ( SpriteOutput ( #champi ))
  BackColor ( RGB (0,0,0))
 
  Box (0,0, 128, 128, RGB (255,255,255))
 StopDrawing ()
CreateSprite3D ( #champi3D , #champi )  

; decor blocsolide (objet intéractif car il fait office à la fois de mur, sol et plafond).
CreateSprite ( #blocs ,64,64, #PB_Sprite_Texture )  
 StartDrawing ( SpriteOutput ( #blocs ))
  BackColor ( RGB (0,0,0))
  Box (0,0, 4, 64, RGB (0,104,0))
  Box (4,0, 4, 64, RGB (16,152,16)) 
  Box (8,0, 12, 64, RGB (0,208,0)) 
  Box (20,0, 4, 64, RGB (152,248,168))  
  Box (24,0, 4, 64, RGB (248,248,248))   
  Box (28,0, 4, 64, RGB (152,248,168)) 
  Box (32,0, 8, 64, RGB (80,232,80))
  Box (36,0, 4, 64, RGB (0,208,0)) 
  Box (40,0, 4, 64, RGB (16,152,16)) 
  Box (44,0, 12, 64, RGB (0,208,0))
  Box (56,0, 4, 64, RGB (16,152,16))
  Box (60,0, 4, 64, RGB (0,104,0))
 StopDrawing ()
CreateSprite3D ( #blocs3D , #blocs ) 
     





; repere ( utilisé uniquement par le programmeur):
CreateSprite ( #repere ,4,4, #PB_Sprite_Texture ) 
 StartDrawing ( SpriteOutput ( #repere ))
  BackColor ( RGB (0,0,0))
  Box (0,0, 4, 4, RGB (255,255,255)) 
 StopDrawing ()
CreateSprite3D ( #repere3D , #repere )


Global zutA,zutB,zutC ; pour repère la variable qui n'aurait la bonne valeur.
;MouseLocate(449,62)
tpb=255
; ******************************************************************************************************
Repeat ; Boucle principale
; ******************************************************************************************************


 ExamineMouse():ExamineKeyboard ()

If KeyboardPushed ( #PB_Key_Add ) And tpb<255:tpb+1:EndIf
If KeyboardPushed ( #PB_Key_Subtract ) And tpb>5:tpb-1:EndIf
 
       Start3D ()    

  For a=0 To 15 ; 1024/64=16
   For b=0 To 11 ; 768/64=12  
    DisplaySprite3D(#fondA3D, a*64, b*64, 255) ; 16*12
   Next
  Next    
   
   
   
   
; **********************************************************************************************
; fabrication bloc solide: 
 If nbrebs<1:nbrebs+1:Fcloneblocs():EndIf  

; Affichage clone bloc solide si existe:
 ForEach bs()

  ; chamcoll -> =1 collision à droite, =2 collision à gauche.     
  If champX+64>bs()\x-1 And champX+64<bs()\x+16
   If (champY>bs()\y+15 And champY<bs()\y+49) 
       chamcoll=1
   EndIf  
  EndIf
  If champX+64>bs()\x-1 And champX+64<bs()\x+16
   If (champY+16>bs()\y+15 And champY+16<bs()\y+49) Or (champY+48>bs()\y+15 And champY+48<bs()\y+49)
       chamcoll=1
   EndIf  
  EndIf
  
  If champX>bs()\x+48 And champX<bs()\x+65
   If (champY>bs()\y+15 And champY<bs()\y+49)      
       chamcoll=2
   EndIf  
  EndIf
  If champX>bs()\x+48 And champX<bs()\x+65
   If (champY+16>bs()\y+15 And champY+16<bs()\y+49) Or (champY+48>bs()\y+15 And champY+48<bs()\y+49)     
       chamcoll=2
   EndIf  
  EndIf
       
  ; champsol -> =1 collision avec la partie haute du bloc solide:
  If (champX+8>bs()\x+7 And champX+8<bs()\x+57) Or (champX+56>bs()\x+7 And champX+56<bs()\x+57)
   If (champY+64>bs()\y-1 And champY+64<bs()\y+16)    
       champsol=1:champY=(bs()\y-64)+1
   EndIf     
  EndIf     


  ; champlafond -> =1 collision avec le plafond
  If (champX+8>bs()\x+7 And champX+8<bs()\x+57) Or (champX+56>bs()\x+7 And champX+56<bs()\x+57)
   If champY>bs()\y+48 And champY<bs()\y+65    
       champlafond=1
   EndIf     
  EndIf 



     
   DisplaySprite3D ( bs()\id , bs()\x, bs()\y, tpb)  
 
 Next 
  
  
  
  
  
  
 ; Contrôlé par le joueur:
 If depart=0:depart=1:champX+512:champY+64:EndIf  
 
 Fchampignon()
   
  
   
   
   
   
     Stop3D ()



 ; ligne de test afin de connaître la valeur des variables:    
 StartDrawing ( ScreenOutput ())
 DrawingMode (1)
 FrontColor ( RGB (255,255,255))    
   
    chamcoll$= Str (chamcoll)    
    champsol$= Str (champsol) 
    champlafond$= Str (champlafond)
    
    tpb$= Str (tpb)     
     
    zutB$= Str (zutB) 
    zutC$= Str (zutC)    
    DrawText (50,1+20, "chamcoll: " +chamcoll$)
    DrawText (50,1+40, "champsol: " +champsol$)    
    DrawText (50,1+60, "champlafond: " +champlafond$) 
    
    DrawText (50,1+100, "testX: " +testX$)
    DrawText (50,1+120, "testY: " +testY$)
    
    DrawText (50,1+260, "zutB: " +zutB$);:zutB=0 
    DrawText (50,1+280, "zutC: " +zutC$);:zutC=0
            
    DrawText (350,20, "appuyez sur la touche R pour remise à 0 du code")
    DrawText (350,50, "appuyez sur la touche - ou + du pavé numérique ")
    DrawText (365,70, "niveau transparence des blocs solides: " +tpb$)
 StopDrawing ()

 
 Gosub fps ; nombre d'image par seconde. 
    
 If KeyboardPushed ( #PB_Key_R ):champX=0:champY=0:depart=0:tpb=255:EndIf ; reset
     
; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
; remise à 0 des variables avertissant d'une collision:
    chamcoll=0:champsol=0:champlafond=0  
; °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
;FlipBuffers (60) 
    FlipBuffers (): ClearScreen ( RGB (0,0,0))    
; ******************************************************************************************************     
Until KeyboardPushed ( #PB_Key_Escape ): End ; fin de la boucle principale (appuyez sur la touche Esc)
; ******************************************************************************************************   




fps:
If Val ( FormatDate ( "%ss" , Date ()))=sek ; regardez pas là, c'est trop compliqué. Arrêtez j'vous dis! Bon ben, je
     ; vous aurez prévenu...
    fps+1
Else
    FPS$= Str (fps)
    fps=0
EndIf
sek= Val ( FormatDate ( "%ss" , Date ()))
 
StartDrawing ( ScreenOutput ())
DrawingMode (1)
FrontColor ( RGB (255,255,255))
DrawText (1,1, "FPS: " +FPS$)



StopDrawing ()
Return

; ***********************************************************************************************
; ********************************* ici commence les procedures *********************************
; ***********************************************************************************************
Procedure Fcloneblocs() ; 64*64 fabrication clone bloc solide:

; placement clone bloc solide:

; faisons le sol:
 For a=0 To 15 
         LastElement(bs()) 
         AddElement(bs())
         bs()\id=#blocs3D         

  bs()\x=a*64:bs()\y=704
 Next

; faisons 2 autres blocs ( mur):
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=0:bs()\y=640
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=1024-64:bs()\y=640

; faisons un 1er plafond:
 For a=0 To 3 
         LastElement(bs()) 
         AddElement(bs())
         bs()\id=#blocs3D         

  bs()\x=a*64:bs()\y=512
 Next
; faisons un 2eme plafond:
 For a=0 To 2 
         LastElement(bs()) 
         AddElement(bs())
         bs()\id=#blocs3D         

  bs()\x=(a*64)+192:bs()\y=320
 Next
; faisons un 3eme plafond:
 For a=0 To 1 
         LastElement(bs()) 
         AddElement(bs())
         bs()\id=#blocs3D         

  bs()\x=(a*64)+640:bs()\y=192
 Next
  
; et faisont mumuse avec d'autres constructions...
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=448:bs()\y=640    
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=512:bs()\y=640 
 LastElement(bs()):AddElement(bs())
  bs()\id=#blocs3D:bs()\x=448:bs()\y=576 
  
EndProcedure
 
Procedure Fchampignon() ; 64*64

; chamcoll-> =1 collision à droite, =2 collision à gauche.

 If KeyboardPushed ( #PB_Key_Right ) And chamcoll<>1
   champX+6
   If champX>1024-64:champX-6:EndIf
 EndIf
 If KeyboardPushed ( #PB_Key_Left ) And chamcoll<>2
   champX-6
   If champX<0:champX+6:EndIf
 EndIf

 If KeyboardPushed ( #PB_Key_Up ) And champsol=1 And champsaut=0:champsaut=1:EndIf
 
 If champsaut=1
 
 
 
   If champsautH<15 ;H comme hauteur du saut
     champsautV=12:champsautH+1
   EndIf
   If champsautH+champsautM>14 And champsautH+champsautM<25 ; M comme modulable
     champsautV=10:champsautM+1
   EndIf
   If champsautH+champsautM>24 And champsautH+champsautM<35
     champsautV=8:champsautM+1
   EndIf

   champY=champY-champsautV; V comme vitesse de la montée lors du saut.

; si (joueur lache touche haut ET saut minimum effectué) OU hauteur saut maximal atteind, alors... 
   If (KeyboardPushed ( #PB_Key_Up )=0 And champsautH>14)  Or champsautH+champsautM=35 Or champlafond=1
     champsautH=0:champsautM=0:champsaut=0
   EndIf 
 EndIf
 
 
 If champsol=0 And champsaut=0 ;  si champignon ne touche plus le sol ET pas de saut, alors...
   champY+8
 EndIf

    DisplaySprite3D ( #champi3D , champX, champY, 255)



EndProcedure 
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

sympa le code, en revanche je n'utilise pas les collisions :D cela dit pour la transparence c'est pas mal :)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Crystal Noir a écrit :sympa le code, en revanche je n'utilise pas les collisions :D cela dit pour la transparence c'est pas mal :)
heu, merci, mais je réalise que la technique que tu utilise n'en as pas besoin, effectivement.

Par contre je ne comprend pas la difficulté que tu éprouve pour les déplacements, normalement plus simple à gérer, non ?
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

non pas forcément car en fait je ne bouge pas des sprites, mais je met à jour des cases, là est la différence. De ce fait pour le joueur par exemple je ne pouvais pas utiliser cette technique qui faisait un mouvement trop ample et brusque pour passer d'une case à une autre (comme dans les mégas vieux jeux :D)

j'ai donc fait cette même technique avec une variante de déplacement, avec un flag test si déplacement et si c'est le cas alors je le fais avancer ptit à ptit avec des variables. Ces variables permettent de faire avancer le joueur d'une case avec des intermédiaires de déplacement et pas d'un coup.

En fait je n'utilise pas les coordonnées réèl mais les coordonnées d'un tableau de 30 X 20. de ce fait une position x + 1 équivaut à un déplacement de 32 en réèl :) soit d'une case :)

Cela dit je sais comment je vais gérer certains déplacements (notamment les rochers qu'on pousse), meme technique que le joueur en fait, pour cela il faut que je modifie la structure concernant mes cases :)
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Je comprend. Mais pourquoi ? utiliser cette méthode sur un bon vieux c64 ou atari 800xl et leurs contraintes techniques, c'est légitime, mais aujourd'hui, avec les PC et purebasic entre les mains je suis perplexe.

bon, je vais essayer d'en coder un vite fait, hum ;) , et je te montrerai le code, bonne nuit ! :)
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

Je ne vois pas en quoi cette technique est réservée aux anciennes machines.

La technique des cases est vieille comme le monde et est encore très utilisé aujourd'hui notamment dans les jeux de reflexion.

Cela dit si tu regardes bien je n'utilise pas "mot pour mot" cette technique sinon le joueur n'aurait pas un déplacement fluide mais sauterait de case en case ce qui n'est pas le cas.

D'autre part je ne vois pas pourquoi j'utiliserai un déplacement de sprite alors que ce n'est que ponctuel dans le jeu concernant les cases. C'est plutôt une mise à jour de l'état de la case dans ce cas là. La case terre devient une case vide etc.

Après suivant les évènements rien n'empêche d'ajouter des effets (comme des particules pour les cases terre).

Pour ce genre de jeu, je trouve que le principe de mises à jour des cases est une bonne technique, mais l'un n'empeche pas d'avoir des déplacements fluide, la preuve je susi arrivé à le faire avec le joueur, pourtant on dirait bien qu'il avance comme un sprite :D

Il avance comme un sprite en fait le joueur, et les cases avanceront également comme des sprites lorsque j'aurais modifié la structure MAIS on aura toujours cette idée de mise à jour des cases SAUF que avec ma modification au lieu d'avoir des changements de case brusques on aura des déplacements, pour les rochers par ex qu'on pousse, à la manière du déplacement du joueurs.

Mais dans l'algo général on est bien en face d'un tableau avec mise à jour de case :D

En fait au lieu de dire le joueur pousse le rocher alors le rocher avance, je dis le joueur pousse le rocher donc la case change d'état et devient de l'air donc il faut que je fasse avancer le rocher, l'évènement vient pas du fait que le joueur pousse, mais que la case change d'état.

En fait un algo est ce qu'il est tant que le résultat qu'on veut est là :D

Pour ton code c'est sympa mais j'aime bien découvrir par moi même les possibilités et dieu sait qu'il y en a.

J'espère t'avoir un peu plus éclairé.

Après je ne suis pas une bête du code non plus donc après chacun son niveau :D
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

dodo

Message par beauregard »

bon, chuis cassé là, mais j'ai bien compris ta vision, et en voici une autre: je vois chaque case comme un clone. C'est plus court, hein ? :)
Lors de la fabrication des clones, lecture data et quand le personnage passe dessus, hop, tu supprime le clone, et là tu dis merci Fred pour cette simplicité.
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

bah c'est bien ce que je fais 8O

sauf que moi tes clones je les avais placé dans un tableau.

lorsque le joueur passe sur la case, lecture data de la structure, action en conséquence. c'est ce que je suis en train de faire en modifiant mon compte (la fameuse modification de la structure des cases).

Cela dit les datas qui seront lu lors du passage du joueur sur une case, équivaut à lire l'état de la case...ca revient au même sauf qu'au lieu d'utiliser un tableau, en mettant à jour les cases, on utilise une liste en mettant à jour l'occurence d'une structure case.

La version en cours non modifié, la seule différence avec ce qui est au dessus, c'est que les positions x et y des cases sont définies par l'emplacement de la structure case dans le tableau.

C'est pour cela que hier je disais que je voulais modifier la structure case afin de pouvoir jongler avec les coordonnées sans être limité par le tableau ;) Et en plus de pouvoir agir uniquement sur une ou les cases concernées par le mouvement en cours.

comme quoi nos idées se rencontrent :)

Donc au final au lieu de modifier juste l'état des cases, je pourrais modifier l'état les coordonnées etc...

J'aurais pu également utiliser une liste au lieu d'un tableau, cependant j'ai besoin d'avoir en permanence la position exacte des cases et pour cela rien ne vaut un bon tableau plutot que de tester la position de chaque case pour trouver la bonne dans une liste.

Cela dit pour être franc il y a des choses je ne sais pas encore comment j'vais les faire.
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Beauregard>mention spéciale pour les commentaires humoristiques, j'adore ! :D

je suis plutôt d'accord avec Bombseb sinon : dans le vrai boulderdash de mon enfance, le bloc ne tombe pas quand on est dessous. C'était d'ailleurs tout l'intérêt du gameplay et de la montée de l'adrenaline : speeder, se caler sous un bloc, réfléchir à 1 stratégie d'itinéraire et foncer de nouveau.

Je suis au bureau et je ne peux pas regarder ton code crystal. Mais d'après ce que je lis sur ton système de cases en tout cas, j'ai l'impression que ça rejoint mon projet (Puremarel). Mon echiquier est aussi représenté sous forme de cases.

Une question : tes cases sont-elles stockées dans un tableau à 2 dimensions (ligne et colone) ?
Si oui, j'ai trouvé une astuce très sympa et qui fait gagner un temps fou en rédaction et compréhension du code et manipulation du tableau : la technique de la boîte aux lettres.
Elle permet de coder un tableau à 2 entrées (x et y) en une seule dimension via un autre tableau (qui resssemble à une boite aux lettres, d'où son nom).

Si je suis pas hors sujet merci de me dire si ça peut t'être utile, et je détaillerai cette portion de code sous forme de tuto).
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

Et bien en fait au départ oui j'avais un tableau à deux dimensions.

Seulement cela me pose certains problèmes pour les déplacements des cases, c'est pour cela que je suis en train de tester avec une liste plutot qu'un tableau.

La ca peut être mieux seulement le problème que j'ai maintenant, c'est pour tester une case en particulier, je suis obligé de passer les cases une à une jusqu'à trouver la bonne ce qui facilite pas la gestion et prend du temps, car avec un tableau on a les coordonnées direct de la case qu'on veut tester...

Mais le tableau c pas top pour bouger les cases sans faire du case à case.

Bref chuis en plein test pour trouver ce qui m'ira le mieux. C'est un peu le bazar. un vrai casse tête :D

Quant aux rochers, ils tomberont dans ma version, j'ai toujours trouvé iréaliste de se trouver sous un rocher comme ca sans qu'il se casse la gueule :)

Après les goûts et les couleurs....Comme j'ai dit il y a plusieurs variantes du boulderdash.
Répondre