O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Chamar Janela de Number Input

Iniciado por Wotan, 03/06/2020 às 18:16

Opa!
Queria saber qual o código para chamar essa função (de inserir um número, marcada no print abaixo), por script.

Preciso chamar uma janela que recebe um número e armazena em uma variável, porém não consigo fazer por script.

fazer um Evento Comum com essa função de inserir número e chamar este evento no script, mas prefiro perguntar aqui, acho que alguém possa me ajudar.

Desde já agradeço :heart:, a função que me refiro e preciso chamar por script é esta marcada no print abaixo.




03/06/2020 às 18:32 #1 Última edição: 03/06/2020 às 18:34 por Brandt
Pra comandos de eventos, você sempre pode olhar no Game_Interpreter pra ver como é feito por baixo:

  #--------------------------------------------------------------------------
  # * Input Number
  #--------------------------------------------------------------------------
  def command_103
    wait_for_message
    setup_num_input(@params)
    Fiber.yield while $game_message.num_input?
  end
  #--------------------------------------------------------------------------
  # * Number Input Setup
  #--------------------------------------------------------------------------
  def setup_num_input(params)
    $game_message.num_input_variable_id = params[0]
    $game_message.num_input_digits_max = params[1]
  end


É meio zoado nesse caso porque você vai acabar ficando preso a usar Fiber e salvar o valor numa variável (das $game_variables, não do Ruby).
Se você quiser uma solução melhor, sugiro tentar modificar a Window_NumberInput mesmo (possivelmente duplicar a classe e ajustar pro que você precisa).
~ Masked

Não estou conseguindo utilizar o Window_NumberInput, precisaria de algum material de estudo sobre isso, eu não consegui entender como usar só lendo o código  :rick9:

Tudo o que preciso é chamar uma entrada de um número com até 5 dígitos e armazenar em uma variável(das $game_variables mesmo)

Use dessa forma:
#Legenda:
#x = Variável
#y = Quantidade de dígitos

Fiber.yield while $game_message.busy?
setup_num_input([x, y]) 
Fiber.yield while $game_message.num_input?
Oxe

Vou postar um tópico pedindo esse script, eu não estou conseguindo fazer, e não acho um tutorial que expliquei o funcionamento de Window_NumberInput, e como usá-lo.
Obrigado por tentar ajudar, já pode fechar este tópico.

Seria mais fácil se você explicasse que problema está tendo para aplicar o código.


16/06/2020 às 11:03 #6 Última edição: 16/06/2020 às 11:13 por Wotan
Citação de: Gabriel online 09/06/2020 às 18:21
Seria mais fácil se você explicasse que problema está tendo para aplicar o código.

O problema é que eu não estou entendendo como funciona esse Window_NumberInput pra mim conseguir criar uma scene com ele.

Logo no início fala "message_window : janela de mensagem", que tipo de mensagem é essa?
E pq este "super" precisa de 4 argumentos? Que argumentos são esses? Seria por para "@number = 0    @digits_max = 1    @index = 0    self.openness = 0" ? Se sim, qual a sequência e como ele recebe 4 argumentos e distribui assim para variáveis internas?
Spoiler
#==============================================================================
# ** Window_NumberInput
#------------------------------------------------------------------------------
#  Esta janela é utilizada para o comando de eventos [Armazenar Número]
#==============================================================================

class Window_NumberInput < Window_Base
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #     message_window : janela de mensagem
  #--------------------------------------------------------------------------
  def initialize(message_window)
    @message_window = message_window
    super(0, 0, 0, 0)
    @number = 0
    @digits_max = 1
    @index = 0
    self.openness = 0
    deactivate
  end
[close]

Resumidamente, quando o jogador clicar no "Quartel" vai abrir uma janela que mostra total de tropas, consumo custos etc e uma seleção de 2 opções "Treinar" e "Voltar". Isso tudo já tenho e funcionando.

Mas quero que, ao clicar em "Treinar" ele chama um Input Number pro jogador inserir o total de tropas q vai querer treinar. e não consigo fazer esta parte kk.

Citação de: Wotan online 16/06/2020 às 11:03
O problema é que eu não estou entendendo como funciona esse Window_NumberInput pra mim conseguir criar uma scene com ele.

Logo no início fala "message_window : janela de mensagem", que tipo de mensagem é essa?
E pq este "super" precisa de 4 argumentos? Que argumentos são esses? Seria por para "@number = 0    @digits_max = 1    @index = 0    self.openness = 0" ? Se sim, qual a sequência e como ele recebe 4 argumentos e distribui assim para variáveis internas?
Spoiler
#==============================================================================
# ** Window_NumberInput
#------------------------------------------------------------------------------
#  Esta janela é utilizada para o comando de eventos [Armazenar Número]
#==============================================================================

class Window_NumberInput < Window_Base
  #--------------------------------------------------------------------------
  # * Inicialização do objeto
  #     message_window : janela de mensagem
  #--------------------------------------------------------------------------
  def initialize(message_window)
    @message_window = message_window
    super(0, 0, 0, 0)
    @number = 0
    @digits_max = 1
    @index = 0
    self.openness = 0
    deactivate
  end
[close]

Opa, então, recomendo dar uma olhada numas aulas de orientação a objetos (em Ruby, se possível) pra esclarecer o que é o construtor e o que é o "super".
Nesse caso aí, o super vai ser o método initialize da Window_Base, que recebe quatro argumentos numéricos se você for ver: x, y, width (largura) e height (altura). Veja que não existe mágica na programação, então a menos que ele coloque valores nas variáveis (@number, @digits_max, etc.) elas não vão receber mesmo. Veja que no initialize elas só recebem valores constantes (0 e 1), então ele não distribui valor nenhum nas variáveis. Se isso acontece, é em outro método, provavelmente relacionado a esse trecho que eu mandei lá em cima:

  def setup_num_input(params)
    $game_message.num_input_variable_id = params[0]
    $game_message.num_input_digits_max = params[1]
  end


A message_window é a janela de mensagem do jogo mesmo (sabe a que aparece quando você "fala" com um evento?). A Window_NumberInput usa ela porque, a princípio, são coisas que acontecem juntas quando você chama o processo por eventos (aparecer a mensagem e digitar um número, no caso). O que você pode fazer nesse caso é usar uma Window_Message também pra mostrar algo tipo "Quantas tropas quer treinar?" e passar ela pro construtor de uma Window_NumberInput.

A parte chata vai ser ter que lidar com Fiber pra esperar o jogador escolher o número e confirmar. Posso tentar um exemplo aqui quando sobrar um tempinho, mas acho que uma alternativa melhor até é tentar reproduzir a lógica dessa janela em uma outra classe específica pro que você quer, talvez seja mais fácil.
~ Masked