Problème procédure vs. listes chaînées

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Problème procédure vs. listes chaînées

Message par Octavius »

Je pense qu'il s'agit d'une erreur de débutant, mais je ne trouve pas la réponse...

J'explique la situation. J'essaie de faire un jeu de plate-forme en 2D. Les personnages sont composés de différents sprites et de différentes variables, j'ai créer une structure et une liste chaînée, chaque élément de la liste correspond donc à un personnage.

Dans ma boucle principale j'appelle une fonction (autant de fois qu'il y a de personnages) qui me permet d'afficher les sprites des différents personnages. Mais la procédure ne fonctionne pas, j'ai une erreur qui me dit que ma liste chaînée n'est pas reconnue, alors que quand je mets le code exécuté par la procédure dans la boucle principale tout marche parfaitement...

J'ai l'impression que le problème serait un peu similaire avec ce qu'on aurait avec des variables Global ou Protected. Comment faire pour que ma liste chaînée soient déclarée de manière "globale", pour pouvoir aussi être reconnue dans une procédure ?

PS: J'ai jamais eu de cours d'informatique de ma vie, j'apprends tout seul, alors j'aimerais autant que possible éviter de me compliquer la tâche avec des histoires Pointeurs/Accès mémoire, j'ai pas vraiment assimilé la manipulation de ces trucs.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Problème procédure vs. listes chaînées

Message par Backup »

Octavius a écrit :Comment faire pour que ma liste chaînée soient déclarée de manière "globale",

Global NewList MaListe.l() :)
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Yeah!

Incroyable, c'est tellement simple que j'y aurais jamais pensé tout seul!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Octavius a écrit :Yeah!

Incroyable, c'est tellement simple que j'y aurais jamais pensé tout seul!
:lol: :lol:
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Ah zut, sauf qu'en fait ça marche pas. Maintenant il reconnaît bien la liste chaînée, mais j'ai un nouveau message d'erreur me disant que ma liste chaînée n'a pas de structure, alors qu'en fait elle en a bien une et ça marche très bien quand je mets le code directement dans la boucle principale...

Donc, comment fait-on pour déclarer une structure de manière globale ? J'ai essayé avec Global mais ça marche pas.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

met ici un exemple qui fait ressortir ton probleme
cela aidera pour t'aider :)

voir aussi le mot "Shared" dans la doc !!
cela permet de partager une variable vers l'exterieur d'une procedure ...
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Je te mets le code de mon programme, c'est un peu long alors j'essaie de le racourcir :

Code : Tout sélectionner

;-Enumerations
;des différentes constantes du programme
Enumeration
;Planche des personnages
#char
;Corps du ninja bleu
;Côté droit
#Bright
#Bbody
#Bprot
#Barm
#Bpunch
#Bleg
#Bwalk
#Bjump
#Bsquat
#Bsqwalk
;Côté gauche
#Bleft
#BbodyL
#BprotL
#BarmL
#BpunchL
#BlegL
#BwalkL
#BjumpL
#BsquatL
#BsqwalkL
;Corps du ninja rouge
;Côté droit
#Rright
#Rbody
#Rprot
#Rarm
#Rpunch
#Rleg
#Rwalk
#Rjump
#Rsquat
#Rsqwalk
;Côté gauche
#Rleft
#RbodyL
#RprotL
#RarmL
#RpunchL
#RlegL
#RwalkL
#RjumpL
#RsquatL
#RsqwalkL
;Planche des décors
#dec
EndEnumeration

hdiff.w=#Bleft-#Bright    ;Permet de remplacer les constantes de la partie gauche et optimise ainsi le code

;-Structures
;Structure des personnages
Structure Char
cx.l
cy.w
body.w
arm.w
leg.w
pos.b
fall.b
jump.b
move.b
walk.b
run.b
prot.b
squat.b
EndStructure
Define.Char
Global NewList Ninja.Char()
Define.l

;Structure des décors
Structure Dec
dx.l
dy.w
EndStructure
Define.Dec
Global NewList Scene.Dec()
Define.l

;Initialisation des fonctions et du décodeur PNG, ouverture de l'écran 800*600
If InitSprite()=0 Or InitKeyboard()=0 Or InitMouse()=0 Or OpenScreen(800,600,32,"Battle Game")=0
MessageRequester("Erreur","Impossible de démarrer le programme.")
End
EndIf
UsePNGImageDecoder()

;Les données initiales concernant le héro!
AddElement(Ninja())
Ninja()\cx=400
Ninja()\cy=300
Ninja()\body=#Bbody
Ninja()\arm=#Barm
Ninja()\leg=#Bleg
Ninja()\pos=0
Ninja()\fall=0
Ninja()\jump=0
Ninja()\move=0
Ninja()\walk=0
Ninja()\run=10
Ninja()\prot=0
Ninja()\squat=0
FirstElement(Ninja())

;-Procédures

;Chargement des images principales et découpage des sprites
Procedure CutSprite()
TransparentSpriteColor(-1,RGB(128,128,128))  ;Transparence du gris par défaut
ClearScreen(RGB(128,128,128))  ;Ecran gris

LoadSprite(#char,"char.png") ;Chargement du sprite principal des personnages
DisplaySprite(#char,0,0) ;Affichage du sprite principal des personnages

;Création des sprites droits du ninja bleu
GrabSprite(#Bbody,1,1,25,30)  ;haut du corps
GrabSprite(#Bprot,1,64,25,30)  ;haut du corps protection
GrabSprite(#Barm,1,48,20,15)  ;bras
GrabSprite(#Bpunch,1,32,20,15)  ;bras au combat
GrabSprite(#Bleg,27,1,31,26)  ;jambes
GrabSprite(#Bwalk,27,28,31,26)  ;jambes en marche
GrabSprite(#Bjump,59,1,31,26)  ;jambes en saut
GrabSprite(#Bsquat,59,28,31,26)  ;jambes accroupi
GrabSprite(#Bsqwalk,27,55,31,26)  ;jambes accroupi en marche
;Création des sprites gauches du ninja bleu
GrabSprite(#BbodyL,92,1,25,30)  ;haut du corps
GrabSprite(#BprotL,92,64,25,30)  ;haut du corps protection
GrabSprite(#BarmL,92,48,20,15)  ;bras
GrabSprite(#BpunchL,92,32,20,15)  ;bras au combat
GrabSprite(#BlegL,118,1,31,26)  ;jambes
GrabSprite(#BwalkL,118,28,31,26)  ;jambes en marche
GrabSprite(#BjumpL,150,1,31,26)  ;jambes en saut
GrabSprite(#BsquatL,150,28,31,26)  ;jambes accroupi
GrabSprite(#BsqwalkL,118,55,31,26)  ;jambes accroupi en marche

;Création des sprites droits du ninja rouge
GrabSprite(#Rbody,1,126,25,30)  ;haut du corps
GrabSprite(#Rprot,1,189,25,30)  ;haut du corps protection
GrabSprite(#Rarm,1,173,20,15)  ;bras
GrabSprite(#Rpunch,1,157,20,15)  ;bras au combat
GrabSprite(#Rleg,27,126,31,26)  ;jambes
GrabSprite(#Rwalk,27,153,31,26)  ;jambes en marche
GrabSprite(#Rjump,59,126,31,26)  ;jambes en saut
GrabSprite(#Rsquat,59,153,31,26)  ;jambes accroupi
GrabSprite(#Rsqwalk,27,180,31,26)  ;jambes accroupi en marche
;Création des sprites gauches du ninja rouge
GrabSprite(#RbodyL,92,126,25,30)  ;haut du corps
GrabSprite(#RprotL,92,189,25,30)  ;haut du corps protection
GrabSprite(#RarmL,92,173,20,15)  ;bras
GrabSprite(#RpunchL,92,157,20,15)  ;bras au combat
GrabSprite(#RlegL,118,126,31,26)  ;jambes
GrabSprite(#RwalkL,118,153,31,26)  ;jambes en marche
GrabSprite(#RjumpL,150,126,31,26)  ;jambes en saut
GrabSprite(#RsquatL,150,153,31,26)  ;jambes accroupi
GrabSprite(#RsqwalkL,118,180,31,26)  ;jambes accroupi en marche

ClearScreen(RGB(128,128,128))  ;Ecran gris, pas de FlipBuffers() donc pas d'affichage de l'opération de découpage
EndProcedure

;Déplacement des personnages, vérification des collisions
Procedure CharMove()

EndProcedure

;Assemblage et affichage des personnages
Procedure DispChar()

DisplayTransparentSprite(Ninja()\body+Ninja()\pos*hdiff,Ninja()\cx-1+8*Ninja()\pos-Ninja()\squat+2*Ninja()\squat*Ninja()\pos,Ninja()\cy-23+Ninja()\squat*4)
If prot=0
DisplayTransparentSprite(Ninja()\arm+Ninja()\pos*hdiff,Ninja()\cx+15-19*Ninja()\pos-Ninja()\squat+2*Ninja()\squat*Ninja()\pos,Ninja()\cy-12+Ninja()\squat*4)
EndIf
DisplayTransparentSprite(Ninja()\leg+Ninja()\pos*hdiff,Ninja()\cx,Ninja()\cy)

EndProcedure

;Appel de la procédure d'initialisation et de découpage des sprites
CutSprite()

;-Boucle Principale
;s'arrête avec la touche Echap
Repeat

ExamineKeyboard()

If KeyboardPushed(#PB_Key_Escape)<>0
End
EndIf

DispChar(Ninja())

FlipBuffers() ;Affichage de l'écran créé
ClearScreen(RGB(255,255,255))  ;Réinitialisation de l'écran-arrière

ForEver
Ce qui pose problème c'est la procédure DispChar() dans laquelle j'utilise la liste chaînée Ninja() qui a pour Strucutre Char.
Anonyme

Message par Anonyme »

ligne 196

Code : Tout sélectionner

DispChar(Ninja())
Cette fonction que tu as créer ne prend pas de paramètre.

ensuite , de mon point de vue perso, s'attaquer à un jeu de plateforme n'est pas si évident que cela, c'est même hardu, je sais de quoi je parle, j'en ai fait un embryon.
je ne veut pas te cassé ou quoi que se soit, mais ton code fait vraiment fouilli
tu devrais le segmenté en plusieurs fichier , car tu vas vite arrivez à 5000 ligne de code voir plus.
je serais toi, je ferais d'abords des petit jeu , genre tetris, pacman, casse brique, pong, etc... de manière à voir comment s'organisé , il faut que tu puisses dans 4 mois ou dans 1 ans après la sortie de ton jeu remettre le nez dans ton code pour pouvoir l'améilliorer ou autre... mais là c'est pas gagner.
tu fait de toute facon comme tu le sens , je ne suis pas là pour te donner des lecons ou étalé ma science ,
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

comme le souligne justement Cpl.Bator

d'un coté tu declare une procedure

Code : Tout sélectionner

Procedure DispChar()
donc sans paramètres

et de l'autre tu l'appel avec un paramètre

Code : Tout sélectionner

DispChar(Ninja())
:?
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

Dans les tutos, j'ai fait un tuto complet sur les listes chainées et les structures.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Oui j'ai retiré l'argument, c'était une erreur d'étourderie, mais ça ne résout pas le problème, essayez de mettre le code dans votre PB et vous verrez l'erreur que j'ai...

EDIT:
Ah ben si en fait c'était ça! J'avais enregistrer plusieurs versions et j'utilisais celle où il y avait encore cette erreur... Et bien merci!

Sinon Cpl.Bator, ce n'est pas le premier programme que je fais, mais c'est vrai que c'est le premier vrai jeu que je tente. Je sais que je m'attaque à un truc assez dur mais j'ai qd mm envie d'essayer, au moins pour arriver à un embryon de jeu fonctionnel. Qu'est-ce que tu entends par "fouilli" ? J'ai essayer de mettre plein de commentaires partout pour savoir à quoi sert tel truc, et j'ai diviser mon code en grandes sections grâce à ;- pour pouvoir m'y retrouver plus facilement. Qu'est-ce que tu me conseillerais pour mieux m'organiser ?
Anonyme

Message par Anonyme »

bah en fait , c'est comme tu le sens.
moi pour m'organisé , mon code est dans plusieurs fichiers , pour un jeu de plateforme , je fait comme ca :

1 fichier pour :

- la gestion des maths ( vecteur & co )
- la gestion de la carte
- la gestion des objets
- la gestion du joueur
- la gestion des ennemis
- etc...

j'essaye aussi un maximum d'aéré mon code , indentation, etc...
de facon a se que cela soit clair & net , je me met à la place d'un autre qui lit la source. de cette facon, je peut mettre en pause le projet , et puis le reprendre beaucoup plus tard.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui le system des include n'est pas mal,
moi aussi j'ai tendance a utiliser un seul fichier !! :D

j'ai pas trop les include , pour le debuggage, c'est pas tres pratique
a moins d'avoir tout les fichier ouvert dans des onglets de l'éditeur !! :)
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Je ne sais pas si c'est parce que je débute, mais j'ai tendance à préférer un seul fichier bien organisé plutôt que plusieurs fichiers qui m'embrouillent...

Quand j'aurais réussi à faire un petit embryon de jeu fonctionnel je posterai l'exécutable et le code source sur le forum!
Avatar de l’utilisateur
Crystal Noir
Messages : 892
Inscription : mar. 27/janv./2004 10:07

Message par Crystal Noir »

Moi j'utilise les includes pour mes procedures notamment ou pour des parties de programmes récurentes;
Répondre