Forum Solarus-Games francophone

Jeux amateurs => Aide & support => Discussion démarrée par: binbin le 23 Avril 2013 à 14:15

Titre: [Moteur zs]Personnage qui te regarde quand tu te déplace
Posté par: binbin le 23 Avril 2013 à 14:15
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 ?
Titre: Re : [Moteur zs]Personnage qui te regarde quand tu te déplace
Posté par: Christopho le 23 Avril 2013 à 14:37
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) (http://www.solarus-games.org/doc/1.0.0/lua_api_entity.html#lua_api_entity_get_angle)

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.
Titre: Re : [Moteur zs]Personnage qui te regarde quand tu te déplace
Posté par: Christopho le 17 Août 2013 à 14:41
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