Partagez
Aller en bas
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 30
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Résolu Petit problème sur un script

le Dim 21 Fév 2016 - 13:37
Coucou, j'ai un petit problème sur un script de craft.

Dans mon jeu, on peut accéder à plusieurs types de craft comme l'alchimie avec les objets, la forge avec les équipements... Quand on se trouve sur la forge, le joueur peut appuyer sur une touche (ici Shift) pour accéder à une interface permettant de vérifier si l'équipement à crafter est meilleur ou pas que l'équipement porté actuellement. Quand on passe sur cette interface en appuyant sur Shift, on entend le bruit du curseur. Si on est déjà sur cette interface et qu'on appuie sur Shift, l'interface disparaît et on entend le bruit de l'annulation. Ceci n'est valable que pour les équipements, si on essaie d'appuyer sur Shift alors qu'on est dans l'alchimie avec les objets, il ne se passe rien.

Mon problème se situe au niveau des équipements lorsque je veux accéder à l'interface. J'y accède à chaque fois mais j'entends le bruit du curseur que la première fois. Le bruit de l'annulation marche à chaque fois que je quitte l'interface mais pas le bruit du curseur lorsqu'on ouvre de nouveau cette interface.

Le script se trouve ci-dessous (la partie concernée doit se trouver aux lignes 18 à 28) :

Code:
$crafting_category = [:All]
module ADV_RECIPE
  @actual_cat = $crafting_category[0]
  def self.actual_cat=(i) ; @actual_cat = i ; end
  def self.actual_cat ; @actual_cat ; end
end
class Scene_CraftingAll
  alias :old_cancel :cancel
  def cancel
    @help_window.clear
    old_cancel
  end
  def update
    super
    @help_window.set_text(@list_window.current_item.result.item.description) if !@list_window.current_item.nil?
    @detail_window.set_recipe(@list_window.current_item)
    @confirm_window.set_recipe(@list_window.current_item)
    if Input.trigger?(:SHIFT) && (@list_window.active == true || @craft_perso.visible)
      return unless @list_window.current_item
      item = @list_window.current_item.result.item
      return if item.is_a?(RPG::Item)
      if @shift == true
          Sound.play_cancel
      elsif @craft_perso.item != item
          Sound.play_cursor
      end
      input_shift
    end
    if @shift == false
      if Input.trigger?(:RIGHT) && @detail_window.can_change
        Sound.play_cursor
        @list_window.deactivate
        @detail_window.activation = true
      elsif ((Input.trigger?(:LEFT) || (Input.repeat?(:B) && @detail_window.activation == true)) && @detail_window.can_change)
        Sound.play_cancel
        @list_window.activate
        @detail_window.activation = false
      elsif (Input.repeat?(:UP) && @detail_window.activation)
        Sound.play_cursor
        if @detail_window.activation == true
          @detail_window.move_up
        else
          @detail_window.need_refresh = true
          @detail_window.refresh
        end
      elsif (Input.repeat?(:DOWN) && @detail_window.activation)
        Sound.play_cursor
        if @detail_window.activation == true
          @detail_window.move_down
        else
          @detail_window.need_refresh = true
          @detail_window.refresh
        end
      end
    elsif @shift == true
      if @craft_perso.visible
        if Input.trigger?(:RIGHT)
          Sound.play_cursor
          @craft_perso.next_actor
        elsif Input.trigger?(:LEFT)
          Sound.play_cursor
          @craft_perso.prev_actor
        elsif Input.repeat?(:UP)
          Sound.play_cursor
          @craft_perso.ligne_actuel -= 1
        elsif Input.repeat?(:DOWN)
          Sound.play_cursor
          @craft_perso.ligne_actuel += 1
        elsif Input.trigger?(:B)
          Sound.play_cancel
          input_shift
        end
      end
    end
    @list_window.set_category(ADV_RECIPE::CATEGORIES[@command_window.index])
    @gauge_window.set_category(ADV_RECIPE::CATEGORIES[@command_window.index]) unless ADV_RECIPE::DISABLE_CRAFT_LEVEL
  end
 
  alias start_craft_vincent26 start
  def start
    start_craft_vincent26
    create_perso_modif
    @shift = false
  end
 
  def create_perso_modif
    @craft_perso = Window_Status_Perso_Craft.new(0,48)
    @craft_perso.hide
    @craft_perso.x = @detail_window.x
    @craft_perso.y = @detail_window.y
    @craft_perso.width  = @detail_window.width
    @craft_perso.height = @detail_window.height
    @craft_perso.z = 2000
  end
 
  def input_shift
    if !@shift
      return unless @list_window.current_item
      item = @list_window.current_item.result.item
      return if item.is_a?(RPG::Item)
      if @craft_perso.item != item
        @craft_perso.item = item
        a = false
        for perso in $game_party.members
          a = true if perso.equippable?(item)
        end
        @craft_perso.can_show = a
        return unless a
        @craft_perso.selected = -1
        @craft_perso.next_actor
      end
      if !@craft_perso.visible && @craft_perso.can_show
        @craft_perso.show
        @detail_window.hide
        @list_window.deactivate
      end
      @shift = !@shift
    else
      end_shift
      @shift = !@shift
    end
  end
 
  def end_shift
    if @craft_perso.visible == true
      @craft_perso.hide
      @detail_window.show
      @list_window.activate
    end
  end
 
end
class Window_RecipeDetail < Window_Base
 
  def hide
    super
    @zone.visible = false
  end
  def show
    super
    @zone.visible = true
  end
 
end
class Window_Status_Perso_Craft < Window_EquipStatus
 
  attr_accessor :selected
  attr_accessor :item
  attr_accessor :can_show
 
  def initialize(x, y)
    @actor_list = {}
    @item = nil
    @selected = 0
    @can_show = true
    @pos = 0
    create_list_actor
    super(x, y)
    @ligne_actuel = -1
    @max_ligne = 9
    refresh
  end
 
  #Modification de la ligne actuel
  def ligne_actuel=(value)
    @ligne_actuel = [-1,[value,@max_ligne - contents_height/line_height-1].min].max
    refresh
  end
 
  def refresh
    setup_actor
    create_contents
    contents.clear
    8.times {|i| draw_item(0, line_height * (i),  i) }
    draw_background_colour(0, 0)
    draw_text(0, 0,contents.width,line_height,@actor.name,1) if @actor
  end
 
  def draw_item(dx, dy, param_id)
    super(dx, dy-@ligne_actuel*line_height, param_id)
  end
 
  def setup_actor
    return if @actor == @actor_list[@selected]
    self.actor = @actor_list[@selected]
  end
 
  def setup_temp_actor
    slot = @item.etype_id if @item != nil
    temp_actor = Marshal.load(Marshal.dump(@actor))
    temp_actor.force_change_equip(slot, @item) if @item != nil
    set_temp_actor(temp_actor)
  end
 
  def create_list_actor
    @actor_list = {}
    for i in 0...$game_party.members.length
      @actor_list[i] = $game_party.members[i]
    end
  end
 
  def next_actor
    i = @selected
    while 1 == 1
      i = (i+1) % @actor_list.size
      break if @actor_list[i].equippable?(@item)
      break if i == @selected
    end
    @selected = i
    setup_actor
    setup_temp_actor
  end
 
  def prev_actor
    i = @selected
    while 1 == 1
      i = (i-1) % @actor_list.size
      break if @actor_list[i].equippable?(@item)
      break if i == @selected
    end
    @selected = i
    setup_actor
    setup_temp_actor
  end
 
end
class Scene_Crafting
  def start
    super
    if $crafting_category.length == 1 ; alternative_start ; end #passer cette ligne en commentaire pour afficher les onglets même pour une seule catégorie de craft affichée
    create_perso_modif
    @shift = false
  end
  def alternative_start
    @command_window.index = ADV_RECIPE::CATEGORIES.index($crafting_category[0])
    @command_window.deactivate
    @command_window.visible = false
    @list_window.height += 48
    @list_window.y -= 48
    @detail_window.height += 48
    @detail_window.y -= 48
    @list_window.create_contents
    @detail_window.create_contents
    @list_window.select(0)
    @list_window.activate
  end
  def cancel
    if $crafting_category.length == 1 ; SceneManager.return    #passer cette ligne en commentaire pour afficher les onglets même pour une seule catégorie de craft affichée
    else                                                        #passer cette ligne en commentaire pour afficher les onglets même pour une seule catégorie de craft affichée
      @list_window.select(-1)
      @command_window.activate
      @help_window.clear
    end                                                        #passer cette ligne en commentaire pour afficher les onglets même pour une seule catégorie de craft affichée
  end
  def update
    super
    if $crafting_category.size > 1
      @list_window.set_category($crafting_category[@command_window.index])
    else
      @list_window.set_category($crafting_category[0])
    end
  end
end
class Window_RecCategory
  def make_command_list
    if SceneManager.scene_is?(Scene_CraftingAll)
      ADV_RECIPE::CATEGORIES.each{|command| add_command(command.to_s,command)}
    else
      $crafting_category.each{|command| add_command(command.to_s,command)}
    end
  end
  def draw_item(index)
    change_color(normal_color, command_enabled?(index))
    rect = item_rect_for_text(index)
    draw_text(rect, command_name(index))
    if SceneManager.scene_is?(Scene_CraftingAll)
      draw_icon(ADV_RECIPE::CATEGORY_ICONS[index],rect.x-24,rect.y)
    else
      draw_icon(ADV_RECIPE::CATEGORY_ICONS[ADV_RECIPE::CATEGORIES.index($crafting_category[index])],rect.x-24,rect.y)
    end
  end
  alias :old_update :update
  def update
    old_update
    ADV_RECIPE.actual_cat = $crafting_category[index]
  end
end
class Game_Party
  def craft_level(id)
    if id.class == Symbol
      @crafting_level[ADV_RECIPE::CATEGORIES.index(id)]
    else
      @crafting_level[id]
    end
  end
end
class Window_RecipeConfirm
  def refresh
    super
    if @recipe && @recipe.craftable?
      change_color(normal_color, true)
      draw_text(0,0,self.contents.width,line_height,"Produire",1)
      draw_text(0,0,contents.width,line_height,"x"+@amount.to_s,2)
    else
      change_color(normal_color, false)
      draw_text(0,0,self.contents.width,line_height,"Produire",1)
    end
  end
end
class Window_RecGauge
  def cat_index
    if SceneManager.scene_is?(Scene_CraftingAll) or ADV_RECIPE.actual_cat == nil
      ADV_RECIPE::CATEGORIES.index(@category)
    else
      p(ADV_RECIPE.actual_cat)
      ADV_RECIPE::CATEGORIES.index(ADV_RECIPE.actual_cat)
    end
  end
end


Dernière édition par Nérylis le Lun 22 Fév 2016 - 21:05, édité 1 fois
tonyryu
tonyryu
Membre

Nombre de messages : 895
Age : 39
Localisation : Près de Nantes
Distinction : aucune
Date d'inscription : 27/05/2010
http://www.tonyryudev.com

Résolu Re: Petit problème sur un script

le Dim 21 Fév 2016 - 14:38
Je regarde ça ce soir
tonyryu
tonyryu
Membre

Nombre de messages : 895
Age : 39
Localisation : Près de Nantes
Distinction : aucune
Date d'inscription : 27/05/2010
http://www.tonyryudev.com

Résolu Re: Petit problème sur un script

le Dim 21 Fév 2016 - 22:59
En changeant cela :

Code:
      if @shift == true
          Sound.play_cancel
      else #if @craft_perso.item != item
          Sound.play_cursor
      end
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 30
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Résolu Re: Petit problème sur un script

le Lun 22 Fév 2016 - 18:11
Euh... effectivement, ça marche. Mais j'ai besoin de comprendre quelque chose. A la base, j'avais bien mis la condition "if @shift == true" et "else". En mettant la condition "if @craft_perso.item != item", j'ai ajouté aussi les lignes au-dessus :

return unless @list_window.current_item
item = @list_window.current_item.result.item
return if item.is_a?(RPG::Item)

Et du coup, en remettant l'ancienne condition mais en gardant ces 3 lignes, j'obtiens ce que je voulais. En fait, ça veut dire quoi ces 3 lignes ?
tonyryu
tonyryu
Membre

Nombre de messages : 895
Age : 39
Localisation : Près de Nantes
Distinction : aucune
Date d'inscription : 27/05/2010
http://www.tonyryudev.com

Résolu Re: Petit problème sur un script

le Lun 22 Fév 2016 - 20:43
en gros ça veut dire :

sortir de la méthode si @list_window.current_item n'existe pas
récupérer l'item résultant dans la variable item
sortir si l'item n'est pas une instance de la classe RPG::Item
Nérylis
Nérylis
Membre

Nombre de messages : 612
Age : 30
Localisation : Seine Maritime
Distinction : aucune
Date d'inscription : 23/11/2014

Résolu Re: Petit problème sur un script

le Lun 22 Fév 2016 - 21:05
D'accord, je comprend un peu mieux. Merci pour le coup de pouce. Smile
Contenu sponsorisé

Résolu Re: Petit problème sur un script

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum