Day.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV/MZ

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Sorties: "Dread Mac Farlane", (...) / Tutos: Checklist de la composition (...) / Sorties: Dread Mac Farlane - episode 8 / Sorties: Dread Mac Farlane - episode 7 / Jeux: Ce qui vit Dessous / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

315 connectés actuellement

29469694 visiteurs
depuis l'ouverture

106398 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Lunae - le bazar d'Emz0

Tashiroworld

Guelnika & E-magination

Zarok

RPG Maker - La Communauté

Tous nos partenaires

Devenir
partenaire



forums

Index du forum > Entraide > [RMXP] Je n'arrive pas à coder mon système de map...


Ardonie - posté le 24/09/2023 à 21:06:12 (855 messages postés) -

❤ 0

Ex Couteau Suisse Agréé

Domaine concerné: Event
Logiciel utilisé: RMXP
Bonjour à tous ! Encore une fois, j'appelle à l'aide pour un système qui me semblait tout bête sur le papier, et que je n'arrive pourtant pas à faire.

Le projet sur lequel je travaille a un système de mini-carte qui pourrait presque s'apparenter à un jeu de l'Oie:
image
Faut voir ça comme la capacité "Vol" dans Pokémon, sauf que le jeu calcule la distance entre d'où vient le joueur et où il va, afin d'éviter d'aller trop loin d'un coup.


Voilà comment j'aimerais que ce système se comporte :
Le héros apparaît sur le point correspondant à où il se trouve dans le pays, c'est son point d'origine.
Il peut se déplacer sur les portions de route tant qu'elles sont noires ou oranges.

Quand le joueur est sur une portion de route, celle-ci est blanche et compte comme une distance parcourue.
La portion de route blanche est la destination. Si le joueur valide son action, il se rend sur la map correspondant à cette portion de route sur la mini-carte, et perdra des points de carburant en conséquence.

Si le joueur continue son chemin, la route qu'il a traversé devient orange, et compte toujours comme une distance parcourue.

EN REVANCHE (et c'est là où ça se complique pour moi) si le joueur décide de faire demi-tour et de revenir sur ses pas, les portions de route qui ne comptent plus redeviennent noires et rendent les points de carburant, mais gardez bien en tête que même en revenant sur ses pas, la case sur laquelle se trouve le héros est toujours blanche et donc compte.

Bien que le point d'origine est blanc/orange, il n'est pas comptabilisé.

image

Quand le joueur est satisfait et valide son trajet, le jeu regarde le nombre de portion de route traversées (oranges et blanche)
et retire le nombre de point de correspondant. Le joueur se téléporte ensuite sur la carte de sa destination.
La prochaine fois qu'il remontera dans son véhicule pour voyager à nouveau, son point d'origine sera le point de destination de son dernier voyage.

image

Voilà... J'espère que mon explication est claire, et que vous pourrez m'aider !
PS : J'ai sous le coude un script de variable locale, si ça peut aider ?

Sylvan Melody, c'est par ici ! | Mes Musiques! | Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne."


Roi of the Suisse - posté le 25/09/2023 à 10:25:00 (29836 messages postés) - honor -

❤ 0

Alerte neige !

J'ai l'impression qu'on peut réussir à faire ce que tu demandes en enregistrant les cases piétinées dans un tableau et puis en faisant poper hors du tableau le dernier enregistrement si on rebrousse chemin.


En arrivant sur la map, un évènement d'initialisation :

Portion de code : Tout sélectionner

1
2
3
4
5
6
(processus parallèle)
# initialiser le tableau dans la variable 125
$game_variables[125] = Array.new
# demander à toutes les routes de devenir noires
activer l interrupteur 33 "réinitialiser routes"
supprimer cet évènement




Évènement pour chaque case à piétiner :

page 1

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
(au contact du héros)
# condition si la case est noire, c est-à-dire regarde vers le bas
condition si cet event regarde vers le bas
    #ajouter l id de l évènement au tableau 
    $game_variables[125].push(@event_id)
    #rendre cette route rouge, c est-à-dire la faire regarder vers le haut 
    $game_map.events[@event_id].direction = 8
sinon (cet évènement regarde vers le haut, c est-à-dire la case est rouge)
    #retirer le dernier id ajouté dans le tableau (cf. pop ci-dessous)
    #rendre la précédente route noire, c est-à-dire la faire regarder vers le bas 
    $game_map.events[ $game_variables[125].pop ].direction = 2
fin de si



page 2

Portion de code : Tout sélectionner

1
2
3
4
5
6
(processus parallèle, interrupteur 33 "réinitialiser routes")
#rendre la route noire, c est-à-dire la faire regarder vers le bas 
$game_map.events[@event_id].direction = 2
# on attend que toutes les autres routes aient bien eu le temps de redevenir noires avant d éteindre l interrupteur 
attendre 1 frame
désactiver interrupteur 33 "réinitialiser routes"




Évènement pour valider le trajet :

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(processus parallèle)
condition si la touche L est pressée
    #calculer dans la variable 126 le nombre de cases piétinées 
    $game_variables[126] = $game_variables[125].size 
    # téléporter l équipe en fonction de la position du héros sur la map
    rendre la variable 200 "x heros" égale à la coordonnée x du héros
    rendre la variable 201 "y heros" égale à la coordonnée y du héros
    # Marseille, ville aux coordonnées (5;11)
    condition si la variable 200 "x heros" == 5
    condition si la variable 201 "y heros" == 11
        # consommer du carburant
        argent retirer le contenu de la variable 126
        téléporter l équipe à Marseille
    fin de si 
    fin de si
    # Toulouse, ville aux coordonnées (14;6)
    condition si la variable 200 "x heros" == 14
    condition si la variable 201 "y heros" == 6
        # consommer du carburant
        argent retirer le contenu de la variable 126
        téléporter l équipe à Toulouse
    fin de si 
    fin de si
fin de si



:avert2 J'ai pas testé, je te dis tout ça de tête, y a peut-être des coquilles.
:avert2 Ce système simple ne fonctionne pas si ta map ferroviaire comporte des boucles ( = plusieurs façons d'arriver à une même ville). Auquel cas il faudra mettre en place un système beaucoup plus complexe avec peut-être un algorithme de pathfinding.

L'essentialisme c'est quand ta voiture a un moteur essence. | Es-tu une star ? | Kujira no Hara | Polaris 03 | Planète Glutko


Ardonie - posté le 25/09/2023 à 16:43:35 (855 messages postés) -

❤ 0

Ex Couteau Suisse Agréé

Aaah... J'avais eu une idée de garder en mémoire les dernières cases traversée, et de faire une comparaison des dernières et avant dernières cases, et si c'était la même, la case redevenait noire ou quelque chose comme ça... Mais c'était pas très concluant. :goutte Ta proposition apporte un élément auquel je n'avais pas pensé !
Merci, je vais tester ça !

Alors, concernant les boucles sur la map... Il y en a.:s
En soi, je suis pas contre de me débarrasser de certaines, mais je crois qu'au final, toutes les villes sont un peu interconnectées dans une grande boucle. Après les boucles ne sont pas "égales", Par exemple si tu veux aller de A à D, et que tu peux techniquement passer par B ou C, l'un des trajets sera plus court que l'autre (genre 3/4 portions de route VS 6/7)

Est-ce qu'on se débarrasserait du problème si le joueur n'a pas assez de point pour avoir le choix ? (techniquement, il peut prendre le chemin qu'il veut, l'un est juste plus long que l'autre et il faudra attendre que la jauge de carburant se remplisse, ce qui arrive une fois par jour après un reset total du système de map)

Bonne nouvelle, j'ai un script de pathfinding, et un autre de "zone" (qui en gros, peut détecter si un event est dans la zone d'un autre event, et je peux définir la forme de cette zone)

Pour l'instant, y a pas de boucle sur ma map, alors je vais tester ça et je te tiens au courant ! Merci encore ! :clindoeil3
______________________________________________________________________________________________
Bon ! J'ai testé, et je fais face au même souci qu'avec ma méthode :
Aller de A à B, c'est bon.
Revenir de B à A sans s'arrêter, c'est bon.
En revanche, faire des allez-retour entre A et B pourri tout le truc et on se retrouve avec une situation cocasse où certaines cases sont actives et d'autres inactives en milieu de trajet.

Sylvan Melody, c'est par ici ! | Mes Musiques! | Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne."


Troma - posté le 25/09/2023 à 21:03:03 (6236 messages postés) -

❤ 0

Je procrastine

un simple évenement triple pages :
Page sans interrupteur - page local A (si gauche A désactivé si droite B activé) - page local B (si gauche désactivé B si droite Activé B) - et un interrupteur qui confirme le passage du chemin A a B.
Tu rajoutes ta variable +/- carburant et a la validation du chemin tu actives l'interrupteur chemin x
Le truc emmerdant c'est que ça crée beaucoup d’événements , beaucoup d'interrupteurs (un pour chaque traçons A a B) et qu'il faut pas trop de carrefours, mais si la position de chaque points valide un parcours et la consommation , ça doit être faisable.
Je dis peut être une connerie je confirme rien mais j'aurais fait un truc comme ça.

ꀎꀎꀎꀎꀎꀎꀎ


Ardonie - posté le 25/09/2023 à 21:51:01 (855 messages postés) -

❤ 0

Ex Couteau Suisse Agréé

Citation:

un simple événement triple page : 1 marron, 1 jaune si au contact et conditions direction - variable x , direction x ou y


ça pourrait marcher si le point d'origine était toujours le même...
Mais en fonction de où tu te déplace sur la map, tout change !

Peut-être que y a un truc à faire avec des déclenchement dès qu'on marche sur une intersection...

Sylvan Melody, c'est par ici ! | Mes Musiques! | Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne."


Picot - posté le 26/09/2023 à 15:56:35 (1015 messages postés) -

❤ 0

C'est pas moi, j'ai un alibi !

image

Recueil de créations variées | RMXP : Quadrilogie "Le Tueur" | FPS : "Mr The Killer"


Mack - posté le 26/09/2023 à 16:15:26 (2290 messages postés) - staff

❤ 0

J'suis pas sur d'avoir compris comment tu veux gérer le système de boucle ?
Imaginons un cas comme celui là :
image
Dans les deux cas, le joueur va faire la tracé rouge, il va donc faire une boucle, puis partir sur la gauche.
Tu veux que le décompte des points marche comment ? Il va compter le chemin vert, ou le chemin rouge ?

Parce que si c'est la chemin vert, tu reprends la méthode RotS, mais au lieu de retirer seulement la dernière case quand tu passes sur une case où t'as déjà marché dessus, tu la cherches dans ta liste, et tu effaces toute les cases après elle. ( Page 1, la partie du else )

Dans notre exemple, ça va enregistrer le chemin, et quand le joueur passera une seconde fois sur l'intersection du haut/droit, la liste va se vider pour ne laisser que la case directement en dessous du héros, et l'intersection haut/droit, et donc donner le chemin vert au final.



Sinon RotS, tu t'es pas un peu foiré dans ta page 1 ?
Dans le else tu vérifies juste si c'est une case noire, pas si c'est la dernière.
Potentiellement, juste en rajoutant une condition au else genre :

Portion de code : Tout sélectionner

1
sinon (cet évènement regarde vers le haut, c est-à-dire la case est rouge, et que c'est la dernière case du tableau)


Ca devrait permettre de limiter le changement de couleur seulement en cas de retour, et pas en cas de boucle.

( Je prend note de tout les commentaires, même si je n'y répond pas )


Ardonie - posté le 26/09/2023 à 17:28:21 (855 messages postés) -

❤ 0

Ex Couteau Suisse Agréé

Mack a dit:


Imaginons un cas comme celui là :
image


Oh noooooon.... :goutte
Très franchement, je ne sais pas comment gérer une situation comme celle-là.
Je pense que je vais éviter de faire de petites boucles, et le joueur devra faire le trajet en plusieurs jours. Je vois que ça.

Mack a dit:


Tu veux que le décompte des points marche comment ? Il va compter le chemin vert, ou le chemin rouge ?


Tout dépend de quel chemin le joueur emprunte ! Si il veut dépenser 14 points de carburant en passant par le chemin rouge au lieu de 6 avec le chemin vert, libre à lui, hein ! XD
Mais ta question est pertinente concernant le cas du chemin rouge !
tout irait normalement jusqu'aux cases 10, 11 et 12, qui ont déjà été traversées une fois...
Je pense qu'il faut que je mette en place un système de calcul de distance entre le point d'origine et où se trouve le joueur.
Si on applique ce système à ton problème de boucle, je pense que le jeu pourrait tout simplement reset le trajet dès que le joueur se rapproche du point d'origine. (genre dès qu'il marche sur la case 7 du trajet rouge)

Sylvan Melody, c'est par ici ! | Mes Musiques! | Le making, c'est réaliser le meilleur jeu du monde... à vos yeux."Les RTP c'est quand même très limité. Quand on réalise un jeu, on réalise un univers qui va avec, et cet univers il passe beaucoup par les graphismes, et l'identité qu'on leur donne."


Mack - posté le 26/09/2023 à 18:16:58 (2290 messages postés) - staff

❤ 1

Dans mon exemple, le joueur choisis le même chemin ( le tracé rouge ), le tracé de couleur c'est celui qu'il fera en validant le trajet, selon la méthode que tu choisiras ^^.

Mais oui, si dans ton LD tu évites de faire des boucles plus petite que le maximum de carburant disponible, ça devrait éviter le problème de boucle ^^
Sinon, tu peux aussi proposer de raccourcir automatiquement le chemin au plus court quand le jeu se rend compte qu'il en existe un

Sinon, essaye juste de rajouter ma condition au système de RotS, ça devrait marcher je pense :

Portion de code : Tout sélectionner

1
sinon (cet évènement regarde vers le haut, c est-à-dire la case est rouge, et que c'est la dernière case du tableau)



Pour ça, suffit de parcourir la liste, et vérifier si un des éléments correspond à la case que tu checks.
Si un élément correspond, tu enregistres la position de l'elt, et tu pop ( Taille de liste - Position ) fois ta liste, ça devrais enlever tout les elts après celui qui nous intéresse


EDIT :
J'ai essayé de bidouiller un truc :
https://www.mediafire.com/file/o2ot14mirahnscz/Ardonie.zip/file

Clairement, on voit que quand y a des boucles ça fou le bordel avec le mélange entre ma solution et celle de RotS :F
On peut aussi voir que si on repasse sur les même cases, ben ça va pas re-changer les couleurs, donc ça sera pas facile de savoir d'où on vient si on veut rollback :/


Re-Edit :
image
En remplaçant l'évent commun par ça, ça marche beaucoup mieux.
Tu vas toujours avoir le problème de lisibilité vu que ça changera pas si on marche 2 fois sur une même case, mais sur le reste ça devrait être bon.

Portion de code : Tout sélectionner

1
 $game_variables[10].push(@event_id)


Portion de code : Tout sélectionner

1
2
3
4
5
i = $game_variables[10].length() - 2
a = $game_variables[10][i]
if @event_id == a
  $game_switches[1] = true
end


Portion de code : Tout sélectionner

1
2
3
4
a = $game_variables[10].pop 
if !$game_variables[10].include?(a)
  $game_map.events[a].direction = 2
end


Portion de code : Tout sélectionner

1
 $game_variables[10].push(@event_id)



Re-Re Edit :
https://www.mediafire.com/file/jr0ozgsqbqcjlkr/Ardonie2.zip/file

J'ai mis la modif du dessus, et en plus j'ai fait une autre méthode, qui devrait toujours prendre le chemin le plus court.
Pour tester les 2 méthodes, t'as juste à inverser les deux évents communs, le "TestEventPlusCourt" fera en sorte que si on repasse sur une même case, il supprimera tout pour faire comme si c'était la première fois qu'on y va dessus.
Et le second, il enregistre tout les déplacements qu'on fait, le problème étant que si on passe 2+ fois sur une même case, on ne le sait pas, et surtout on ne sait pas forcèment d'où on vient.

( Je prend note de tout les commentaires, même si je n'y répond pas )


Roi of the Suisse - posté le 27/09/2023 à 10:53:58 (29836 messages postés) - honor -

❤ 0

Alerte neige !

Mack a dit:

Sinon RotS, tu t'es pas un peu foiré dans ta page 1 ?
Dans le else tu vérifies juste si c'est une case noire, pas si c'est la dernière.
Potentiellement, juste en rajoutant une condition au else genre :

Portion de code : Tout sélectionner

1
sinon (cet évènement regarde vers le haut, c est-à-dire la case est rouge, et que c'est la dernière case du tableau)


Ca devrait permettre de limiter le changement de couleur seulement en cas de retour, et pas en cas de boucle.


Comme je l'ai signalé, dans mon ébauche de solution, je n'ai pas du tout cherché à gérer les boucles, vu qu'il n'y en avait pas sur le schéma initial. S'il n'y a pas de boucle, et qu'on marche sur une case rouge, c'est forcément la dernière en date (on a rebroussé chemin). Mais oui, avec des boucles, ça change tout, ça n'est plus nécessairement vrai...

L'essentialisme c'est quand ta voiture a un moteur essence. | Es-tu une star ? | Kujira no Hara | Polaris 03 | Planète Glutko


Tassle - posté le 27/09/2023 à 13:25:58 (5234 messages postés)

❤ 1

Disciple de Pythagolf

Je sais pas si c'est ce que t'as fait au final Mack, mais si on veut toujours avoir un chemin sans boucles (ce qui ne veut pas forcément dire que c'est le plus court!) il suffit de, lorsqu'on marche sur une case déjà rouge, poper la liste des cases rouges jusqu'à tomber sur la case actuelle. Pas besoin de rechercher explicitement la case actuelle dans la liste, juste quelque chose du genre au contact du héros, si la case est déjà rouge:

Portion de code : Tout sélectionner

1
2
3
4
5
while($game_variables[125][-1] != @event_id)
    rendre_noir($game_variables[125][-1])
    $game_variables[125].pop()
end
 



~~


Roi of the Suisse - posté le 27/09/2023 à 14:39:14 (29836 messages postés) - honor -

❤ 0

Alerte neige !

Mack a mentionné une astuce similaire (avec recherche), mais je ne sais pas s'il l'a mise en place dans son prototype :

Mack a dit:

Parce que si c'est la chemin vert, tu reprends la méthode RotS, mais au lieu de retirer seulement la dernière case quand tu passes sur une case où t'as déjà marché dessus, tu la cherches dans ta liste, et tu effaces toute les cases après elle. ( Page 1, la partie du else )


Ça résoudrait le souci des boucles en tout cas !

L'essentialisme c'est quand ta voiture a un moteur essence. | Es-tu une star ? | Kujira no Hara | Polaris 03 | Planète Glutko


Tassle - posté le 27/09/2023 à 15:00:15 (5234 messages postés)

❤ 0

Disciple de Pythagolf

Ah oui, je disais juste qu'il n'y a pas besoin de chercher explicitement dans le tableau, on peut simplement popper jusqu'à retomber sur la case.

Sinon je viens de voir ça:

Portion de code : Tout sélectionner

1
Array.new


Portion de code : Tout sélectionner

1
$game_variables[125].pop


Il y a pas de parenthèses quand on appelle une méthode sans paramètres en Ruby ? Rhalala ce que c'est moche.

~~


Roi of the Suisse - posté le 27/09/2023 à 15:25:44 (29836 messages postés) - honor -

❤ 0

Alerte neige !

Tu peux en mettre, mais s'il n'y a pas d'arguments, tu n'en as pas besoin. C'est de la concision. À chaque fois qu'un programmeur tape un caractère, il y a une probabilité pour qu'il se trompe, donc plus un langage est concis, plus il est sûr :grossourire
C'est une question d'habitude, mais même si on vient de langages comme le C, le javascript, le Java, on finit par apprécier l'absence de lourdeurs du ruby.

L'essentialisme c'est quand ta voiture a un moteur essence. | Es-tu une star ? | Kujira no Hara | Polaris 03 | Planète Glutko


Tassle - posté le 27/09/2023 à 16:13:42 (5234 messages postés)

❤ 0

Disciple de Pythagolf

Bah si tu compares à un langage de bas niveau et à deux langages horribles aussi :F (Mais j'ai souvent entendu dire que le Ruby était super cryptique et illisible, et qu'il y avait 30 méthodes magiques pour chaque opération imaginable)

(Perso les trois langages que j'utilise régulièrement selon ce que je veux faire avec c'est Python, Go et Rust, + le C++ quand je suis obligé parce que je donne des TPs)

~~

Index du forum > Entraide > [RMXP] Je n'arrive pas à coder mon système de map...

repondre up

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers