RMEx
RMEx

Community


Vous n'êtes pas connecté. Connectez-vous ou enregistrez-vous

Mini-jeu de défense

Voir le sujet précédent Voir le sujet suivant Aller en bas  Message [Page 1 sur 1]

Je programme un mini jeu de défense. Le concept est simple, des ennemis avancent de la gauche vers la droite et il faut les éliminer avant qu'il n'atteignent un mur placé tout à droite.
Pour vous faire une meilleure idée voici une vidéo de présentation :



Je partage le système car je trouve qu'il a une utilisation intéressante des sélecteurs d'événement. Le tout utilise 4 event en processus parallèle pour 5 pages :

Event - Input
| > Commentaire : Gestion d'input
| > Condition : la touche Haut est pressée
| >| > Déplacer évènement : [Héros] (Ignorer action impossible, Attendre la fin)
| >| > Déplacer évènement : > Direction fixe ON
| >| > Déplacer évènement : > Un pas vers le Haut
| >| > Déplacer évènement : > Direction fixe OFF
| >| >
| > Fin - Condition
| > Condition : la touche Bas est pressée
| >| > Déplacer évènement : [Héros] (Ignorer action impossible, Attendre la fin)
| >| > Déplacer évènement : > Direction fixe ON
| >| > Déplacer évènement : > Un pas vers le Bas
| >| > Déplacer évènement : > Direction fixe OFF
| >| >
| > Fin - Condition
| > Appeler Script : SV[0] = events{|id|(event_x(id) == 15)&&(not event_erased?(id)) }
| > Appeler Script : if length(SV[0]) >= 1
| > Appeler Script :   include_page(map_id, me, 3)
| > Appeler Script : end
| > Appeler Script :  
| > Appeler Script : =begin
| > Appeler Script : SV[1] += SV[0].length
| > Appeler Script : event_erase(SV[0])
| > Appeler Script : puts SV[0]
| > Appeler Script : =end
| >
Les deux première condition n'ont rien d'anormal. mais ensuite je prend un sélecteur d'event pour prendre tous les events non supprimés situé sur la ligne devant le mur (et donc dont la coordonnée X est 15)
Il ne me reste plus qu'à regarder la taille du tableau obtenu pour savoir qu'un event à atteint le mur et donc pour lancer le game over.

Event - Input
| > Commentaire : Un fois le jeu terminé;
| > Opération : Interrupteur [0001:IntMiniJeuxDébut] Activé
| > Message : Ø, Ø, Normal, Haut
| > Message : Bien joué ! vous avez tenu \V[2] minute(s) et  
| > Message : \V[1] secondes !
| > Message : Ø, Ø, Normal, Haut
| > Message : Rejouer ?
| > Afficher Choix : Oui, Non
| > Si [Oui] - Faire
| >| > Appeler Script : SV[0] = events{|id|(id > 1)&&(event_name(id).include?("ennemi"))&&(not  
| >| > Appeler Script : event_erased?(id)) }
| >| > Appeler Script : event_erase(SV[0])
| >| > Appeler Script : V[0] = 0
| >| > Appeler Script : S[1] = false
| >| >
| > Si [Non] - Faire
| >| > Téléporter l'équipe : [004:AU PREMIER !], (X:000, Y:012)
| >| >
| > Fin - Choix
| >
Ici j'affiche le temps passé, puis pour nettoyer le système(en cas de partie recommencée, je fais un autre sélecteur qui va créer un tableau contenant les id des event ayant "monstre" dans leur nom pour tous les effacer. Et je remet le timer à 0.

D'ailleurs en parlant de timer :

Event - Timer
| > Appeler Script : V[0]  += 1  
| > Appeler Script : V[1] = V[0]%60
| > Appeler Script : V[2] = (V[0]/60)%60
| > Appeler Script : text_show(1, "#{V[2]} : #{V[1]}", "default", 242, 0)
| > Appeler Script : wait(60)
| >
Rien de spécial à commenter je pense.

Event - Lancement Monstres
| > Appeler Script : invoke_event(10, 1, fresh_event_id, 0, random(0, 12))
| > Appeler Script : wait(60)
| >
Le lancement des monstres dans le mini-jeu est assez simple pour le moment, j'ai une seconde map avec un event que j'invoque sur la map à intervalles réguliers.

Et pour finir :

Event - InputAttente
| > Commentaire : Gestion d'input avec wait
| > Condition : la touche C est pressée
| >| > Appeler Script : SV[2] = events{|id|(event_y(id) == event_y(1))&&(not event_erased?(id))&&(id > 1)&&
| >| > Appeler Script : (event_name(id).include?("ennemi"))}
| >| > Appeler Script : SV[3] = SV[2].inject do |memo,id|
| >| > Appeler Script :   (event_x(1) - event_x(memo)) < (event_x(1) - event_x(id)) ? memo : id
| >| > Appeler Script : end
| >| > Appeler Script : unless SV[3] == nil
| >| > Appeler Script :   show_animation(SV[3], 91, false)
| >| > Appeler Script :   wait(8)
| >| > Appeler Script :   event_erase(SV[3])
| >| > Appeler Script :   wait(30)
| >| > Appeler Script : end
| >| > Attendre : 15 Frames
| >| >
| > Fin - Condition
| >
Ici, je veux récupérer l'event en face du héros le plus proche de lui. J'utilise donc un troisième sélecteur avec 4 filtres pour récupérer les id des events en face de mon personnage. Ensuite, pour passer du tableau d'id à une id, j'utilise une méthode ruby, inject. En gros ce que ça fait c'est que ça met dans la variable memo le premier id du tableau et puis ça parcours le tableau et quand ça trouve l'id d'un evenement plus à droite que celui dans memo, ça me ce nouveau id dans memo. Et une fos lme tableau parcouru memo est récupéré.
Ensuite une condition avec unless pour n'effacer l'event que s'il y en a un de sélectionné (aka quand le joueur ne tire pas dans le vide).

Voilà je pense que j'ai fait le tour ^^

Voir le profil de l'utilisateur

Voir le sujet précédent Voir le sujet suivant Revenir en haut  Message [Page 1 sur 1]

Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum