[Moteur zs]Personnage qui te regarde quand tu te déplace

Démarré par binbin, 23 Avril 2013 à 14:15

0 Membres et 1 Invité sur ce sujet

J'aimerais connaître la meilleure manière de faire en sorte qu'un personnage regarde ton héros quand tu te déplaces et ce peu importe la direction.

J'ai bien une idée de comment faire( comparer les coordonnées des deux persiste notamment) mais j'ai l'impression que c'est se compliquer pour rien. Une idée ?

23 Avril 2013 à 14:37 #1 Dernière édition: 28 Avril 2013 à 16:59 par Christopho
L'idée est là. On peut cependant utiliser une méthode qui fait une partie du calcul, évitant ainsi plein de if : entity:get_angle(other_entity)

Dans le script de la map, périodiquement (donc à l'aide d'un timer), je vérifierais donc l'angle entre le PNJ et le héros.

Supposons que ton PNJ s'appelle "marine" : tu peux créer la fonction suivante dans ton script de map :

local function repeat_marine_direction_check()
 local angle_to_hero = marine:get_angle(hero)  -- Récupérer l'angle en radians entre le pnj et le héros.
 local direction4 = angle_to_direction4(angle_to_hero)  -- Obtenir la direction la plus proche parmi les 4 principales.
 marine:get_sprite():set_direction(direction4)

 -- Rappeler cette fonction dans 0.1 seconde.
 sol.timer.start(map, 100, repeat_marine_direction_check)
end

function map:on_started()
 repeat_marine_direction_check()
end

Remarque : le premier paramètre de sol.timer.start est la durée de vie de ce timer, dans notre cas la map. Quand Link change de map, le timer disparaîtra donc comme attendu.

La fonction utilitaire angle_to_direction4, qui convertit un angle en une direction arrondie, n'existe pas dans le moteur mais on peut l'écrire :

-- Convertit un angle en radians en l'une des 4 directions principales avec le bon arrondi :
-- 0 (est), 1 (nord), 2 (ouest) ou 3 (sud)
function angle_to_direction4(angle)
 return math.floor((angle_to_hero + math.pi / 4) / (math.pi / 2))
end

C'est là qu'on réalise à quoi servent les maths au lycée, en particulier la trigonométrie ^^

PS : pour info, les PNJ se tournent déjà automatiquement vers le héros quand le héros leur parle.
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

Dans Solarus 1.1, une nouvelle fonction entity:get_direction4(other) permet de simplifier le code :


local function repeat_marine_direction_check()
  local direction4 = marine:get_direction4_to(hero)  -- Obtenir la direction la plus proche parmi les 4 principales.
  marine:get_sprite():set_direction(direction4)

  -- Rappeler cette fonction dans 0.1 seconde.
  sol.timer.start(map, 100, repeat_marine_direction_check)
end

function map:on_started()
  repeat_marine_direction_check()
end

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