|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2007 Messages : 46 ![]() |
salut
En ce moment, j'apprends le purebasic, et j'aimerai réaliser un jeu en 2Diso. Jusqu'à maintenant, tout se passe plutôt bien, mais je rencontre un problème pour faire le tri de mes sprites suivant y. Par exemple, lorsque le personnage passe devant un arbre, il doit être affiché devant et non derrière Voici donc un essai de code pour du Z-order (ou depth) : Code :
Car si je laisse Code :
SortStructuredArray(tableau_obj(), #PB_Sort_Ascending, OffsetOf(objet\y), #PB_Sort_Long) Et si j'enlève ce code, l'affichage des éléments est correct (leur emplacement défini après la structure), mais le Z-order n'est plus correct. Théoriquement, j'ai trouvé la solution, mais je ne parviens pas à la mettre en pratique : - je pense que je dois utiliser 2 tableaux (ou listes) : le premier tableau est le tableau que j'ai déjà, avec les objets et leur y. - un 2ème tableau qui est classé en fonction du Y (ascendant) chaque élément du 1 er tableau. Cela me fait penser aux pointeurs, mais je ne sais pas comment m'y prendre pour résoudre ce problème Cela dit, après, il faudrait que j'affiche les sprites dans l'ordre ascendant de leur y, et donc, j'aurai toujours un problème. Donc, si quelqu'un sait comment je peux faire ce Z-order (ou depth, ou encore tri), n'hésitez pas à m'en informer Merci d'avance. les images utilisées sont là : http://blendman.free.fr/dev/pb/arbre.png http://blendman.free.fr/dev/pb/perso.png |
||
|
|
00
|
|
|
#2 | ||
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
Sauf erreur de ma part, faire un tri sur la position en y des sprites ne pourra pas fonctionner. C'est possible de le faire, mais imagine que ton personnage se déplace de haut en bas devant un arbre :
Prenon le cas où au départ le perso est plus haut qu'un arbre, le perso sera donc affiché en arrière plan selon ta technique. Ensuite tu diriges vers le bas ton perso, et dès que ses pieds seront plus bas que l'arbre le perso sera affiché en avant plan ! alors que c'est le même arbre, ça va donner un effet assez curieux. Je pense que tu devrais plutôt gérer des couches sur ta map : - Une couche inférieure avec un décor statique - Une couche dynamique avec les persos qui s'y déplacent - Une couche supérieure avec un décor statique de cette façon tu n'auras plus de problèmes de calcul de profondeur, tu as juste à afficher tes couches les une après les autres. Bien sur sur chaque couche statique tu pourras effectivement gérer une profondeur en testant la position en y, tu ne fais le calcul qu'une fois, puisque le décor est statique. J'ai quand même modifié ton code pour que tu puisses constaté par toi même ce que je raconte plus haut. Code :
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
||
|
|
00
|
|
|
#3 |
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
Sinon la gestion d'une caméra serait sympa
c'est à dire que que tu ne déplaces le décor que si le personnage arrive sur les bords de la carte.
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
un 'tuto' sur le z order
Effectivement quand je vois l'image du perso avec le rocher, c'est peut-être bien de garder le concept du z-order à condition de gérer les collisions pour éviter de le voir traverser le rocher de haut en bas. C'est pour ça que ça me faisait bizarre avec les arbres, les collisions ne sont pas encore gérées.
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
|
|
00
|
|
|
#5 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2007 Messages : 46 ![]() |
salut Comtois.
Merci pour ta correction, j'étais parvenu à faire le tri, mais ton exemple avec le tableau temporaire est bien meilleur niveau performance et c'est ce que je cherchais à faire. Alors, un grand merci à toi ! Concernant le tri en "Z-order", c'est un système utilisé par pas mal d'éditeur de jeu (comme game maker ou construct). Et en général, ça fonctionne plutôt bien, donc, je pensais qu'il serait intéressant d'adapter ce système pour mon jeu Citation:
- les block collisions : des sprites invisibles que le personnages doit contourner (par exemple le pied de l'arbre) - une sorte de pathfinding : j'espère gérer par la suite un "pseudo" pathfinding (peut-être pas un A* complet, mais au moins un système genre : clic & go (on clique et le personnage se dirige à l'endroit souhaité, en contournant les blocks collisions). Citation:
A ce propos, pour le scrolling, la méthode que j'utilise est la bonne ? Il existe un système de caméra avec purebasic, ou on doit le faire à la main ? Autres questions : - comme on le voit, il y a un problème au niveau du "centre" des objets (ou hotspot). Pour le moment, le personnage passe derrière l'arbre tout en haut (et non à ses pieds). J'essaie de corriger ça, car j'ai bien mis les paramètres pour gérer ça, mais ça ne doit pas être correct car ça ne marche pas - je pense que pour encore optimiser ça, il ne faudrait vérifier que les arbres qui se trouvent à proximité du joueur (en X et Y) et dans le même écran que le joueur, mais comment dois-je faire pour récupérer le/les coordonnées des arbres proches du joueur ? je dois à nouveau utiliser une boucle for ? - dernière question : il est possible d'utiliser une liste chainée, mais comment récupère t-on un paramètres précis d'un élément d'une liste chainée (l'équivalent de : If tableau_obj(122)\Sprite = #arbre ,par exemple pour savoir si le sprite de l'ément 122 du tableau tableau_obj =#arbre, mais avec une liste chainée) En tout cas, encore un grand merci pour toutes ces informations. Lorsque j'aurai terminé ce système complet, je me disais que j'essaierai peut être de faire un tutoriel pour les débutants (comme moi Des tutoriels complets consacrés à la 3Diso ou plutôt la 2Diso, on n'en trouve assez peu souvent. EDIT : voici le code corrigé : - gestion de la caméra. On doit pouvoir l'optimiser, mais il fonctionne. - gestion des "hotspots" ou centres des objets : maintenant le personnage passe devant/derière l'arbre quand il est à ses pieds Pour changer la taille des bords, ce sont les paramètres horBord et vertbord. Ce n'est pas génant d'avoir beaucoup de variable globale ? Je sais que je peux utiliser les "shared", mais les globales ont l'air plutôt facile d'utilisation Cela dit, peut être devrai-je créer une structure generale ou "view" et un tableau structuré pour gérer ces variables plutôt que d'avoir beaucoup de variables globales. Code :
|
||||
|
|
00
|
|
|
#6 | ||
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
Tous les exemples de map que je connais utilisent le système de la 'tuile', tous les sprites ont le même format, c'est plus facile à gérer dans un tableau. N'est-ce pas aussi le principe de RPGMaker que tu utilises ? ou il permet aussi de gérer des sprites de différentes tailles ?
Avec ce système tu peux avoir des maps immenses, et ne te soucier que de la portion qui sera affichée, pour tous les tests, comme les collisions, le pathfinding, etc. Exemple d'affichage (la carte ne ressemble à rien , elle est aléatoire) Ce code me permet d'afficher la carte dans un cadre, ou d'afficher autant de fois la même carte qu'il y a de joueurs. ici j'ai mis 2 joueurs le premier se déplace avec le curseur, et le second avec les touches QSDZ. Sinon oui, évite de mettre des variables globales. L'exemple ci-dessous n'est pas à suivre, j'ai déclaré un tableau en global Code :
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
||
|
|
00
|
|
|
#7 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2007 Messages : 46 ![]() |
Bonjour Comtois, merci de tes réponses, et merci aussi pour ton exemple qui est très intéressant
J'ai pu apprendre que je pouvais utiliser des structures à l'intérieur de structures, ce qui est vraiment très utile. Citation:
Je ne sais pas si tu connais un peu des jeux comme Dofus, mixmaster, Goonzu ou encore t4c, mais je crois que leur système est multiple : utilisation de tuiles (tiles) pour le sol, mais les autres éléments sont des sprites ayant des tailles différentes. Du coup, je pense qu'ils utilisent la méthode de tri par y sur ces objets-là. Citation:
Mais je ne pense que rpg maker utilise des sprites dans n'importe quelle taille (genre 152*18), comme je le fais Citation:
Je ferai quelques tests pour voir. Citation:
Par quoi aurais-tu du remplacer ton tableau global pour y avoir accès ? J'ai regardé un peu le code, mais il y aune notion que je ne maitrise pas encore très bien, ce sont les pointeurs (* et @). Il va falloir que je fasse plusieurs essais je pense pour bien cerner ce système car visiblement c'est très utile. une dernière question : sais-tu comment on accède à un champs précis d'un élément d'une liste structurée ? Encore un grand merci en tout cas |
||||
|
|
00
|
|
|
#8 | |||||||
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
pour l'accès d'un champ c'est le même principe pour une liste chainée que pour les tableaux.
Code :
Citation:
Code :
Code :
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
|||||||
|
|
00
|
|
|
#9 | |
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
Citation:
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
|
|
|
00
|
|
|
#10 | ||||||||
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2007 Messages : 46 ![]() |
salut Comtois, merci de tes réponses.
Citation:
Ce serait effectivement plus intéressant J'essaierai aussi par la suite faire comme ton exemple, c'est à dire de tout gérer dans un tableau qui découperait la carte, peut être en plusieurs écrans liés à la résolution de la fenêtre par exemple. Imaginons que la map fasse 4000*3000 et la résolution de la fenêtre fasse 800*600, je découperai donc en 5*5, soit 25 partie (ou sous-écran). Je n'aurai alors qu'à en gérer au maximum 4 (si on est en haut à droite par exemple, entre plusieurs sous-écrans). Citation:
Avec un tableau c'est facile pour modifier le champs "vie" de l'élément 23 du tableau personnage, on fait ceci : Pour une liste, je crois que je dois utiliser cette technique-ci (par exemple, pour modifier le 1er élément dans ton exemple): Code :
Citation:
Si j'ai bien compris, c'est une sorte de dictionnaire, mais concrètement, dans un jeu d'aventure/rpg, je pourrais m'en servir pour faire quoi par exemple ? Stocker le nom des personnages par exemple ? ou des objets de drop ? |
||||||||
|
|
00
|
|
|
#11 | ||||
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
Citation:
Dim Carte(800, 600) ; Avec une grille 5x5 tu obtiens bien ta carte de 4000x3000. De cette façon tu peux parcourir l'ensemble de ta carte avec un seul tableau. Par contre ça t'impose de positionner tes sprites en fonction de cette grille. C'est gênant d'avoir un quadrillage pour positionner tes objets ? Tu auras juste à désigner les cases qui sont infranchissables pour gérer ton Pathfinding. Un exemple de pathfinding avec PureBasic. Citation:
Mais c'est clair que c'est le principe d'une liste, il faut parcourir chaque élément jusqu'à trouver celui qui t'intéresse, car ils sont chainés. Pour les tables de hachages, je manque de connaissance et de pratique. Comme je comprends la chose pour l'instant, je dirais que c'est utile quand on doit gérer beaucoup de données, et qu'on a besoin de retrouver rapidement une de ces données sans avoir à parcourir toutes la liste. Pour m'exercer j'avais récupéré des listes de mots de la langue françaises sur le net et j'avais codé un dictionnaire. Utile pour tricher dans les jeux de lettres Pour un jeu type RPG, j'avoue que je ne me suis pas encore penché sur la question. Mais ça doit sûrement servir. Je crois que tu en sentiras le besoin quand tu seras saturé de données à gérer Tu peux toujours demander sur le forum jeux de dvp, y'a des calés qui trainent par là.
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
||||
|
|
00
|
|
|
#12 | |||||
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2007 Messages : 46 ![]() |
Citation:
Une seule grande carte découpée dans un tableau par exemple. Citation:
cela dit, les sprites seront "contenus" dans une case du tableau (ou à cheval, et je peux peut être faire une condition pour l'affichage du genre : j'affiche telle case du tableau à l'écran, si le sprite est contenu dans la case, j'affiche le sprite. cool pour cet exemple, mais je n'ai pas encore la version complète de PB (je vais bientôt l'acheter je pense Je pourrais tester cet exemple prochainement. Citation:
Citation:
Citation:
J'avais déjà posté il y a quelques années (2007 si je me rappelle bien), toujours pour se même projet |
|||||
|
|
00
|
|
|
#13 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2007 Messages : 46 ![]() |
j'ai essayé de corriger mon exemple, mais je rencontre un problème avec le centre de mes sprite (arbre) et je ne comprends pas.
Le code : Code :
une idée du problème ? les images pour ce test : http://blendman.free.fr/dev/pb/arbre1.png http://blendman.free.fr/dev/pb/arbre2.png http://blendman.free.fr/dev/pb/arbre3.png http://blendman.free.fr/dev/pb/perso.png Merci |
||
|
|
00
|
|
|
#14 | ||
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
Comme le sujet m'intéresse, j'avais commencé sur une idée, que je vient de tester, ça fonctionne presque sauf que je n'avais pas pensé à un truc ! donc c'est à revoir !
L'idée consiste à tester les arbres en collision avec la caméra, pour ne prendre en compte que ceux là. Ensuite je teste les arbres en collision avec le perso, en me disant que je n'ai besoin de calculer le Zorder que pour ceux là, et c'est là mon erreur Donc il faudra recalculer le Zorder pour tous les arbres en collision avec la camera. Je te mets le code tel qu'il est aujourd'hui pour que tu puisses te faire une idée , en sachant que le résultat n'est pas encore satisfaisant J'utilise tes 3 types d'arbres Code :
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
||
|
|
00
|
|
|
#15 | ||
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
voila avec cette procédure ça devrait être mieux, tu peux remplacer la procédure update() par celle ci :
Code :
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
||
|
|
00
|
|
|
#16 |
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
Si tu as beaucoup d'objets dans ton projet, peut-être que plus tard tu devras songer au QuadTree ou à un autre système qui te permet d'organiser tes données.
Exemple ici
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
|
|
00
|
|
|
#17 | |||||
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2007 Messages : 46 ![]() |
salut Comtois, super ton exemple, il fonctionne super bien et sera encore mieux, avec la petite correction
Citation:
Ou alors, , il faut vérifier la collision entre le joueur et l'arbre non pas rapport au sprite, mais par rapport à un bloc collision invisible situé aux pieds de l'arbre (et du joueur) qui aurait cette forme-ci : http://blendman.free.fr/dev/pb/blockCollision.png L'idée étant la suivante : on ne déplace pas le jouer, mais le block collision du joueur. Et le sprite joueur, quand à lui a son x =blockColision.x et y=blockCollision.y enfin, je schématise, mais je pense qu'on comprend l'avantage, c'est ensuite pour calculer une sorte de pathfinding, avec d'autres blocks collisions (invisibles, toujours). Le joueur n'évitera donc pas les collisions avec les arbres, mais c'est son block collision à lui qui verifiera les collision avec les block collision invisibles de la map. Autre chose : j'avais commencé à tester un chargement de map, issu d'un fichier texte, mais pour le moment, je n'ai pas réussi. est-il possible d'intégrer cela ? par exemple, imaginons qu'une map ressemblerait à ceci (si on utilise un fichier type ini/pref (ce n'est sans doute pas la meilleure solution): Code :
Code :
Donc, la 1ère ligne signifierait : un sprite (arbre1.png) se situe en (152,135) Que penses-tu de cette méthode ? Encore une dernière chose : - étant donné que je vais avoir à charger énormément de sprite par map (disons au moins 100), ne faut -il pas envisager d'utiliser un tableau de sprites, dans lequel on ne chargerait que les sprites de la map, et on viendrait chercher dans ce tableau le sprite à afficher pour notre "objet". Ainsi, je pense qu'il ne faudrait pas utiliser de constante comme #arbre1, #arbre2, etc.. car on risque d'avoir un nombre de constantes par map qui évolue ou change en fonction des maps et du nombre de sprite différents à charger par map. A moins de les enregistrer dans un fichier bibliotheque1.txt > la bibliotheque des sprite à charger pour la map 1 bibliotheque2.txt > bibliotheque de sprite à charger pour la map2, etc.. En tout cas, encore merci |
|||||
|
|
00
|
|
|
#18 |
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2007 Messages : 46 ![]() |
|
|
|
00
|
|
|
#19 | |
|
Candidat au titre de Membre du Club
![]() Inscription : avril 2007 Messages : 46 ![]() |
Citation:
|
|
|
|
00
|
|
|
#20 | ||
![]() ![]() Inscription : avril 2003 Messages : 810 ![]() |
J'ai un peu corrigé la procédure update() pour retirer des boucles les calculs qui ne sont à faire qu'une seule fois.
Code :
__________________
Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP. |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com