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.
duvida, nesse ponto da Scene
ResponderExcluir==============================================================
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