Niveau

Programmation avancée de jeux en PureBasic
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Niveau

Message par garzul »

Voila j'ai un probleme au niveau de mon code car j'ai fais ce que vous m'aviez dit c'est a dire avec les datas ( merci dobro et tout le monde ) puis j'ai réussi a faire un genre de map mais le seul probleme c'est qu'avec mon code le sprite avance de 32 alors que je ne veux pas qu'il avance mais qu'il colle l'image sur la position d'ou il etait avant comme un editeur de map ( avec des datas ) je sais pas si vous avez compri mais regardez mon code , en faite pour faire simple je veux que si le datas et egale a 1 il m'affiche un mur etsi il et de 0 sa ne m'affiche rien :

Code : Tout sélectionner

  Procedure Jeux()
    
    ;Création du niveau 1 avec les datas 
   
      
      Restore Niveau1 ; on restaure le label niv1
      Read a ; On lit les datas stocke dans a
      
        If a = 1 ; si a = 1
            
           DisplaySprite(#Mur,Murx , Mury) ;on affiche le mur au coordoner 
           Murx = Murx + 32 ; et on ajoute 32
        
        EndIf
        
           If a = 0
          
           EndIf
        
              If a = 88
          
                 Mury = Mury + 32
                 Murx = 0
          
              EndIf
              

                If a = 1 ; si a = 1
                
                  ;  DisplaySprite(#Mur,Murx, Mury) ;on affiche le mur au coordoner 
                  Murx = Murx + 32 ; et on ajoute 32
                
                EndIf
              
  EndProcedure
Et les datas :

Code : Tout sélectionner

DataSection

Niveau1 :

Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88
Data.l 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,88


EndDataSection 
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je ne sais pas si j'ai bien compris ton charabia

1) Je ne vois aucun data à 0, c'est normal ?
Comme les datas valent soit 1 soit 88, la condition d'affichage du mur sera toujours vrai (sauf pour 88)

2) structure le code de manière à éviter des tests inutiles (utilise Elsif et Else)

Code : Tout sélectionner

If a = 1 ; si a = 1 
            
           DisplaySprite(#Mur,Murx , Mury) ;on affiche le mur au coordoner 
           Murx = Murx + 32 ; et on ajoute 32 
        
        EndIf 
        
           If a = 0 
          
           EndIf 
        
              If a = 88 
          
                 Mury = Mury + 32 
                 Murx = 0 
          
              EndIf 
devient

Code : Tout sélectionner

If a = 1 ; si a = 1 
            
           DisplaySprite(#Mur,Murx , Mury) ;on affiche le mur au coordoner 
           Murx = Murx + 32 ; et on ajoute 32 
        
        elseIf  a = 88 
          
                 Mury = Mury + 32 
                 Murx = 0 
          
              EndIf 
pas besoin de tester le 0, ni le3, ni le 4 ni le 5 etc puisque l'on ne fera rien.
On ne fait une action que si la data lue vaut 0 ou 88.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Remplace 3 par le nombre de ligne de ta map
et 4 par le nombre de colonne

Code : Tout sélectionner

For V = 0 To 3
  For u = 0 To 4
    Read mur
    If mur 
      DisplaySprite(#mur,u*SpriteWidth(#mur),V*SpriteHeight(#mur))
    EndIf
  Next u
Next V

Data.l 1,1,1,1,1
Data.l 1,0,0,0,1
Data.l 1,0,0,0,1
Data.l 1,1,1,1,1
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:? :mad: Sa m'enerve ses data ( pk je ne les ai pas utiliser avant ) on peut pas faire data 1,0,0,0,0,1,1,1,1

et donc sa va nous afficher un mur puis 4 vide puis 4 mur car la sa m'affiche un gross bloc en transformant le code de comtois pour mon jeux .
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message par Aranoth »

moi j'utilise les tableau pour les maps

Dim Map(tilesx,tilesy)


Combiné avec une structure du genre:

Structure map
tile.l
collision.b
couche.b
aff.b
Endstructure

C'est très pratique ! :P
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Moii je voudrai utiliser les data comme sa je saurais les utiliser :D ( mais c pas gagner :mad: )
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Bon ben finalement je laisse tomber les data je prend les tableau :D
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

garzul a écrit ::? :mad: Sa m'enerve ses data ( pk je ne les ai pas utiliser avant ) on peut pas faire data 1,0,0,0,0,1,1,1,1

et donc sa va nous afficher un mur puis 4 vide puis 4 mur car la sa m'affiche un gross bloc en transformant le code de comtois pour mon jeux .

Il ne faut pas oublier de mettre un Restore si tu utilises le code tel que je te l'ai montré !

Mais bien sûr , le mieux c'est de combiner tableau et data :)

En clair tu lis tes datas ,tu les stockes dans un tableau , et ensuite tu fais ta procédure d'affichage du décor en utilisant le tableau .
ou alors ,tu lis un fichier pour remplir ton tableau .

Code : Tout sélectionner

Restore Map
For V = 0 To 3 
  For u = 0 To 4 
    Read mur 
    If mur 
      DisplaySprite(#mur,u*SpriteWidth(#mur),V*SpriteHeight(#mur)) 
    EndIf 
  Next u 
Next V 

DataSection
Map:
Data.l 1,1,1,1,1 
Data.l 1,0,0,0,1 
Data.l 1,0,0,0,1 
Data.l 1,1,1,1,1
EndDataSection

Code : Tout sélectionner

InitKeyboard() 
InitSprite() 

OpenScreen(640,480,32,"") 
  
Enumeration 
   #mur
  #herbe
EndEnumeration 

;Sprite Mur
CreateSprite(#mur,32,32) 
StartDrawing(SpriteOutput(#mur)) 
Box(0,0,32,32,RGB(228,128,128))
For i = 0 To 100
  Plot(Random(32),Random(32),RGB(150,30,30))
Next i 
StopDrawing() 

;Sprite Herbe
CreateSprite(#herbe,32,32) 
StartDrawing(SpriteOutput(#herbe)) 
Box(0,0,32,32,RGB(128,228,128))
For i = 0 To 100
  Plot(Random(32),Random(32),RGB(30,150,30))
Next i  
StopDrawing() 

Procedure Decor()  
;Indispensable !! 
Restore Map
  
  For V = 0 To 3 
  For u = 0 To 4 
    Read Decor 
    ;Plutôt que de faire ce test , les datas pourraient contenir directement le No du sprite 
    ; on aurait : DisplaySprite(Decor,u*SpriteWidth(Decor),V*SpriteHeight(Decor)) 
    If Decor 
      DisplaySprite(#mur,u*SpriteWidth(#mur),V*SpriteHeight(#mur)) 
    Else
      DisplaySprite(#herbe,u*SpriteWidth(#herbe),V*SpriteHeight(#herbe))  
    EndIf 
  Next u 
Next V 
EndProcedure
Repeat 
  FlipBuffers() 
  
  ExamineKeyboard() 

  Decor()

Until KeyboardReleased(#PB_Key_Escape) 



DataSection
Map:
Data.l 1,1,1,1,1
Data.l 1,0,0,0,1 
Data.l 1,0,0,0,1 
Data.l 1,1,1,1,1
EndDataSection
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

La j'ai bien compris , je pense qu'il me fallait un exemple MERCI COMTOIS et tous les autres pour m'avoir aider . :P 8)
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

Sa marche completement merci comtois :P
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

je pense que la méthode de Comtois est la mieux pour éviter de se mélanger les pinceaux.
De plus, il est ensuite très facile de remplacer la data par un fichier texte et ainsi avoir plusieurs niveaux
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
garzul
Messages : 683
Inscription : mer. 26/mai/2004 0:33

Message par garzul »

:D Oui la methode de comtois et effectivement pour moi la plus simple :) , Pour le fichier texte LSI moi je vais utiliser les restore car je code un jeux qui et sans media (meme pas un ^^ ) .
Répondre