"Break force,"Un ptit shmup sous gamemaker....

Pour tout ce qui est fan arts, homebrew, shooters codés à la main, rip de sprites, doujins et toute autre productions artistiques ou logicielles faites maison.
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

J'ai tout modifié et supprimé "le parent" !

Toujours aucun tir, finalement les aliens sur ce jeu viennent en paix ! :D
ImageImageImage
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

Y^nO a écrit :Il ne connait pas la variable, il y a deux solutions soit tu ne l'as pas initiée
(dans le create event: canshot=0) , soit un autre objet ou sprite porte le même nom.

Non, dans "create" j'ai bien mis la variable à 0, car si je comprend bien cette dernière change en fonction de la présence du vaisseau joueur, elle passe à 1, ça c'est vu, je comprends vraiment pas d'où ça peut venir.....
ImageImageImage
Gunny
Empereur Bydo
Messages : 3404
Inscription : 15 mai 2006, 15:26
Localisation : Rayon chaussettes du Kiabi du coin
Contact :

je te montrerai avec un exemple simple comment je fais ;)
tu vas voir, c'est d'une simplicité enfantine ou presque :)
Si t'as un truc électronique cassé, ça se passe par là https://www.atelier-electrodd.fr/

-Je comprend rien à ce que tu dis...
-Pas grave... C'est pas en vivant plus longtemps qu'on deviens moins con.
Avatar de l’utilisateur
psychogore
1 crédit c'est déjà trop
Messages : 2358
Inscription : 23 mai 2003, 09:04

Bah, perso, j'ai fait un truc du genre :
evenement outside view : si les coordonnées de l'ennemis sont proches des limites de la vue (faire des tests sur view_xview, view_yview, view_wview et view_hview, au choix), on demarre la trajectoire et la timeline attribuées à ce type d'ennemi.

Dans la time line, tu mets par exemple un instant à X frames (où X determinera une frequence que tu choisira arbitrairement), et là, tu lui mets un "create object moving" (je tape de memoire là,) avec comme argument direction "point_direction(x,y,ship.x,ship.y)". Si lorsque tu declenche la timeline tu lui dit de boucler c'est fini, les ennemis tireront vers le vaisseau à intervalle reguliers.

Si dans ta time line tu mets plusieurs instants avec des bullets orientées differement tu peux creer des motifs de tirs.

(passe voir ce que j'ai fai sur le topic Esp ZE.CA., j'ai mis à jour en mettant un peu plus d'agressivité sur les ennemis et le boss ^_^ )
Avatar de l’utilisateur
Y^nO
Dieu de la Borne
Messages : 1786
Inscription : 04 août 2005, 00:13
Localisation : Paumé dans l'espace...
Contact :

Alec a écrit :
Y^nO a écrit :Il ne connait pas la variable, il y a deux solutions soit tu ne l'as pas initiée
(dans le create event: canshot=0) , soit un autre objet ou sprite porte le même nom.

Non, dans "create" j'ai bien mis la variable à 0, car si je comprend bien cette dernière change en fonction de la présence du vaisseau joueur, elle passe à 1, ça c'est vu, je comprends vraiment pas d'où ça peut venir.....

Meuh c'est louche <_<
si tu veux me upper tes sources je serais curieux d'y jeter un œil (MP)
(aka trouver le truc le corriger et poster le pourquoi du comment 8) ) :o
Image
Gunny
Empereur Bydo
Messages : 3404
Inscription : 15 mai 2006, 15:26
Localisation : Rayon chaussettes du Kiabi du coin
Contact :

Yano, le problème c'est qu'il mettait l'objet ennemy en tant que parent de l'objet bullet.
Donc l'objet bullet héritait des fonction dans l'event step de l'objet ennemy.

hors l'objet bullet n'a aucune variable initialisée donc ca bloquait tout :)

D'où on message lui indiquant de laisser tomber pour le moment les concept de parent et enfant pour le moment ;)
Si t'as un truc électronique cassé, ça se passe par là https://www.atelier-electrodd.fr/

-Je comprend rien à ce que tu dis...
-Pas grave... C'est pas en vivant plus longtemps qu'on deviens moins con.
Avatar de l’utilisateur
Y^nO
Dieu de la Borne
Messages : 1786
Inscription : 04 août 2005, 00:13
Localisation : Paumé dans l'espace...
Contact :

Gunny a écrit :Yano, le problème c'est qu'il mettait l'objet ennemy en tant que parent de l'objet bullet.
Donc l'objet bullet héritait des fonction dans l'event step de l'objet ennemy.

hors l'objet bullet n'a aucune variable initialisée donc ca bloquait tout :)

D'où on message lui indiquant de laisser tomber pour le moment les concept de parent et enfant pour le moment ;)
Hihi ok, je me doutais bien que c'était un truc tout simple du genre.
@ Alec Bonne chance et courage pour la suite et tu peux m'ajouter dans ta liste de contact MSN sans soucis, ce sera un plaisir si je peux aider.
Image
Gunny
Empereur Bydo
Messages : 3404
Inscription : 15 mai 2006, 15:26
Localisation : Rayon chaussettes du Kiabi du coin
Contact :

Bha le problème, c'est qu'il renvoie l'erreur sur l'objet parent et non pas sur l'objet enfant... Donc on cherche sur l'objet en conséquence...

Et en faisant une partie en mode debug et step by step, je me suis appercu en fait, que c'était au moment de la création du tir qu'il y a un problème ( j'ai utilisé mon système de création de boulette avec ma propre gestion de compteur :D ).

J'ai ensuite consulté les propriétés de l'objet bullet et pouf il a un parent !
Si t'as un truc électronique cassé, ça se passe par là https://www.atelier-electrodd.fr/

-Je comprend rien à ce que tu dis...
-Pas grave... C'est pas en vivant plus longtemps qu'on deviens moins con.
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

Y^nO, j'ai uppé tout ça en bas de la page 1 du sujet !


J'ai supprimé absolument tout lien de parenté entre les objets et ça ne fonctionne toujours pas !

je suis très interessé par la façon de faire de Y^no, mais pour mon cas ça fonctionne pas !


Je peux me tromper mais il y a pas d' event ou de step à creer dans l'objet "tirenemi" ?
si ?

Avec la formule que j'ai utilisé (et qui devrai fonctionner) la vitesse et la façon dont "tir enemi doit se comporter est définie dans le step event de oenemyfly normalement !
ImageImageImage
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

:x :x :x je désespère là !
ImageImageImage
Avatar de l’utilisateur
psychogore
1 crédit c'est déjà trop
Messages : 2358
Inscription : 23 mai 2003, 09:04

Je viens de voir ta source.
Deja, lorsque dans oenemyshot, tu definis le create par "move toward point" en mettant le nom de l'objet "oplayership" dans chaque coordonnée du point de destination, ça ne peut pas marcher !
La syntaxe correcte est : move towards point(oplayership.x,oplayership.y)

Ensuite, tu t'es compliqué la tache enormement pour ton objet oenemyfly.

Code : Tout sélectionner

x += xVel;
if (hp < 1)
{
    instance_create(other.x, other.y, oxplode);
    instance_destroy();
}
if (canshot=1){
with instance_nearest (x,y,oenemyfly)
{
instance_create(x,y,oenemyshot) direction=180+random (5);
alarm[0]=20;
canshot=0;}}

Le probleme, c'est que canshot n'est apparement definie à 1 que dans l'evenement alarm0, alors que l'alarm0 ne peut etre sollicitée que si canshot est à 1... De la poule ou de l'oeuf....

Bref, si tu veux mon avis (tu me fais confiance ?), oublie l'utilisation de variables style canshot en conjonction avec des alarm. il est beaucoup plus simple et efficace de creer une timeline (meme si elle n'a qu'un seul instant defini) et de la faire boucler, que de s'enquiquiner avec un code barbare.

Apres, on peut utiliser du code script pour faire des motifs de tir (ce que j'ai fait ce week end), mais là aussi, il vaut mieux ne pas trop faire complexe et s'appuyer sur les timelines.

Dis moi si ça t'aide.
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

J'ai réussi à faire tirer les ennemis, mais ces derniers tirent des boulettes alors qu'ils sont pas affichés à l'écran et ça alors que j'ai désactivé les objets hors de la "view0" !


Pfff et les vielles sulfateuses :x , les boulettes arrivent sous forme de lignes continues et du coup ça rame sec !
ImageImageImage
Avatar de l’utilisateur
psychogore
1 crédit c'est déjà trop
Messages : 2358
Inscription : 23 mai 2003, 09:04

Qu'entends-tu par "désactivé les ennemis" ?

Tu as utilisé quel event ?

Le gros piege c'est l'event "boundary" : il ne declenche que lorsqu'on touche les limites de la view., une fois l'objet dedans c'est fini (ça m'a bien pris la tete ça au debut.)


pour le coup des "sulfateuses", bah, prend des frequence genre 40 ou 50 pour tes alarm|timeline, un truc bien gros quoi.
Avatar de l’utilisateur
Y^nO
Dieu de la Borne
Messages : 1786
Inscription : 04 août 2005, 00:13
Localisation : Paumé dans l'espace...
Contact :

Autre chose me chiffonne :

instance_create(x,y,oenemyshot) direction=180+random (5);

Ton oenemyshot là c'est le tir? parce qu'en mettant la direction (random ou pas) le tir ira à 180° et non pas vers ton vaisseau joueur, donc note plutôt simplement :
instance_create(x,y,oenemyshot);

Pour la cadence de tir, c'est précisément l'intérêt des alarmes, c'est très facile à régler,
après un tir tu mets la variable can_shot à zero et l'alarme0 à 90 (il faudra donc 90 step à l'alarme0 pour remettre la variable can_shot à 1) puis tu varies la valeur 90 selon la cadence désirée.

Les ennemis qui tirent quand ils ne sont pas encore à l'écran c'est classique, je ne me casse pas trop la tête avec ça, j'ai juste défini des zones de tirs les ennemis ne peuvent tirer que lorsqu'ils sont dans cette zone. En plus ça évite aussi les tirs 'involontaire' dans le dos et autres choses désagréables.
Pour faire simple mes vaisseaux ennemis ne peuvent tirer que si x<100 et si x>25, la limite x de ma view étant 110-0 et si requis tu fais de même pour l'axe y.

Concrètement ça donne:

if x<100 {if x>25{...ton code de tir}}
Image
Avatar de l’utilisateur
psychogore
1 crédit c'est déjà trop
Messages : 2358
Inscription : 23 mai 2003, 09:04

Je pense qu'au point où il en est, la solution la plus simple pour les tirs hors écran, c'est de mettre l'action Destroy dans l'évènement Outside view.
Cela fait double emploi :
1) un ennemi qui commence à tirer hors écran voit ses projectiles disparaitre instantanément.
2) lorsqu'un tir quitte l'écran, il est effacé de la mémoire, ce qui évitera au jeu de ramer.

Le coup de vérifier les coordonnées de l'ennemi dans l'évènement outside view c'est utile, mais je trouve préférable d'y associer le déclenchement d'un path|timeline|alarm. Ça permet de dissocier efficacement chaque partie du comportement ennemi (c'est plus modulaire quoi).

Alec, n'hésite pas à poster la dernière version de ton jeu pour du feedback.
Gunny
Empereur Bydo
Messages : 3404
Inscription : 15 mai 2006, 15:26
Localisation : Rayon chaussettes du Kiabi du coin
Contact :

L'activation et la désactivation des objets hors view, c'est quelque chose que j'avais commencé à regarder...

C'est légèrement chiant à mettre en place mais une fois en place... Bha y a plus rien à faire :D

Alors deux solutions...
Ou tu passe par une timeline qui sera dédiée à la création des ennemis ( ce qui est plus long car il va falloir que tu regarde à quels steps tu vas créer tes ennemis )

Ou tu te créé un script qui va activer/désactiver les ennemis ET autres objets :) ( toujours dans un soucis d'allègement du jeu )
Si t'as un truc électronique cassé, ça se passe par là https://www.atelier-electrodd.fr/

-Je comprend rien à ce que tu dis...
-Pas grave... C'est pas en vivant plus longtemps qu'on deviens moins con.
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

Bon, ici c'est un montage mais en gros ça donne ça :

Image

Moi je veux qu'un enemi tire de temps en temps, genre deux ou trois boulettes avant de disparaitre à gauche de l'écran !

Quelle valeur il faudrait que je change pour obtenir un tel résulat ?

Ah et autre chose aussi avant les enemis tiraient bien avant d'entrer dans la view mais plus après, comment ça se fait !


event enemy bullet :

Code : Tout sélectionner

speed=2
move_towards_point(oplayership.x,oplayership.y,1)
event enemyfly :

Code : Tout sélectionner

var ammo;
ammo=1
if distance_to_object(oplayership)<50
{instance_create(oenemyfly.x,oenemyfly.y,oenemyshot)
ammo=0 alarm[0]=100}

(soupir)
Image
ImageImageImage
Gunny
Empereur Bydo
Messages : 3404
Inscription : 15 mai 2006, 15:26
Localisation : Rayon chaussettes du Kiabi du coin
Contact :

il faut, soit que tu fasses ton propre timer, soit que tu utilise les alarms :)

un timer c'est quelque chose comme ca :

Code : Tout sélectionner

timer=30;
if ( timer == 0 )
    {
         truc à faire
    }
else
    {
         timer-=1;
    }
A mettre dans l'event step.
Avec timer =30, l'ennemi va tirer tous les secondes ( si tu as laissé les réglages par défaut ) vu que le script va etre exécuter tous les step.
Si t'as un truc électronique cassé, ça se passe par là https://www.atelier-electrodd.fr/

-Je comprend rien à ce que tu dis...
-Pas grave... C'est pas en vivant plus longtemps qu'on deviens moins con.
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

Ah encore un autre problème ! :D

en fait quand plusieurs ennemis entrent dans la view seulement un se met à tirer jusqu'à ce que je le tue et là, hop un autre se met à tirer et ainsi de suite....

Edit :en fait le problème est réglé, j'ai remplacé :

Code : Tout sélectionner

{instance_create(x,oenemyfly, oenemyfly,y,oenemyshot)
Par :

Code : Tout sélectionner

{instance_create(x,y,oenemyshot)
Là ils tirent indépendament les un des autres, par contre niveau fréquence de tir, j'aimerai bien que ces ennemis ne tirent qu'une fois ou deux de façon aléatoire pas à la "danmaku superstar" avec des chapelets de boulettes qui suivent le joueur !

Je creuse, je creuse !
ImageImageImage
Gunny
Empereur Bydo
Messages : 3404
Inscription : 15 mai 2006, 15:26
Localisation : Rayon chaussettes du Kiabi du coin
Contact :

je t'ai déjà donné la solution alec ^^
Relis un peu plus haut :)
Si t'as un truc électronique cassé, ça se passe par là https://www.atelier-electrodd.fr/

-Je comprend rien à ce que tu dis...
-Pas grave... C'est pas en vivant plus longtemps qu'on deviens moins con.
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

Ben ouais mais ton timer, je le met où là dedans ? :D

Code : Tout sélectionner

x += xVel;
if (hp < 1)
{
    instance_create(other.x, other.y, oxplode);
    instance_destroy();
}

var ammo;
ammo=1
if distance_to_object(oplayership)<150
{instance_create(x,y,oenemyshot)
ammo=0 alarm[0]=1}
ImageImageImage
Gunny
Empereur Bydo
Messages : 3404
Inscription : 15 mai 2006, 15:26
Localisation : Rayon chaussettes du Kiabi du coin
Contact :

connecte toi sur msn, je vais te montrer ;)
J'en profiterais pour te montrer un truc sur l'affichage du score et des vies ^^
Si t'as un truc électronique cassé, ça se passe par là https://www.atelier-electrodd.fr/

-Je comprend rien à ce que tu dis...
-Pas grave... C'est pas en vivant plus longtemps qu'on deviens moins con.
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

Msn j'ai pas trop le temps en semaine, pourquoi ne réponds tu pas ici ? après tout ce topic pourrait servir de tutorial pour débutants !
ImageImageImage
Avatar de l’utilisateur
psychogore
1 crédit c'est déjà trop
Messages : 2358
Inscription : 23 mai 2003, 09:04

Alec a écrit :Ben ouais mais ton timer, je le met où là dedans ? :D

Code : Tout sélectionner

x += xVel;
if (hp < 1)
{
    instance_create(other.x, other.y, oxplode);
    instance_destroy();
}

var ammo;
ammo=1
if distance_to_object(oplayership)<150
{instance_create(x,y,oenemyshot)
ammo=0 alarm[0]=1}
Tout ce code est censé se trouver où ? dans quel evenement de quel objet ?

L'objet other n'est-il pas censé designer toute autre instance que l'instance courante ?
A quoi peut bien donc servir cette variable ammo que tu initialise à 1 juste avant de la passer à 0 ? D'autant que je ne vois pas de test sur cette variable.
Les tuto dispos sur le net c'est bien, mais il ne faut pas les reprendre tel quels. Généralement, il vaut mieux, de mon point de vue, se concentrer sur l'utilisation de la syntaxe et des mots réservés qui sont mis en avant dans ces tutoriels. Les structures et algorithmes sont généralement inadaptés et fondés sur une logique douteuse.

Quand à Alarm[0], il est censé s'y passer quoi ? Si c'est l'évènement correspondant à ce code, c'est là qu'il faut mettre une valeur tres superieure à 1 pour eviter les "sulfateuses de la mort" !

Bref, jettes un oeil, et tiens moi au courant.
Gunny
Empereur Bydo
Messages : 3404
Inscription : 15 mai 2006, 15:26
Localisation : Rayon chaussettes du Kiabi du coin
Contact :

Ha ^^ Je vois que je suis pas le seul à penser de cette manière xD

Quand on bloque sur une situation, première chose, on éteind son ordi, on prend un crayon, une feuille de papier ( ou plusieurs ), et on écris le comportement que doit avoir notre objet.

Ensuite, on traduit en code :)

C'est généralement salvateur.

Le problème, c'est qu'on a déjà donné 3 solutions différentes avec toutes les explication...

Regarde en première page...

Psychogore te donne la méthodologie avec le drag and drop, moi je te montre une méthode entièrement codée ( avec mon timer quoi ), et on t'indique meme comment mixer les deux ! ( drag and drop pour la boucle alarm et code pour les instructions à exécuter )

J'ai surtout pris le temps de bien t'expliquer !
Et t'as pas le temps de te connecter sur msn en semaine, si tu as le temps de venir poster sur le forum, tu as le temps de te connecter sur msn pour télécharger un fichier d'exemple.

Surtout que le fichier d'exemple, je te l'ai donné en plus... Si tu l'as jeté sans avoir regardé le code... Pas bien :D
Si t'as un truc électronique cassé, ça se passe par là https://www.atelier-electrodd.fr/

-Je comprend rien à ce que tu dis...
-Pas grave... C'est pas en vivant plus longtemps qu'on deviens moins con.
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

Gunny a écrit ::D
Oh la la t'es dur là :? !

Mais t'as raison, je vais analyser tout ça, remarque ta façon, c'est à dire d'écrire le comportement de tes objets pour ensuite les traduire en code, c'est une excellente idée !
ImageImageImage
Gunny
Empereur Bydo
Messages : 3404
Inscription : 15 mai 2006, 15:26
Localisation : Rayon chaussettes du Kiabi du coin
Contact :

Je réexplique une dernière fois avec MA méthode :)

Dans l'event create un script avec l'initialisation de la vaiable timer comme ca :

Code : Tout sélectionner

timer=30;
Dans l'event step un autre ascript avec :

Code : Tout sélectionner

If (timer == 0)
{
Tu met ton code de céation de tir ici;
timer=30;
}

else
{
timer -= 1;
}
Qu'est-ce qui se passe ?
A chaque step, le jeu va exécuter ton code.

Est-ce que la variable timer est strictement égale à 0 ?
Oui :
{
j'exécute le code de création du tir;
Je remet la variable timer à 30;
}
Sinon :
{
j'enlève 1 au timer;
}

Voilà :D
Si t'as un truc électronique cassé, ça se passe par là https://www.atelier-electrodd.fr/

-Je comprend rien à ce que tu dis...
-Pas grave... C'est pas en vivant plus longtemps qu'on deviens moins con.
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

ça sert de savoir lire :D , en relisant le tout j'ai réussi à mettre le système en place, le truc qui déconnais c'est que je ne mettais pas le timer en "create" !

c'est pour ça que ça fonctionnait pas !
Merci Gunny, je te metterai dans les crédits à la fin des 9 niveaux que je veux faire !
ImageImageImage
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

un gros vaisseau dessiné à la main, puis au point, je suis pas un pro du pixel et les critiques sont bienvenues !

Image
ImageImageImage
Avatar de l’utilisateur
Alec
King Fossile
Messages : 15788
Inscription : 12 juil. 2004, 18:04
Localisation : nstc-j

http://www.megaupload.com/?d=HNO7VSPP


Pour ceux qui veulent voir l'évolution des travaux....


Bon, niveau ost, (et quelques sprites piqués ici et là) c'est vrai que ça plante le décor (c'est plus pour me motiver)

Je vais essayer de faire quelques niveaux genre sf mechas vaisseaux géants etc...


pour l'instant seul les tirs joueurs sont pris en compte les ennemis ne peuvent pas détruire le sprite joueur pour le moment (histoire de tester deux ou trois trucs), je vais essayer de pondre quelque chose d'assez nerveux sans pour autant virer au manic, il y aura pas forcément beaucoup de projectiles mais ces derniers seront rapides :bad:


Je tiens à remercier Y^no, Gunny et psychogore sans qui j'aurai jamais pu démarrer, grâce à vous j'ai enfin réussi à mettre en place des systèmes simples mais qui devraient suffire pour ce que je veux en faire !
ImageImageImage
Répondre