name: inverse class: center, middle, bg-red, bg-dark layout: true --- # #game --- layout: false ![Default-aligned image](images/game.png) --- ## Biblioteca Gosu -- ### Jogos 2D -- ### Hello Game! -- * Crie uma pasta para o jogo (`mkdir`) -- * Crie um arquivo `game.rb` -- ``` require 'gosu' ``` -- ``` class Game < Gosu::Window def initialize super(600,600, false) end end ``` -- ``` game = Game.new game.show ``` --- ``` require 'gosu' ``` -- Disponibilizar componentes de outros arquivos -- Importa [Gosu::Window](http://www.libgosu.org/rdoc/Gosu/Window.html) ``` class Game < Gosu::Window ``` --- ``` def initialize ``` Construtor. Inicializa o objeto. -- ``` game = Game.new ``` Aloca espaço na memória e executa o método initialize. --- ``` super(600,600, false) ``` -- Chama o mesmo método na super classe (ou classe mãe). -- No caso o construtor. --- ``` game.show ``` Executa o método `show` herdado de Gosu::Window. -- Qualquer método de Gosu::Window pode ser utilizado. --- ### Alterar o título da janela ``` self.caption = 'Sky Cleanup' ``` -- ``` game.caption = 'Sky Cleanup' ``` -- [caption](http://www.libgosu.org/rdoc/Gosu/Window.html#caption-instance_method) é um método de instância de Gosu::Window. --- ### Adicionar o background -- Arquivos no [gist](https://gist.github.com/roberto/6576752). -- Utilizando a classe [Gosu::Image](http://www.libgosu.org/rdoc/Gosu/Image.html). -- ``` @background = Gosu::Image.new(self, "images/bg.png", true) ``` -- ``` self ``` -- Referência ao seu objeto, instância de Game. -- Cada imagem no Gosu deve estar relacionada com uma Janela (Window). -- ``` def initialize super(600,600, false) self.caption = 'Sky Cleanup' @background = Gosu::Image.new(self, "images/bg.png", true) end ``` --- ### Desenhando o Background -- Definimos o método draw. -- ``` def draw {{content}} end ``` -- @background.draw(0,0,0) -- ``` x, y, z ``` --- ![Default-aligned image](images/game-bg.png) --- ### Adicionar o avião * Criar arquivo 'plane.rb' -- ``` require_relative 'plane' ``` -- ``` class Plane def initialize(game) @game = game @x = 100 @y = 100 @sprite = Gosu::Image.load_tiles(game,"images/planes.png",66,67,true)[0..2] end def draw @sprite[Gosu::milliseconds / 100 % @sprite.size].draw_rot(@x, @y, 1, 0) end end ``` [gist](https://gist.github.com/roberto/6590242) --- Alterando a classe Game: ``` def initialize super(600,600, false) # ... @plane = Plane.new(self) end def draw @plane.draw @background.draw(0,0,0) end ``` --- ### Tarefas * Alterar a cor do avião (mudando o sprite usado) -- * Executar o programa -- * Calcular uma melhor posição inicial do avião * Utilizar game.width (largura) e game.height (altura) --- ### Movimentar o avião -- Método update, executado a cada atualização. ``` def update {{content}} end ``` -- @plane.left if button_down? Gosu::KbLeft @plane.right if button_down? Gosu::KbRight --- ### Tarefa * Implementar métodos left(esquerda) e right (direita). -- * Implementar limites da tela. --- ### Adicionando asteróides [(gist)](https://gist.github.com/roberto/6590397) -- ``` class Asteroid def initialize(game) @sprite=Gosu::Image.load_tiles(game,"images/asteroids.png",320/5,384/6,true) @x, @y = 100, 100 end def update end def draw @sprite[Gosu::milliseconds / 50 % @sprite.size].draw_rot(@x, @y, 3, 0) end end ``` -- Alterando a classe Game: ``` def initialize @asteroid = Asteroid.new(self) end def update @asteroid.update end def draw @asteroid.draw end ``` --- ### Tarefas * Iniciar do topo -- * Queda. (atualizar posição durante update) -- * Iniciar numa posição randômica, utilizando [Gosu.random(?, ?)](http://www.libgosu.org/rdoc/Gosu.html#random-class_method) -- * Ao sair da tela, deve voltar para o topo em outra posição. -- * Colisão! * Exemplo: [Gosu::distance(a.x, a.y, b.x, b.y)](http://www.libgosu.org/rdoc/Gosu.html#distance-class_method) < distance * Verificar durante udpate -- * Adicionar um asteróide a cada 10 segundos * [Gosu::milliseconds](http://www.libgosu.org/rdoc/Gosu.html#milliseconds-class_method) --- ## Gostou? [@bt1](http://twitter.com/bt1) [Recomende-me no WWR!](http://www.workingwithrails.com/person/9376-roberto-soares) [http://blog.robertosoares.me/](http://blog.robertosoares.me/)