| Aide sur un code | |
|
|
|
Auteur | Message |
---|
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Aide sur un code Mar 22 Avr 2014 - 19:35 | |
| Bonjour ! J'ai pour projet de faire un jeu style minecraft , et j'ai trouver ce code pour la génération de terrain : - Code:
-
p=15 v=2 a=-1 for(i=0;i<room_width;i+=16){ instance_create(i,room_height-(p*16),obj_grass) for(j=room_height-((p-1)*16);j<room_height;j+=16){ if j<room_height-((p-5)*16){instance_create(i,j,obj_dirt)}else{ instance_create(i,j,obj_stone) } } p+=v v+=a a=choose(-2,-1,0,1,2) if p>26{p=26 v=0 a=-abs(a)} if p<4{p=4 v=0 a=abs(a)} } Il est petit et a l'aire simple mais j'ai besoin de votre aide , je ne comprend pas le code ( les For n'arrive pas a rentré dans mon cerveau ^^) , est ce possible que vous m'expliquer son fonctionnement , je l'ai pris sur cette Vidéo ( https://www.youtube.com/watch?v=iQXLQzOaIpE ) mais je ne comprend pas trop niveau de l'anglais ^^. Comme je voudrai vraiment faire un jeu ou je veut être a l'aise avec les code , si je ne connais pas celui la ( qui est le plus important ) cela pourrai peut être me poser des problème , si une âme "charitable" pourrai me décode ce code , je lui en serrai reconnaissant ^^. |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Aide sur un code Ven 25 Avr 2014 - 17:47 | |
| Honnêtement, si tu n'a pas encore assimilé la boucle for, et qu'en plus tu ne comprends pas bien l'anglais, faire un minecraft-like serait du pur suicide. Tu croiseras ce conseil partout, mais, commence par quelque chose de basique. Un Sokoban par exemple. On est d'accord que c'est pas passionnant, mais ça te permettra d'avoir les bases de la programmation posées, et commencer à voir comment tout ça marche, parce que rien n'est magique, et encore moins approximatif. Si tu ne sais pas ce que tu fais, aucune chance, déjà qu'en le sachant c'est pas de la tarte ;) Il y a une section exprès pour les tutoriaux et diverses infos sur le forum, et tu es bien sûr bienvenu à poser des questions précises, après avoir cherché par toi-même. Là, c'est un bout de code pas clair, pas commenté, et avec des variables qui ne veulent rien dire, donc on n'est même pas sûr de le comprendre. Et quand bien même on arriverait à te l'expliquer ça ne t'apprendrait rien. Edit: et puisque décidément c'est galère à trouver, voici les tutos de notre gourou onilink_ : https://cbna.forumactif.com/t10919-tutoriels-apprendre-le-gml |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 12:55 | |
| J'ai quelque base , d'ailleur j'ai fait pas mal d'autre chose comme la table de craft , mais j'ai juste envie de connaitre mon code ^^ , j'ai trouvé celui la mais je ne comprend pas tout c'est pour sa . |
|
| |
chopsuey Utilisateur confirmé: Rang ***
Messages : 523 Localisation : saint etienne Projet Actuel : All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
...
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 14:20 | |
| La boucle for sert à calculer plusieurs choses en un seul step. En faite le programme va lire ton code de haut en bas, une fois qu'il arrive en bas il passe au step suivant et recommence d'en haut. Quand il rencontre une boucle il se retrouve bloqué dans celle si jusqu'à ce qu'elle s'arrête. Il ne passera pas au step suivant avant d'avoir fini cette boucle. Les instructions de type for(i=0;i<10;i+=1) servent à définir la durée de la boucle plus précisément le nombre d'itérations. tant que cette condition est respecté la boucle continu. A chaque nouvelle itération i est incrémenté de 1 (ou de ce que tu veux) au début i=0 et une fois que i=10 la condition i<10 ne fonctionne plus la boucle s'arrête et le programme continu à lire la suite du code. Par exemple tu veux créer 30 instances l'une à coté de l'autre. Au lieu d'écrire:
instance_create(0,0,obj) instance_create(20,0,obj) instance_create(40,0,obj) instance_create(60,0,obj) instance_create(80,0,obj) etc...
Tu peux simplement faire:
X=0 for (i=0;i<30;i+=1) { instance_create(X,0,obj) X+=20 } |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 14:34 | |
| Effectivement, les boucles ca devient assez vite indispensable... :/ Et pour ton truc de génération, c'est mieux et même plus simple de le faire toi même à partir de rien que d'essayer de comprendre celui-là. C'est relativement simple à faire, et si tu veux l'améliorer (genre avec des gisements de minéraux, des grottes, etc...), c'est beaucoup plus facile avec ton propre code |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 14:46 | |
| Ok pour les for mais je capte pas trop genre comment faire pour que tout step il crée des block jusqu'a la fin de la room , de mettre en bas mais pas en haut les bloque de terre , bref j'imagine mal sa :/ |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 14:49 | |
| Je me suis coltiné le bout de sa vidéo où il parle de l'algo, tentons de déchiffrer ce truc. - Code:
-
// Le terrain est généré en faisant progresser une "entité" (appelons-la la mouche) // de part en part de l'espace à remplir, avec une vitesse horizontale constante // et un mouvement vertical à deux degrés d'inertie.
p=15 // "Position", en réalité la coordonnée y de la mouche v=2 // "Velocity", la vitesse verticale de la mouche a=-1 // "Acceleration", l'accélération verticale de la mouche
// Balayage de la room à pas constant (mouvement horizontal) for(i=0;i<room_width;i+=16){
// Spawn d'un carré d'herbe à la position de la mouche, // en inversant l'axe y (d'où le "room_height-(p*16)") instance_create(i,room_height-(p*16),obj_grass) // Remplissage de la colonne sous la mouche... for(j=room_height-((p-1)*16);j<room_height;j+=16){ // ... avec 4 niveaux de terre, et le reste de pierre // d'où le "j<room_height-((p-5)*16)" if j<room_height-((p-5)*16){instance_create(i,j,obj_dirt)}else{ instance_create(i,j,obj_stone) } } // Intégration d'Euler basique avec un pas de temps unitaire p+=v v+=a // Accélération aléatoire pour faire osciller la mouche verticalement a=choose(-2,-1,0,1,2) // Limites haut et bas // L'altitude est bloquée, la vitesse remise à zéro, et l'accélération // est ajustée pour s'éloigner de la limite if p>26{p=26 v=0 a=-abs(a)} if p<4{p=4 v=0 a=abs(a)} } L'un dans l'autre, l'algo de base est déjà bizarre (résultats pas homogènes), mais en plus le mec code comme un sagouin : - Indentation complètement aléatoire et code mal espacé - Pas le moindre commentaire - Variables aux noms débiles - Nombres magiques partout - Complexité inutile (inverser l'axe y ne change strictement rien et farcit le code de changements de repère) - Script inflexible et incomplet : la génération des minerais est faite par les carrés de pierre, en toute logique le script de génération devrait s'en charger - Utilisation d'instances indépendantes pour chaque carré du terrain : carrément débile niveau optimisation. Pour couronner le tout la vidéo a été faite à l'arrache, prises foirées et fourchages de langue offerts. Conclusion : faire gaffe à la provenance des tutoriaux. Ce mec a beau être motivé, il ne maîtrise absolument pas son sujet, et son tutorial est dangereusement mal foutu en plus d'être mal expliqué. Malheureusement c'est extrêmement courant sur Youtube, et en général avec tous les trucs dont le titre est "Comment faire [placer un truc extrêmement spécifique ici]". Une technique fréquemment utilisée pour générer des terrains semi-aléatoirement est celle du bruit interpolé. Quelques articles qui ont l'air pas mal ici, ici et là. Bien sûr, à nouveau les bases de la programmation sont à connaître pour pouvoir lire les listings de code (même si ce n'est pas du GML). Edit: - albisse a écrit:
- Ok pour les for mais je capte pas trop genre comment faire pour que tout step il crée des block jusqu'a la fin de la room , de mettre en bas mais pas en haut les bloque de terre , bref j'imagine mal sa :/
Ça c'est typiquement savoir réfléchir "façon programmation". Il faut maîtriser les outils que tu as à ta disposition (variables, conditions, boucles et tutti quanti), pour ensuite réfléchir à ce que tu peux faire avec, et comment. Et ça c'est de l'entraînement. |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 15:13 | |
| Maintenant mon jeu Rame quand je le lance ^^ Vous avez un petit conseil pour sa ^^ ? |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 15:16 | |
| Avec pour seule information "ça rame" ? Non... |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 15:31 | |
| Bah mettre des objets en guise de sol pour un MC-like avec GM, c'est risqué Donc, soit tu réduit ta room, soit tu désactive tes objets en dehors d'une certaine zone, soit tu fais un système de chunk (comme MC d'ailleurs). |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 16:04 | |
| Avant de dégainer la pagination, utiliser un tableau c'est déjà mieux... |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 16:22 | |
| Effectivement, mais là tu perd toutes les fonctions liées aux instances... :/ Genre le pathfinding (encore que là, à la limite ien a pas besoin), mais tous les trucs genre instance_nearest, etc... Et je parle même pas de l'intérêt premier des objets, c'est à dire avoir un certain nombre de variables, parce que si tu veux par exemple enregistrer la hauteur de l'herbe sur un bloc de terre, bah si t'utilise pas d'objets, soit tu prends un tableau 3D (impossible en plus je crois), soit tu fais du parsage à tout bout de champ... Donc c'est à lui de voir, mais pour un débutant, je pense que c'est plus simple de rester sur des objets, même si c'est moins optimisé Après c'est que mon avis, on est d'accord sur le fait que j'ai pas forcément raison ! |
|
| |
chopsuey Utilisateur confirmé: Rang ***
Messages : 523 Localisation : saint etienne Projet Actuel : All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
...
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 16:27 | |
| Je suis bien de l'avis de térence68 c'est quand même plus confortable d'avoir des objets et à partir du moment où ils sont désactivés en dehors de la view ça risque pas vraiment de nuire à l'optimisation du jeu au point de le faire ramer. (surtout avec gm studio) |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 16:31 | |
| Pour les fonctions, implémenter instance_nearest, instance_place, etc c'est trivial dans un tableau. Pour ce qui est des métadonnées, c'est vrai que ne pas pouvoir faire de tableaux d'objets ça aide pas, mais on peut avoir une approche hybride : des valeurs pour les blocs simples, des références d'objets pour les plus complexes (comme les TileEntities dans Minecraft).
Après une brève recherche, il semblerait que GM implémente les opérateurs binaires (oni m'a dit le contraire dans un autre thread, bizarre), donc on peut aussi stocker plusieurs infos sur des entiers avec du masquage.
Edit: @chopsuey: ça peut aller très vite. Avec du 1080p tu atteins potentiellement les 8000 objets, juste pour le terrain. Avec tous les éléments de jeu qui vont faire des tests de collision avec, plus leur mise à jour automatique, plus l'affichage, y'a de quoi massacrer ton framerate, sans même parler d'IA ou quoi que ce soit. Ne serait-ce que la fonction "trouver le bloc à la position (x,y)" (fonction indispensable, sans doute la plus utilisée) va devoir labourer dans tous les objets, au lieu de faire deux pauvres divisions. Ça fait très mal. |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 16:45 | |
| Le truc c'est cette ligne qui me baisse mes FPS a environ 2 ^^
if p<4{p=4 v=0 a=abs(a)}
Il me semble qu'elle génère Toute la map , sans s’arrêter , j'ai donc essayer pour que le code s'active que quand la caméra bouge mais rien ne change :
if view_xport+500>room_width{ if p<4{p=4 v=0 a=abs(a)}}
Mais la , la map ne se génère pas , et encore moins bien ><
Edit : je suis sous Gm 8 ; je ne capte pas tout ce que vous me dites , si vous avez des exemple ou même modifier le code si vous le trouvé trop lourd ^^
Edit 2 : je viens de me rendre compte que ce que j'ai rajouter sert strictement a rien , du coup je ne sais pas comment activer le code pour que la map ce génère , désactiver le code , et le réactiver dès que la caméra bouge dans un endroit non générer , mais sa c'est un peut bizard , je vais test de créer une variable = x_view , qui s’actualisera tout les x temps pour savoir si la x_view a bouger , et si oui activer le code . |
|
| |
chopsuey Utilisateur confirmé: Rang ***
Messages : 523 Localisation : saint etienne Projet Actuel : All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
...
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 16:55 | |
| Ce qu'on te conseil c'est surtout de le refaire toi même ou d'essayer pour l'instant de faire un jeu moins complexe si c'est pas de ton niveau. |
|
| |
onilink_ Modérateur
Messages : 9183 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 17:26 | |
| D-z> GM gère les opérateurs binaires, mais les données sont des doubles qui sont castés en entiers pour faire l’opération, puis recastés en double ensuite... Bref on perd quasi complètement l’intérêt de tels opérateurs. Et niveau précision des données faut faire gaffe a pas utiliser plus de xx bits (me souviens plus de la valeur, mais c'est un truc genre 16) sinon la valeur risque d'être arrondie.
Et pour le tableau c'est effectivement le mieux, mais ce n'est pas du tout du niveau d'albisse. Rien que gérer les collisions lui prendraient des semaines. |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 17:30 | |
| J'ai déjà fait pas mal de chose , et puis c'est du 2D , je pense que la seul difficulté est justement la génération du mon , qui est certe la plus grosse , c'est justement pourquoi je fait appel a vous . Sinon je veut bien créer le mien mais je ne sais pas trop comment , meme en voyant ce code je ne saurais faire quelque chose avec mes codes ><
Dernière édition par albisse le Sam 26 Avr 2014 - 17:36, édité 1 fois |
|
| |
chopsuey Utilisateur confirmé: Rang ***
Messages : 523 Localisation : saint etienne Projet Actuel : All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
...
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 17:35 | |
| Oui mais si tu veux pouvoir gérer ton jeu convenablement il faut que tu programmes toi même cette génération pour pouvoir la comprendre. Et si t'arrive pas à faire ça tu vas finir par être bloqué par d'autres choses. |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 17:37 | |
| Le problème c'est que je ne sais pas moi meme reproduire le code , donc en crée un , je ne saurais pas >< |
|
| |
chopsuey Utilisateur confirmé: Rang ***
Messages : 523 Localisation : saint etienne Projet Actuel : All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
All work and no play makes Jack a dull boy
...
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 17:44 | |
| Donc ne brules pas les étapes. Commence par maitriser les bases qui te permettrons de créer ton propre code. Pas plus tard que ce matin tu ne comprenais pas ce qu'était une boucle donc je pense pas que tu y soit déjà asse familiarisé. Entraines toi au algorithmes au boucles et au tableaux. |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 19:29 | |
| D'ailleurs j'ai compris et commenté le code que tu as récupéré, si tu tiens à le comprendre (mais comme je l'ai dit il casse vraiment pas des briques). Puis ça mettra un nom sur les choses pour que tu puisses poser des questions plus précises si besoin ;) |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 19:41 | |
| Je s'avais ce qu'était les boucle for mais c'est juste que je n'est pas l'abitude de l'utilisé , du coup je ne voyais pas a quoi elle servait ^^
Mais je veut bien en crée un , d'ailleurs si j'avais le chois , je ne l'aurais pas pris , comme tu dis , il vaux mieux le crée sois meme , mais c'est juste que je ne voie pas trop comment le faire , je pense avoir les aquis mais je ne voie pas trop comment le crée , malgré que je vient d'avoir ma petit idée ^^ |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 20:11 | |
| Je viens de Rererere lire le code , et j'ai compris , mis a part ces deux ligne ( meme avec l'explication ) if p>30{p=30 v=0 a=-abs(a)} if p<4{p=4 v=0 a=abs(a)}
De plus si je lance le jeu avec ces deux ligne je suis a 1 de FPS , si j'enlève cet ligne :
if p<4{p=4 v=0 a=abs(a)}
Mes fps reste haut , et vue que c'est une boucle dans un creat je ne sais pas trop contrôler quand l'activer ou non , par ce qu'a mon avis elle génère toute la map .. |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 20:17 | |
| Effectivement, les fonctions genre instance_nearest et tout avec des tableaux, c'est faisable, mais pas pour tout le monde, et a mon avis albisse n'y arrivera pas. Utiliser du binaire et tout, c'est la aussi possible, mais ca commence a devenir compliqué, et la non plus albisse n'y arrivera pas... Donc quand on en arrive à devoir utiliser tout ce bordel, je pense que c'est plus simple de migrer vers un autre langage Mais en fait la solution ultime ca reste onidev ! Bon et albisse, essaie de faire des exos avec les boucles pour en comprendre le principe. Une fois que t'as compris comment ca marche, prend une feuille et un crayon et regarde ce que tu veux obtenir. Ca parait assez simple, pour obtenir un p'tit truc basique du moins : Tu fais une boucle pour chaque colonne de blocs, et pour chaque colonne tu choisis un nombre de blocs en hauteur aléatoire, mais en tenant compte de la hauteur a ta gauche pour pas que ce soit n'importe quoi non plus... Ensuite suffit de faire une deuxième boucle imbriquée pour poser le nombre de blocs choisi dans la colonne. |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 20:29 | |
| Oui mais justement comme j'ai dis dans le post précédent je viens de comprendre ^^ , je n'imaginai pas le code , le fait que la "mouche" se déplace selon la variable ( je n'imaginai pas sa mais j'ai bien compris ) cependant il me reste le problème que j'ai mis dans la post précédent ^^ . |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 20:40 | |
| Bon bah si t'as compris le fonctionnement, tu peux le refaire toi meme comme ca en comparant les deux versions tu pourra comprendre a quoi servent ces deux lignes. Sérieusement, utiliser ton propre truc c'est quand meme beaucoup mieux, et au moins t'es sur de tout comprendre ; sans compter que c'est ca qui va te faire progresser. |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 20:54 | |
| Honnêtement j'ai compris le code qu'en suivant la vidéo, et c'est vrai que le mec a un accent pas facile à suivre, surtout avec les fourchages de langue. |
|
| |
albisse Utilisateur confirmé: Rang *
Messages : 233
| Sujet: Re: Aide sur un code Sam 26 Avr 2014 - 23:03 | |
| - albisse a écrit:
- Je viens de Rererere lire le code , et j'ai compris , mis a part ces deux ligne ( meme avec l'explication )
if p>30{p=30 v=0 a=-abs(a)} if p<4{p=4 v=0 a=abs(a)}
De plus si je lance le jeu avec ces deux ligne je suis a 1 de FPS , si j'enlève cet ligne :
if p<4{p=4 v=0 a=abs(a)}
Mes fps reste haut , et vue que c'est une boucle dans un creat je ne sais pas trop contrôler quand l'activer ou non , par ce qu'a mon avis elle génère toute la map .. Merci mais personne ma encore aider x) PS : je veut bien faire mon propre code et je trouve aussi que c'est 1000 fois mieux mais je trouve que son code ( a mon niveau ) est assez bien , et finalement assez "bête" car sa reste deux variable qui change aléatoirement , donc finalement refaire le code ne ferais que l’agrandir ^^ Mais ne tout cas merci beaucoup , mais svp aidez moi pour mon problème cité ci dessus ^^ |
|
| |
Térence Utilisateur confirmé: Rang *****
Messages : 2213 Localisation : Oui
| Sujet: Re: Aide sur un code Dim 27 Avr 2014 - 8:39 | |
| On tourne en rond hein >< Refais le code toi même, surtout si tu le trouve assez bête, et la on se fera un plaisir de t'aider quand t'aura un problème précis. Je t'ai donné la marche a suivre avant, t'as juste a l'écrire. |
|
| |
Contenu sponsorisé
| Sujet: Re: Aide sur un code | |
| |
|
| |
| Aide sur un code | |
|