Dúvidas com Janelas / Cenas (Windows e Scenes) no RMXP.

10 Respostas   109 Visualizações

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

Rayner

Tópico criado em: 28/09/2018 às 18:07 - Última modificação por Corvo em 29/09/2018 às 12:48

Boa tarde, fiz uma Window que está funcionando perfeitamente (não perfeitamente, mas não gera erros e faz QUASE tudo o que quero, o que é muito bom :) e minha dúvida é a seguinte:
Como fazer para paralisar todos os eventos quando a Window for chamada semelhante quando o menu é chamado?

____

Conhecem alguma aula / tutorial sobre criação de janelas selecionáveis? Estou lutando para aprender sozinho mas é bem difícil  :U_U: :math:
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------


Corvo

Resposta 1: 28/09/2018 às 18:15 - Última modificação por Corvo em 28/09/2018 às 18:16

As janelas são criadas em cenas específicas, é nessas cenas que você pausa o jogo. Não tenho certeza, mas deve ser o:

Código: [Selecionar]
Graphics.freeze
Infelizmente não conheço nenhum tutorial focado no XP, mas as aulas do Sotelie quebram o galho. Você só vai precisar identificar a sintaxe que difere bastante.

Rayner

Resposta 2: 28/09/2018 às 18:34

As janelas são criadas em cenas específicas, é nessas cenas que você pausa o jogo. Não tenho certeza, mas deve ser o:

Código: [Selecionar]
Graphics.freeze
Infelizmente não conheço nenhum tutorial focado no XP, mas as aulas do Sotelie quebram o galho. Você só vai precisar identificar a sintaxe que difere bastante.

Opa, valeu Corvo. Infelizmente não é este código, eu utilizei ele mas congela a Tela inteira do jogo e não apenas os eventos (ou se é, não sei pq não da certo) e só descongela após chamar o menu.

Eu acompanhava as aulas do Sotelie mas havia parado. Vou dar uma revisada em algumas aulas  :blink: espero que ele termine ;-;

Bom, ainda não consigo pausar e fazer apenas a Window funcionar. Estou procurando algum comando nas Scenes mas quem souber me dê um help ;)
Valeu novamente Corvo.
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------


Corvo

Resposta 3: 28/09/2018 às 18:42

Testou o laço padrão do menu?

Código: [Selecionar]
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end

Lembrando que essa pausa é criada na cena que mostra a janela, não na janela propriamente dita. Qualquer coisa poste o seu código que tentaremos buscar o problema.

Rayner

Resposta 4: 28/09/2018 às 19:02 - Última modificação por Corvo em 28/09/2018 às 19:08

Testou o laço padrão do menu?

Código: [Selecionar]
    # Main loop
    loop do
      # Update game screen
      Graphics.update
      # Update input information
      Input.update
      # Frame update
      update
      # Abort loop if screen is changed
      if $scene != self
        break
      end
    end

Lembrando que essa pausa é criada na cena que mostra a janela, não na janela propriamente dita. Qualquer coisa poste o seu código que tentaremos buscar o problema.

Acho que não estou vendo alguma coisa... Eu criei apenas 1 classe pra chamar a window. Está fucnionando "bem". No caso eu teria que criar outra classe pra fazer a pausa?
Eu usei este loop sim, mas acho que coloquei no lugar errado ou apenas não funciona mesmo. Cria um loop eterno. :=p:

Veja o script:
Código: [Selecionar]
class Janela < Window_Base
  def initialize
    super(0, 0, 100, 100) 
    self.contents = Bitmap.new(width - 32, height - 32)
   
  end
 
  def refresh
    self.contents.clear
    desenhar_texto(0, 0)
  end
 
  def update
    if Input.trigger?(Input::X)
      refresh
    end
  end
 
  def desenhar_texto(x, y)
    self.contents.draw_text(x, y-16, self.width, self.height,
                            "Funcionando")
  end
 
end

Para o update eu criei uma condição na Scene_Map que só ativa o método caso seja verdadeira para não retornar erro.
Ficou assim:
Código: [Selecionar]
if $janela_ativa == true
  $janela.update
end
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------


Corvo

Resposta 5: 28/09/2018 às 19:13

Não necessariamente. Você tem a janela que é uma classe. Você precisa de uma cena onde essa janela será mostrada, a segunda classe. Por exemplo, o Menu de itens. Você tem uma Cena: Scene_Item. Dentro dela são instanciadas as classes das janelas: Window_Help, Window_Item e Window_Target.

No seu caso, aparentemente você se esqueceu de incluir uma chamada ao método update dentro do initialize. O initialize é o que será executado continuamente, então a verificação da atualização só será feita se você chamar o método responsável lá dentro.

Rayner

Resposta 6: 28/09/2018 às 19:27

Não necessariamente. Você tem a janela que é uma classe. Você precisa de uma cena onde essa janela será mostrada, a segunda classe. Por exemplo, o Menu de itens. Você tem uma Cena: Scene_Item. Dentro dela são instanciadas as classes das janelas: Window_Help, Window_Item e Window_Target.

No seu caso, aparentemente você se esqueceu de incluir uma chamada ao método update dentro do initialize. O initialize é o que será executado continuamente, então a verificação da atualização só será feita se você chamar o método responsável lá dentro.

O Initialize da class Janela teria que ser assim?
Código: [Selecionar]
def initialize
    super(0, 0, 100, 100) 
    self.contents = Bitmap.new(width - 32, height - 32)
    update
  end

É isso mesmo?
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------


Corvo

Resposta 7: 28/09/2018 às 19:31

De ambos. A janela precisa do update dela e a cena também. Aí é só ir testando até acertar, se está mostrando no mapa veja que a Scene_Map já tem um laço chamando constantemente a atualização.

Rayner

Resposta 8: 28/09/2018 às 22:02

De ambos. A janela precisa do update dela e a cena também. Aí é só ir testando até acertar, se está mostrando no mapa veja que a Scene_Map já tem um laço chamando constantemente a atualização.

Opa, adicionei alguns códigos na Scene_Map e 1 na Game_Temp para poder criar a "pausa" e também criei outra classe para poder rodar o loop só que para o tamanho da janela o fundo acabou ficando feio por ser bem escuro. Sabe como mexer na imagem de fundo para poder deixar o mapa visível? Não gostei desse preto como fundo :/
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------


Corvo

Resposta 9: 29/09/2018 às 02:12

Mas funcionou? Se sim, um problema a menos.
A imagem de fundo vai ficar preta mesmo, é uma nova cena e, como o fundo não foi criado, aparece vazio. Pra fazer o mapa aparecer só inserindo mais código. Recomendo dar uma estudada neste script que faz exatamente isso. O método responsável é o create_menu_background.

Rayner

Resposta 10: 29/09/2018 às 12:46

Mas funcionou? Se sim, um problema a menos.
A imagem de fundo vai ficar preta mesmo, é uma nova cena e, como o fundo não foi criado, aparece vazio. Pra fazer o mapa aparecer só inserindo mais código. Recomendo dar uma estudada neste script que faz exatamente isso. O método responsável é o create_menu_background.

Funcionou sim. Valeu pela dica, vou estudar sim. O que estou buscando seria uma Janela semelhante a de mostrar mensagem ou mostrar escolhas. Foi até bom estudar esses scripts, vi que alguns tem um padrão (o que facilitou muito o aprendizado) e acabei aprendendo a criar Janelas de comando também.

Valeu mesmo pela ajuda! Só de conseguir criar a Janela já foi um baita de um avanço.

~Resolvido
O livro traz a vantagem de a gente poder estar só e ao mesmo tempo acompanhado.

------------