segunda-feira, 15 de abril de 2013

Aprendendo RGSS do zero - Aula 09

Nesta aula finalmente aprenderemos algo prático, na verdade será um pouco de tudo
que vimos em todas as aulas, apesar de não ter uma utilidade em si, mas é um ótimo
exemplo de como funcionam as coisas na prática.

- Introdução

A Scene que criaremos consiste em uma janela com entrada para comandos, são as setas direcionais.

Primeiro criamos um módulo com os caracteres desejados.

module Commands
  Commands = {'u' => '↑', 'd' => '↓', 'l' => '←', 'r' => '→'}
end


Utilizamos uma hash para associar cada comando a um caractere.
Os comandos ou chaves são u,d,l,r respectivamente up, down, left e right.

- Criando a janela

class Window_Commands < Window_Selectable
  def initialize(x,y,w,h)
    super(x,y,w,h)
    @commands = []
    refresh
  end
  def refresh
    contents.clear
    draw_commands
  end
  def commands
    return @commands
  end
  def draw_commands
    x = 0
    for c in @commands
      draw_text(x, 0, contents.width, 30, Commands::Commands[c])
      x += 20
    end
  end
  def pop
    return if @commands.size == 0
    @commands.pop
    refresh
  end
  def push(c)
    return if @commands.size == 14
    @commands << c
    refresh
  end
end


Vamos dividir a explicação em cada método.

No primeiro método criamos uma variável lista que armazenará os comandos u,d,l,r e chamamos o método
que escreverá eles.

No segundo, apagaremos todo o conteúdo e em seguida escreveremos novamente.

No terceiro, criamos um método que retorna a própria lista dos comandos.

No quarto, escrevemos os caracteres um a um utilizando o for, perceba que para não sobrepor cada seta,
cria-se uma variável x que será incrementada a cada repetição, assim cada vez que tiver uma seta, terá um espaço de 20 pixels.
Usamos a hash para dizer qual caractere será impresso, por exemplo se for o u, ficaria assim:

Commands::Commands['u'] # => ↑

No quinto e sexto os métodos são respectivamente de remoção e adição de comandos, como visto na aula 6.
Veja a condição em cada método, o comando só será executado caso a condição seja realizada. Não será possível remover
um comando se a lista estiver vazia e não será possível adicionar se a lista tiver 14 elementos.

- Criando a scene

class Scene_Commands < Scene_Base
  def start
    super
    draw_windows
  end
  def draw_windows
    @command_window = Window_Commands.new(10,10,310,50)
  end
  def update
    super
    return_scene if Input.trigger?(:B) and @command_window.commands.size == 0
    @command_window.pop if Input.repeat?(:B)
    @command_window.push('u') if Input.repeat?(:UP)
    @command_window.push('d') if Input.repeat?(:DOWN)
    @command_window.push('l') if Input.repeat?(:LEFT)
    @command_window.push('r') if Input.repeat?(:RIGHT)
  end
  def terminate
    super
    @command_window.dispose
  end
end


Novamente a explicação por métodos.

No primeiro, criamos o método principal e chamamos o método de criação da janela.

No segundo, criamos a janela. Perceba que o método start só é chamado uma vez, que é quando chamamos a scene, bem como este
método, pois só é preciso criar a janela uma vez!

No terceiro, fazemos várias condições de checagem de teclas. Perceba na primeira linha que retornamos a scene anterior somente se

a lista estiver vazia, isso serve para não voltar a scene simplesmente ao pressionar ESC, pois pode conter comandos ainda na

lista. Caso tenha, usamos o método pop para remover o último elemento. Em seguida criamos as quatro condições para cada tecla e

adicionamos a lista o comando respectivo.

No quarto simplesmente destruimos a janela ao sair.

- Finalizando

Copie todos os códigos e cole num script novo e teste o jogo chamando o código:

SceneManager.call(Scene_Commands)

Pronto, agora é só teclar as setas direcionais e pressionar ESC para remover o último comando ou sair.

Um comentário:

  1. duvida, nesse ponto da Scene
    ==============================================================
    def update
    super
    return_scene if Input.trigger?(:B) and @command_window.commands.size == 0
    @command_window.pop if Input.repeat?(:B)
    @command_window.push('u') if Input.repeat?(:UP)
    @command_window.push('d') if Input.repeat?(:DOWN)
    @command_window.push('l') if Input.repeat?(:LEFT)
    @command_window.push('r') if Input.repeat?(:RIGHT)
    end
    ============================================================
    quando ele testar as condiçoes vai executar o metodo push da Window_Command

    ============================================================
    def push(c)
    return if @commands.size == 14
    @commands << c
    refresh
    end
    ============================================================
    o metodo push vai executar o metodo refresh tambem. Ai que surge minha duvida
    quando for executado o metodo draw_command a variavel x será zerada denovo, então como é que vai ocorrer o espaçamento de x =+ 20 que tem logo apos.?

    ============================================================
    outra duvida:

    se o @commands = [] é um array com conteudo vazio inicialmente como o comando:

    for c in @commands
    draw_text(x, 0, contents.width, 30, Commands::Commands[c])
    x += 20
    end

    irá identificar um objeto dentro dele se nao tem nenhum

    ResponderExcluir