[Solarus 1.4.4] La commande de mouvement "target"

Démarré par Jerelink, 11 Novembre 2015 à 23:24

0 Membres et 1 Invité sur ce sujet

Bonsoir a tous !

Je suis en ce moment en pleine phase de découverte de l'engine, après avoir suivi les tutos (v 1.4) de Christopho (Que je tiens d'ailleurs a féliciter pour ce travail remarquable). J'ai tenté l'expérience d'apprentissage seul en m'aidant de l'API, seulement, je me confronte a mon premier problème (Très certainement celui d'une longue liste)  :mrgreen: ).

J'ai tenté de faire quelque chose de simple, un pnj qui suit le héro et s'arrête prêt de lui. J'ai donc utilisé un petit bout de script comme celui-ci sur la map ou se situe le pnj :

Citationfunction map:on_started()
 
 local m = sol.movement.create("target")
 m:set_speed(40)
 m:start(pnj_1)
 m:set_smooth(false)
end

Ce qui fonctionne, sauf que maintenant le pnj s'arrête a tout les obstacles (ce qui etait prévisible avec le "smooth".
J'ai donc tenté de contourner le problème en déclarant les positions X et Y du hero puis du PNJ et de créer une condition dans laquelle le smooth est "false" uniquement quand ces coordonnées s'assimilent (ce qui après réflexion, n'est possible que si le pnj arrive au coordonnées exactes en passant au travers du hero..).

Je suis donc confronté a ce petit souci que j'aimerais résoudre et je fais appel a vous qui utilisez ce logiciel.

Comment faire pour que la commande "target" se termine après être arrivé prêt du hero (ainsi que son animation de marche persistante) puis ensuite la redémarrer si le hero s'éloigne ?

Merci, bonne soirée !  :)

Un moyen est de stopper le mouvement lorsque la distance entre le PNJ et le héros est inférieure à un certain seuil. Ce que tu peux vérifier dans pnj_1:on_position_changed() par exemple. Je fais cela dans Zelda Roth pour Zelda qui suit le héros dans le donjon 9. N'hésite pas à regarder le code ^^
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

Ok, donc j'ai un peu regardé le code de Zelda ROTH, dans la façon don c'est programmé sa me parait plutôt complexe même si je sais a peu prêt ou mène le code de l'entité custom. "is_following_hero" est une variable ? Si tel est le cas ou a-t-elle était déclaré, sa me perturbe un peu ^^

Non, is_following_hero est une méthode personnalisée : https://github.com/christopho/zelda_roth_se/blob/master/data/entities/zelda.lua#L123

Elle fait appel à une variable qui est "zelda_following" et qui est initialisée dans "zelda:hero_gone" et "zelda:follow_hero" :)


Malheureusement je ne comprend pas chose a tout ceci.. J'ai l'impression que la tache s'avère plus rude que ce que j'ai pu imaginer.
Une méthode personnalisée c'est quoi ? Une entité custom ?

Je devrais peut être me pencher sur autre chose, sa me parait plutôt compliqué pour quelqu'un comme moi.

Une méthode c'est une fonction. Renkineko veut juste dire que c'est une fonction définie en Lua. C'est-à-dire par tes scripts Lua et non par Solarus.
Chaîne Twitch : diffusion en direct de sessions de développement de Solarus, de création de jeux, de parties de jeux vidéo.
Chaîne YouTube : replays des diffusions en direct, tutos Solarus
Compte Twitter : pour être au courant des nouveautés
Chat Discord : pour discuter en direct avec la communauté Solarus

D'accord, c'est plus clair, merci ;) ! Mais cette fonction n'existe pas dans l'API, non ? J'ai cherché sans trop trouver..

L'API ne concerne que le moteur, donc non il n'y a pas d'API avec une fonction que tu écris toi-même. C'est une fonction que tu écris, tu lui fais faire ce que tu veux, tu lui donnes les paramètres que tu veux, comme dirait YuGiOh : à toi d'jouer. :)

Désolé si j'ai embrouillé avec mes termes techniques, c'est le souci quand on est développeur professionnel : on aime utiliser les termes précis et donc on évite les approximations xD J'irai m'auto-flageller pour avoir semé le doute au lieu d'aider, car c'est péché.


Il n'y a pas de mal ! C'est pas facile de discuter d'un sujet comme celui ci avec quelqu'un qui a encore bien peu de notion même si dans l'ensemble je sais plus ou moins comment fonctionne une variable, une fonction, un tableau etc  ^_^.

Là ou je m'embrouille un peu en fait c'est qu'il ne me semblait pas possible de créer des "function" a partir de rien sans même une variable type :
Citationlocal function blablabla()
. Du coup je cherche encore l'origine de
Citationfunction zelda:is_following_hero()

C'est justement ce qu'ils entendent par "fonction créée en lua" : elle n'appartient pas à l'api, elle a été créée au sein du fichier lua, pour un usage local :)

Pour faire simple, le moteur Solarus utilise deux langages :
- le C++, complexe, pour les parties qui nécessitent de la performance (réservé à ceux qui améliorent le moteur).
- le Lua, plus flexible, pour l'élaboration des quêtes (pour les utilisateurs du moteur).
Ces deux langages permettent de coder tout et n'importe quoi, mais ils sont plus intelligemment utilisés de la sorte ^^

En tant qu'utilisateur du moteur, tu peux donc soit écrire tes propres fonctions en lua, soit appeler les fonctions lua de l'api (qui font pour la plupart appel au code C++).

Dans le cas présent, la fonction "function zelda:is_following_hero()" est une fonction rajoutée pour les besoins du script, elle n'appartient pas à l'api. Tu peux voir son contenu, sa définition, à la ligne 123.

La notation
function nomDeTaFonction(argument1, argument2, ..., argumentN)
...
end

est équivalente à la notation suivante :
nomDeTaFonction = function(argument1, argument2, ..., argumentN)
...
end


Le mot clef "local" ne s'utilise que pour limiter la visibilité d'une variable au bloc courant (corps de boucle, de condition, de fonction, ...) et permettre de réutiliser le même nom de variable à différents endroits sans conflit :)
Marre des pavés ? Marchez dans la boue!
ハハ、あなたは私の罠に落ちた!

Effectivement voilà qui est plus clair  ^_^. Je pense que j'avais mal compris une chose qui va pas mal m'aider par la suite.
J'ai toujours cru qu'il fallait passer les "function" en local pour les créer soit même, il était impossible pour moi d'envisager la création une "function" si celle-ci n'était pas existante dans l'API.. C'est beaucoup plus clair, merci a tous ! ;)

Je vais tout de même me concentrer avant toutes choses sur les tutos de Chris en 1.2 même si certains comportent des problèmes de compatibilité avec la 1.4.4 .