Se connecter

Informatique

Création de Jeux

Sujet : J'aide les personne dans Game maker
chopsueys
Niveau 16
26 avril 2016 à 20:33:40

Tu peux télécharger une version ancienne de la doc traduite en fr http://cbna.forumactif.com/t1437-documentation-en-francais-pour-gamemaker-6-1
Elle est pas complètement à jour mais il n'y a pas eu tant d'évolution à ce niveau là, elle te sera très utile.
C'est une très bonne chose si tu sais déjà tout ça :oui:
Pour les tuto et l'aide va sur le http://cbna.forumactif.com/ c'est la communauté francophone de game maker.
Je ne sais pas si c'est toujours très actif par contre, ça fait plusieurs années que je n'y suis pas allé.
Tu peux accéder à des tutos et à diverses choses ici: http://www.lecbna.org/
Il y'a d'autres tutos sur le forum.

lee-ace
Niveau 4
27 avril 2016 à 20:06:02

Mon apprentissage se déroule plutôt bien pour le moment [[sticker:p/1kki]] Je sais coder pour faire de beau déplacements de rpg, par contre j'ai quelques questions svp. Pour le déplacement à droite par exemple, le mec dans le tuto (vidéo en anglais) met ceci :

//Move Right
if (keyboard_check(ord("D"))) && (place_free(x+2,y))
    { x += 2
    sprite_index = spr_player_walk_right
    image_speed = 0.2
    Direction = "Right"
    }

Je comprends tout sauf le "place free", cela veut dire si l'emplacement est libre à x+2 alors je rajoute 2 à x ?

chopsueys
Niveau 16
27 avril 2016 à 20:32:13

Je comprends tout sauf le "place free", cela veut dire si l'emplacement est libre à x+2 alors je rajoute 2 à x ?

Ben oui c'est ça.
Tu verras peut être plus tard, peut être que c'est pas la priorité mais que ce genre de condition pour les déplacements est limité.
Le mieux est d'utiliser une boucle, pour tester la place libre à chaque pixels et ainsi avoir des collisions propres.
Dans un bon moteur de jeu il n'y a d'ailleurs jamais de collisions.
Au cas où ça t’intéresse je te donne un exemple:

if keyboard_check(ord("D"))
{
for(i=0; i<vitesse; i+=1)
{
if place_free(x+1,y)
{ x += 1
sprite_index = spr_player_walk_right
image_speed = 0.2
Direction = "Right"
}
}
}

lee-ace
Niveau 4
27 avril 2016 à 20:53:04

Comment ça "jamais de collisions" :fou:

C'est sur que maintenant que tu le dit ton idée avec la boucle m'a l'air plus simple [[sticker:p/1kki]]
Ton bout de code c'est pas pour la boucle ? Tu peux me traduire la ligne 3 stp avec le "For" ?

chopsueys
Niveau 16
27 avril 2016 à 21:35:37

Comment ça "jamais de collisions" :fou:

Je parles au niveau du moteur physique. Avec une boucle tu peux prévenir et anticiper une collision, sans boucles soit ton perso ne sera pas tout à fait collé au parois soit il rentrera dedans.
Exemple: tu testes si la place est libre en x+1 et ton perso se déplace de 5 px tout les steps.
il se trouve à ce stade à 3 px du mur, la condition est donc validé il n'ya pas d'obstacle à 1 px alors le perso se déplace de 5 px (sa vitesse) résultat il se retrouve enfoncé dans le mur de 2 px.

for(i=0; i<vitesse; i+=1)

ça veut tout bêtement dire: on va répéter l'action autant de fois que la valeur de vitesse.
i veut dire itération, c'est la lettre de base que tout le monde utilise mais tu peux très bien écrire banane ça fonctionne aussi :hap:
i au début est = à 0, on demande si i est plus petit que vitesse (vitesse=5) puisque i est plus petit que 5 alors on exécute l'action entre { } et on ajoute 1 à i
l'action entre { } va dire qu'il faut ajouter 1 px au perso si le px devant lui est libre.
La lecture du code revient au début de la boucle une fois que le programme à vue le dernier " } "
Donc on répète la même question sauf que i cette fois est égale à 1, ça fonctionne toujours et le perso avance encore d'un px jusqu’à que i=5 et donc que i ne soit pas plus petit que 5, alors la boucle se casse et le programme reprend sa lecture après le dernier " } " de la boucle.
Tout ça se passe dans un seul step et donc à la fin du step le perso à avancé de 5 pixel en étant sûr de ne pas rencontrer d'obstacles.

lee-ace
Niveau 4
27 avril 2016 à 22:35:50

Merci pour ton explication, vraiment sympa ! T'es calé sur game maker, ta déjà publiés des jeux ?
Tu m'a l'air d'être un programmeur dans la vie [[sticker:p/1jnh]]

Smooth-Caribou
Niveau 10
28 avril 2016 à 00:13:54

Perso en commençant je me suis fais pas mal de tutos dont ceux de TheErnest : https://www.youtube.com/user/TheErnest570/videos

Il est jeune mais bon pédagogue et sa chaine est assez complète, même si certains éléments ne te semblent pas utile au début c'est toujours important d'en savoir un maximum et ça te rend plus polyvalent.

lee-ace
Niveau 4
28 avril 2016 à 12:39:02

Merci Caribou, je vais regarder ça [[sticker:p/1kkr]]

chopsueys
Niveau 16
28 avril 2016 à 13:08:03

Non je suis pas programmeur, je connais juste bien game maker.
Et j'ai jamais vraiment terminé de jeux, rien de montrable en tout cas :hap:

lee-ace
Niveau 4
28 avril 2016 à 13:35:30

Ah ok, je comprends :-) Montrable entre nous en tous cas :-d J'aimerais bien voir l'un de tes prototypes.

Je suis en train de tester le fonctionnement des projectiles, cependant je n'arrive pas à faire en sorte que la direction du projectile s'adapte à mon personnage, mon projectile part toujours à droite.

Comment changer la direction de la balle ? Avec quel instruction puis-je faire ça ?

lee-ace
Niveau 4
28 avril 2016 à 20:01:02

Bon finalement j'ai réussi ! :fete:

J'ai découvert le vspeed et hspeed !

Mon code :

instance_create(x,y,obj_shot)
if (Direction = "Right")
    {obj_shot.hspeed = 20;
    } 
if (Direction = "Left")
    {obj_shot.hspeed = -20;
    } 
if (Direction = "Up")
    {obj_shot.vspeed = -20;
    } 
if (Direction = "Down")
    {obj_shot.vspeed = 20;
    } 
      
lee-ace
Niveau 4
29 avril 2016 à 22:20:30

C'est encore moi le casse c***lle [[sticker:p/1kkh]]

Mon GM plante quand je veux modifier le score, je m'explique :

J'ai déclaré une variable Score : 0
Ensuite j'ai créer un event draw et j'ai mis :

draw_set_font(font0)
draw_set_colour(c_yellow)
draw_text(32,384, "Score : " + string(Score));

Ensuite sur mon objet ennemie, lorsque je tue le zombie.

//Collission bullet
if(place_meeting(x,y,obj_shot))
    {
    Score += 10
    instance_destroy();
    } 

Je lance le jeu, ça marche, seulement, quand je tire et que la balle touche le zombie, le jeu crash, voici ce qu'il m'affiche :

FATAL ERROR in
action number 1
of Step Event0
for object obj_zombie_1:

Variable obj_zombie_1.Score(100007, -2147483648) not set before reading it.
at gml_Object_obj_zombie_1_StepNormalEvent_1 (line 12) - Score += 10

Merci d'avance [[sticker:p/1lmh]]

chopsueys
Niveau 16
29 avril 2016 à 22:39:33

C'est très simple, ta variable Score appartient à un autre objet que l'objet zombie.
Chaque instance d'un objet possède ses propre variables "local"
Si tu veux utiliser une variable appartenant à un autre objet tu dois indiquer son nom devant la variable en les séparent d'un point: nom_de_l'objet.Score
Si tu veux utiliser la variable d'une instance en particulier tu dois connaitre son id et indiquer son id devans la variable de la même façon.
Petit rappel au cas où de la différence entre instance et objet.
Les instances sont des clones de l'objet.
Exemple tu crée un objet zombie mais sur la map il y'a plusieurs de ces zombies et bien chacun des ces zombie sont des instances de l'objet zombie.

lee-ace
Niveau 4
29 avril 2016 à 23:46:58

Merci ça marche !!! :play: :fete: :banzai: Je comprenais pas pourquoi ça plantait, je voulais m'arracher les cheveux ^^

Et merci pour le cours, je savais pas pour les instances ! [[sticker:p/1kkn]]

lee-ace
Niveau 4
30 avril 2016 à 14:19:59

On est obligé de déclarer la variable "hp" pour chaque zombie ? Quel est le moyen de dire, pour chaque instance de l'objet zombie, il possède sa propre variable hp ?

Et dernière question, comment faire en sorte que chaque zombie mort laisse son cadavre au sol sans qu'on puisse encore intérargir avec celui ci ? J'ai essayé avec draw_sprite pour m'afficher un sprite de zombie mort mais j'y arrive pas :-(

chopsueys
Niveau 16
30 avril 2016 à 15:03:06

C'est déjà le cas par défaut.
Chaque instance possède ses propres variables.
Si tu écris hp=10 dans l'objet zombie toutes les instances auront leur propre variable hp.
Si tu dis dans l'objet zombie que au contact d'une balle il perd un point de vie alors seul l'instance concerné par cette condition perdra un point de vie.

Pour laisser un cadavre le plus simple a ton niveau est de créer un nouveau objet cadavre et lorsque hp<0 tu détruit l'instance zombie et tu crée cette nouvelle instance cadavre.
C'est pas une solution très pro mais la j'écris depuis mon portable et ça serai trop long à expliquer.

lee-ace
Niveau 4
01 mai 2016 à 00:45:32

Merci chop, tu as raison pour les variables, il nous mâche vraiment le travail c'est cool !

Merci pour l'astuce du cadavre, au début j'ai tenté avec instance_create mais c'est plus simple avec instant_change, je progresse j'adore [[sticker:p/1kkl]]

RoXSaida
Niveau 6
01 mai 2016 à 08:21:50

Bonjour, je suis actuellement entrain de suivre un tuto anglais pour faire des vagues d’ennemies sur mon jeu alors tous marche mais j'ai pas très bien compris le : spawn_rate = random_range(60,180);
alarm[0] = spawn_rate;

Pour augmenter la fréquence d’apparitions d’ennemies il suffit de changer les nombres entre parenthèse spawn_rate = random_range(60,180); mais j'ai pas bien compris quesque définissais le 60 et le 180 j'ai remarqué que si je mettais spawn_rate = random_range(10,10); les ennemies apparais plus souvent.

Puis aussi j'ai une variables global qui est : global.score = 0; et elle augmente de 10 a chaque fois que je tue un ennemie et j'aimerais que par exemple arrivée a 80 que le spawn_rate fait apparaître plus d’ennemies, j'ai déjà essayée avec une conditions et changé la valeur du spawn rate mais sa na rien fais :(

Smooth-Caribou
Niveau 10
01 mai 2016 à 12:40:58

En fait ton spawn_rate est une variable, qui définit la rapidité à laquelle tes ennemis apparaissent.

random_range(x1,x2); est une fonction qui te permet de choisir aléatoirement une valeur comprise entre x1 et x2.

Bref ta vitesse d'apparition des monstres est aléatoire, comprise entre 60 et 180. Spawn_rate est déclaré et a automatiquement une vitesse disons au pif de 80, dans le même objet l'alarm 0 va mettre son "compteur" à 80. Une fois ce temps passé le code contenu dans l'event alarm0 se déclenchera, soit probablement la création d'une instance d'un monstre. Mais le prochain monstre lui aura peut être un spawn_rate de 90 et apparaîtra du coup un peu après, c'est pour éviter d'avoir des ennemis qui arrivent tout le temps à la même cadence si tu veux.

C'est pour ça en mettant le random_range à 10,10 (ce qui n'est pas un "vrai" random du coup, tu aurais plutôt à dire tout simplement "spawn_rate = 10;" dans ce cas), l'alarm 0 se déclenche tout le temps au bout de 10, soit très vite.

Pour ton deuxième soucis avec le score, tu peux justement définir ça au moment de déclarer "spawn_rate". En reprenant tes valeurs, tu peux lui dire par exemple :

if global.score < 80 //tant que tu n'as pas battu 8 ennemis
{
spawn_rate = random_range(60,180);
}

else if global.score >= 80 && global.score < 200 //si le score est entre 80 et 200
{
spawn_rate = random_range(40,120);
}

else //si le score dépasse 200
{
spawn_rate = random_range(10,60); //vitesse d'apparition rapide.
}

C'est un peu en mode clodo mais bon ça marchera :)

RoXSaida
Niveau 6
01 mai 2016 à 13:18:10

D'accord merci beaucoup ce petit bout de code que tu viens de me donnais je doit le mettre ou pour qu'il fonctionne ?

Sujet : J'aide les personne dans Game maker
   Retour haut de page
Consulter la version web de cette page