[solarus] récuperer la touche auquel un objet est assigné ?

Démarré par MetalZelda, 23 Octobre 2015 à 00:46

0 Membres et 1 Invité sur ce sujet

Salut toutes les tous

je rencontre actuellement quelques difficulté dans la création d'item et deux questions me taraudes.

function game:on_key_released(key)
local bow_state = game:get_value("bow_state")
local can_fire = game:get_value("can_shoot")
local handled = false
local map = game:get_map()
local hero = map:get_hero()

if key == "x" and bow_state == 1 and item:get_amount() == 0 and can_fire == true and not game:is_suspended() then
hero:set_tunic_sprite_id("hero/item/bow_shoot_tunic1")
sol.audio.play_sound("/items/bow/no_arrows_shoot")
hero:freeze()
-- can't shoot arrows, but reset to state 1
sol.timer.start(100, function()
   game:set_value("bow_state", 1)
game:set_value("can_shoot", false)
hero:set_tunic_sprite_id("hero/item/bow_moving_free_tunic1")
hero:unfreeze()
game:set_pause_allowed(true)
end)
elseif key == "x" and bow_state == 1 and item:get_amount() > 0 and can_fire == true and not game:is_suspended() then
hero:set_tunic_sprite_id("hero/item/bow_shoot_tunic1")
shoot_arrow()
hero:freeze()
sol.timer.start(100, function()
game:set_value("bow_state", 1)
game:set_value("can_shoot", false)
hero:unfreeze()
hero:set_walking_speed(40)
hero:set_tunic_sprite_id("hero/item/bow_moving_free_tunic1")
game:set_pause_allowed(true)
end)
end
end


Comme vous pouvez le voir ici, le script check si la touche X est relachée si et seulement si une valeure est rencontrée afin de lancer le processus.
Mais le probleme, et ce que j'ai pas pu trouver sur l'API, c'est que je cherche a stocker ou a trouver une fonction qui permet de recuperer le slot actuel (donc la touche) de l'item afin de remplacer ce "x".

game:get_item_assigned(1) retourne juste le nom de l'item qui occupe le slot 1 et 2 et ca m'aide pas beaucoup

2) Existe t-il un moyen de désactiver des fonctions du héros ? Par exemple lui enlever l'abilité de pousser / tirer / ouvrir / interragir avec quelque chose en quelque sorte

1) Tu peux facilement faire cette fonction. Elle n'a qu'à appeller game:get_item_assigned(1) et game:get_item_assigned(2) et regarder si l'un des deux est l'item que tu cherchese.
2) Un moyen de le faire est de désactiver la commande "action". Je le fais dans Zelda ROTH quand je transforme Link en lapin.
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

23 Octobre 2015 à 13:45 #2 Dernière édition: 23 Octobre 2015 à 14:08 par MetalZelda
Citation de: Christopho le 23 Octobre 2015 à 08:38
1) Tu peux facilement faire cette fonction. Elle n'a qu'à appeller game:get_item_assigned(1) et game:get_item_assigned(2) et regarder si l'un des deux est l'item que tu cherchese.
2) Un moyen de le faire est de désactiver la commande "action". Je le fais dans Zelda ROTH quand je transforme Link en lapin.

pour la solution 1 je vois pas trop comment faire, j'ai essayer une variable local qui stock l'info si l'item est dans un slot mais ca fonctionne pas, j'ai essayer dans une fonction a pars, puis directement dans la fonction on_key_pressed

edit : ca marche pour la solution 2, sauf qu'il peut toujours pousser lorsqu'on reste appuyé sur un mur, encore c'est pas génant et c'est contournable  :mrgreen:

function game:get_item_slot(item)
for i = 1, 2 do
  if game:get_item_assigned(i) == item then
  return i
end
return nil
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

23 Octobre 2015 à 16:11 #4 Dernière édition: 23 Octobre 2015 à 20:04 par MetalZelda
Citation de: Christopho le 23 Octobre 2015 à 14:32
function game:get_item_slot(item)
for i = 1, 2 do
 if game:get_item_assigned(i) == item then
 return i
end
return nil


ca fonctionne uniquement pour l'input "x", quand j'appuie sur "v" (meme avec une condition qui dit que si i == 1 ou 2 alors la valeur key aura comme valeure "x" ou "y"), etrange  :huh:

J'utilise game:on_key_pressed si ca peut aider

edit : j'ai essayer une verif avec print et tout les items sont noté en slot 1  :huh:

29 Janvier 2016 à 07:59 #5 Dernière édition: 20 Février 2016 à 03:57 par Cvvsw
Coool ! Merci pour votre avis, je vais le bien essayer! Merci en retard!







coque google nexus 5X coque google nexus 5X