[VXAce] Cursor da Window não movendo

2 Respostas   281 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Tópico criado em: 19/09/2015 às 20:14 - Última modificação por King Gerar em 20/09/2015 às 15:48

Então, tô aqui lutando pra terminar outro script, porém me deparei com um obstáculo.
O cursor da janela não se move, parece que a janela travou, mesmo eu colocando o
activate e indicando o index do cursor.
Testei em um projeto novo e escolhi um outro index, ainda assim o erro persiste.
Creio que não seja incompatibilidade.
Segue o script e pra chamá-lo é só colocar
drops(9, 1, 0, true) no chamar script.

Código: [Selecionar]
#==============================================================================
# Cataclisman - Choose Drop
# por King Gerar
#------------------------------------------------------------------------------
# Este script adiciona uma janela em que é possível se escolher os itens que
# deseja pegar, como por exemplo, itens/armas/armaduras que inimigos mortos
# caídos no chão possuem, ou simples baús.
#==============================================================================
# Módulo CTCM002
#------------------------------------------------------------------------------
# - Este módulo serve para você fazer as configurações deste script.
#==============================================================================
module CTCM002
  $stored_drops = Array.new(Dir.glob("#{Dir.pwd}/Data/Map*").size.pred)
  #-----------------------------------------------------------------------------
  # Texto que aparece acima da janela de itens dropados.
  #-----------------------------------------------------------------------------
  Txt_Drop = "Itens Encontrados"
  #-----------------------------------------------------------------------------
  # ID do ícone de dinheiro.
  #-----------------------------------------------------------------------------
  Coin_Icon = 361
 
  Drops = Array.new
 
  Drops[0] = [["item",  1,   1],
             ["armor",  1,   1],
             ["weapon", 1,   1],
             ["gold",   0, 150]]
             
  Drops[1] = [["item",  3,   1],
             ["armor",  2,   1],
             ["gold",   0, 200]]
#==============================================================================
#                           NÃO MODIFIQUE ABAIXO
#==============================================================================
end
#==============================================================================
#                                   SCENES
#==============================================================================
#  Scene_ChooseDrop
#------------------------------------------------------------------------------
#  Esta classe executa o processamento da tela de itens dropados.
#==============================================================================
class Scene_ChooseDrop < Scene_Base
  #--------------------------------------------------------------------------
  # Inicialização do processo
  #--------------------------------------------------------------------------
  def start
    super
    create_background
    create_drop_window
  end
  #--------------------------------------------------------------------------
  # Criação do plano de fundo
  #--------------------------------------------------------------------------
  def create_background
    @background_sprite = Sprite.new
    @background_sprite.bitmap = SceneManager.background_bitmap
    @background_sprite.color.set(16, 16, 16, 128)
  end
  #--------------------------------------------------------------------------
  # Criação da janela com a lista de itens dropados.
  #--------------------------------------------------------------------------
  def create_drop_window
    $drop_window = Window_Drop.new
    $drop_window.set_handler(:ok,     method(:on_item_ok))
    $drop_window.set_handler(:cancel,   method(:return_scene))
    $drop_window.select(0)
    $drop_window.activate
    @upper_window = Window_UpperWindow.new
  end
  #--------------------------------------------------------------------------
  # Escolha do Item.
  #--------------------------------------------------------------------------
  def on_item_ok
  end
end
#==============================================================================
#                                   WINDOWS
#==============================================================================
#  Window_Drops
#------------------------------------------------------------------------------
#  Esta janela exibe a janela de itens dropados.
#==============================================================================
class Window_Drop < Window_Selectable
  include CTCM002
  #--------------------------------------------------------------------------
  # Inicialização do objeto.
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 224, 24)
    @map_id = $current_drop[0]
    @event_id = $current_drop[1]
    @drop_id = $current_drop[2]
    @keep = $current_drop[3]
    adjust_position
    draw_drops
  end
  #--------------------------------------------------------------------------
  # Aquisição do número máximo de itens
  #--------------------------------------------------------------------------
  def item_max
    $stored_drops[$current_drop[0]][$current_drop[1]].size
  end
  #--------------------------------------------------------------------------
  # Posicionamento da janela no centro da tela.
  #--------------------------------------------------------------------------
  def adjust_position
    self.x = (Graphics.width - self.width) / 2
    self.height = (line_height * Drops[@drop_id].size) + (standard_padding * 2)
    upper_window_height = line_height + (standard_padding * 2)
    self.y = ((Graphics.height - (self.height + upper_window_height)) / 2) + upper_window_height
  end
  #--------------------------------------------------------------------------
  # Criação da lista de itens dropados.
  #--------------------------------------------------------------------------
  def draw_drops
    n = 0
    while n < item_max do
      case $stored_drops[@map_id][@event_id][n][0]
        when "item"
          icon = $data_items[$stored_drops[@map_id][@event_id][n][1]].icon_index
          name = $data_items[$stored_drops[@map_id][@event_id][n][1]].name
        when "weapon"
          icon = $data_weapons[$stored_drops[@map_id][@event_id][n][1]].icon_index
          name = $data_weapons[$stored_drops[@map_id][@event_id][n][1]].name
        when "armor"
          icon = $data_armors[$stored_drops[@map_id][@event_id][n][1]].icon_index
          name = $data_armors[$stored_drops[@map_id][@event_id][n][1]].name
        when "gold"
          icon = Coin_Icon
          name = Vocab::currency_unit
      end
      quant = $stored_drops[@map_id][@event_id][n][2]
      index = n
      draw_item(index, icon, name, quant)
      n += 1
    end
  end
  #--------------------------------------------------------------------------
  # Desenho de um item
  #--------------------------------------------------------------------------
  def draw_item(index, icon, name, quant)
    rect = item_rect(index)
    rect.width -= 4
    draw_icon(icon, 0, index * line_height)
    draw_text(28, index * line_height, 124, line_height, name, 0)
    draw_text(156, index * line_height, 10, line_height, "x", 1)
    draw_text(170, index * line_height, 24, line_height, quant, 2)
  end
end
#==============================================================================
#  Window_UpperDropWindow
#------------------------------------------------------------------------------
#  Esta janela exibe o nome da Scene no topo da tela.
#==============================================================================
class Window_UpperWindow < Window_Base
  include CTCM002
  #--------------------------------------------------------------------------
  # Inicialização do objeto.
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 224, line_height + (standard_padding * 2))
    adjust_position
  draw_text( 0, 0, contents_width, line_height, Txt_Drop, 1)
  end
  #--------------------------------------------------------------------------
  # Posicionamento da janela no centro da tela.
  #--------------------------------------------------------------------------
  def adjust_position
    self.x = (Graphics.width - self.width) / 2
    self.y = (Graphics.height - (self.height + $drop_window.height)) / 2
  end
end
#==============================================================================
#                                    GAME
#==============================================================================
# Game_Interpreter
#------------------------------------------------------------------------------
# Um interpretador para executar os comandos de evento. Esta classe é usada
# internamente pelas classes Game_Map, Game_Troop e Game_Event.
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # Apagar todos os drops.
  #--------------------------------------------------------------------------
  def drops(map_id, event_id, drop_id, keep)
    $current_drop = [map_id, event_id, drop_id, keep]
    #---------------------------------------------------------------------------
    # Se nenhum drop tiver sido criado para o mapa,
    # à array de drops.
    #---------------------------------------------------------------------------
    $stored_drops[map_id] = Array.new($game_temp.totally_event(map_id)) if $stored_drops[map_id] == nil
    #---------------------------------------------------------------------------
    # Se o id do evento for maior do que a quantidade de eventos no mapa (Isso
    # acontece quando se deleta eventos de ID menores), preenche a array até
    # ter o tamanho igual ao ID do evento.
    #---------------------------------------------------------------------------
    $stored_drops[map_id][event_id] = nil if $stored_drops[map_id].size < event_id
    #---------------------------------------------------------------------------
    # Se ainda não tiver sido definido drop para o evento, então será.
    #---------------------------------------------------------------------------
    $stored_drops[map_id][event_id] = CTCM002::Drops[drop_id] if $stored_drops[map_id][event_id] == nil
    SceneManager.call(Scene_ChooseDrop)
  end
end
#==============================================================================
# Game_Temp
#------------------------------------------------------------------------------
# Verifica o total de eventos num mapa. Chame: $game_temp.totally_event(id)
# Caso não especificar o id, dará o total de eventos do jogo inteiro.
#==============================================================================
class Game_Temp
  def totally_event(id=nil)
    totally = 0
    glob = Dir.glob("./Data/Map*").collect! { |i| i.split("/").last.match(/Map(\d+)/).to_s << ".rvdata2" rescue next }.select(&:to_s)
    glob.delete_at(glob.size.pred)
    if id.nil?
      glob.each { |i| totally += load_data(sprintf("./Data/#{i}")).events.size }
    else
      totally += load_data(sprintf("./Data/Map%03d.rvdata2", id)).events.size rescue 0
    end
    return totally
  end
end

Azraven

  • *
  • Posts: 200
  • Ouros: 104
  • ...
Resposta 1: 20/09/2015 às 07:51

É porque você definiu a drop_window como global ($), e o método update_all_windows da Scene_Base faz iteração apenas nas variáveis de instancia (@), logo ela não atualiza a $drop_window na sua scene.

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 2: 20/09/2015 às 15:48

Estranho, antes tinha feito de um modo diferente, mas a scene tava do mesmo modo,
usando essa variável global mesmo, e funcionou. Aí fui reescrever o script e bugou assim.
Anyway, mudei aqui pra @ e funcionou de boa, vou anotar aqui pra tentar lembrar.
Valeu, man!
  :ok: