Programação de Computadores



Documentos relacionados
Programando Jogos com Delphi (LÓGICA, ANIMAÇÃO, CONTROLE) Autor: Antônio Sérgio de Sousa Vieira

Universidade Federal de Santa Maria UFSM Centro de Tecnologia CT. Power Point. Básico

ALBUM DE FOTOGRAFIAS NO POWER POINT

PARA CASA * Como voce faria para armazenar o resultado em uma variavel chamada NOME?

ETEC DR. EMÍLIO HENRNANDEZ AGUILAR PROGRAMAÇÃO DE COMPUTADORES I PROFESSOR RAFAEL BARRETO

REGRAS GERAIS REDE 2 horas e 30 minutos. Os desafios deverão ser entregues conforme instrução: Exemplo: desafio1_equipepentagrama

A figura abaixo, à direita, mostra uma apresentação gerada no MS PowerPoint. Uma apresentação desse tipo é útil para:

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Aula 5 Microsoft PowerPoint 2003: Criando uma Apresentação

Tutorial MSN Messenger

PowerPoint. Prof. Claudio A. B. Tiellet. Parte II

MATERIAL DE APRESENTAÇÃO DO SCRATCH

TUTORIAL COMO CRIAR E EDITAR UM VÍDEO NO WINDOWS MOVIE MAKER*

CURSO DE INFORMÁTICA BÁSICA AULA 2 O AMBIENTE WINDOWS

Manual do Spectacle. Boudhayan Gupta Boudhayan Gupta Tradução: André Marcelo Alvarenga

C D. C) Coleções: é usada para organizar o conteúdo de áudio, vídeo e imagens em pastas, buscando facilitar a montagem do storyboard.

Orientações para o uso do Mozilla Thunderbird

Jogo do NEEC. Primeiramente, criamos uma nova Actividade. File > New > Class

Clique no botão novo

FAZENDO PELES PARA O. PUXA RÁPIDO v0.8

A4 Projeto Integrador e Lista de Jogos

Manual do KSnapshot 2

CRIANDO TEMPLATES E LEGENDAS

GUIA MUDANÇA E FORMATAÇÃO DE SERVIDOR - SLIM

GUIA MUDANÇA E FORMATAÇÃO DE SERVIDOR - MILLENNIUM

Tutorial de Blender, Animação básica do tipo keyframe

Anexo III Funcionamento detalhado do Sistema Montador de Autoria

Manual INSTALANDO E EXECUTANDO... 1 CONFIGURANDO CLIENTE... 2 CONFIGURAR ACÕES DE GRUPOS... 2 CONTRIBUINDO E LIBERANDO FUNÇÕES... 3.

COMO REDUZIR O CUSTO NA COMUNICAÇÃO USANDO A INTERNET

Display de 7. PdP. Autor: Tiago Lone Nível: Básico Criação: 16/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Ferramentas tecnológicas em sala de aula: Prezi

SUMÁRIO 1. ACESSO À PÁGINA DO AMBIENTE VIRTUAL 2. CONTATANDO O SUPORTE 3. ATUALIZAR PERFIL 4. COMO ACESSAR AS DISCIPLINAS

Fluxo de trabalho do Capture Pro Software: Indexação de OCR e separação de documentos de código de correção

Resumo da Matéria de Linguagem de Programação. Linguagem C

Cópia. Copiadora e Impressora WorkCentre C2424

Manual do Usuário Android Neocontrol

Aula 04 Word. Prof. Bruno Gomes

Para participar de um mapa colaborativo usando o Cmap Tools

GraphicsLib Biblioteca Gráfica 2D. Documentação

Instruções para download e instalação da atualização de Mapa GPS (v3)

Manual de Operação. Copyright Todos os direitos reservados.

Microsoft Power Point 2007

ÍNDICE. 16/06/ :48 Leite Júnior

Como Configurar Caixas de Entradas Separadas.

Barra de ferramentas padrão. Barra de formatação. Barra de desenho Painel de Tarefas

AULA 14 Plugin TerraEdit

Aula Au 3 la 7 Windows-Internet

Tutorial Administrativo (Backoffice)

1 Instalando o VirtualBox no Windows

POWER POINT 2003 CARREGANDO O POWER POINT

Bem-vindo ao CorelDRAW, um programa abrangente de desenho e design gráfico baseado em vetor para o profissional gráfico.

MANUAL BÁSICO DE INSTRUÇÕES PARA USO DA LOUSA DIGITAL DO LMF

Aula 03 PowerPoint 2007

Esse tutorial visa apresentar as principais funcionalidades do Editor de Roteiro de Aprendizagem do Portal Clickideia.

SIMULADO Windows 7 Parte V

A tela inicial do Windows Media Encoder nos fornece uma janela com opções distintas. Neste caso, iremos prosseguir em um tutorial básico de streaming

1º PASSO: CRIE NO SEU COMPUTADOR UMA PASTA PARA O SEU PROJETO 2º PASSO: CONHEÇA O MOVIE MAKER

Produção de tutoriais. Suellem Oliveira

Esse manual é um conjunto de perguntas e respostas para usuários(as) do Joomla! 1.5.

CADERNO DE QUESTÕES WINDOWS 8

APOSTILA DE EXEMPLO. (Esta é só uma reprodução parcial do conteúdo)

TELA PRINCIPAL. Exibe uma lista de configurações de efeitos disponíveis. A visualização pode ser filtrada por: Aplicação, Cliente e Categoria.

Microsoft PowerPoint

Guia Prático de Acesso

TUTORIAL PARA ATUALIZAÇÃO DO PORTAL DO TJRN

Bem-vindo ao CorelDRAW, um programa abrangente de desenho e design gráfico baseado em vetor para o profissional gráfico.

Universidade Estadual de Campinas Faculdade de Educação Laboratório de Novas Tecnologias Aplicadas à Educação

Manual Simulador de Loja

QGIS 2.4 Estatísticas de Grupo Somatório de Áreas

Microsoft Office PowerPoint 2007

Utilizando o correio eletrônico da UFJF com Thunderbird e IMAP

COMO UTILIZAR O EXPRESSO LIVRE

GEOVISION VER AS IMAGENS ATRAVÉS DO INTERNET EXPLORER.

Introdução ao Aplicativo de Programação LEGO MINDSTORMS Education EV3

COMO JOGAR BURACO STBL NO JOGATINA

Autor: Eduardo Popovici Tutorial: Criando uma folha de Fichário / Caderno Software: Photoshop CS3 Ext. Ferramentas Utilizadas:

PASSO A PASSO MOVIE MAKER

Usar o Office 365 em seu telefone Android

GUIA DE CONFIGURAÇÃO BALANÇA TOPMAX S & URANO INTEGRA

Word 1 - Introdução Principais recursos do word A janela de documento Tela principal

PROJETO INFORMÁTICA NA ESCOLA

Manual de Utilização COPAMAIL Criando e configurando a assinatura de . Zimbra Versão 8.0.2

TUTORIAL SISTEMA OPERACIONAL WINDOWS XP

Office 365 Manual Outlook 365 Web Application

Simulador do Processador Neander T&D-Bench Simulator Manual do Usuário. por Júlio César Maccali. revisado por Prof. Christian Zambenedetti

Aula 14: Sons e imagens

Página 1. MANUAL DE INSTALAÇÃO CAIXA WINDOWS NFCe

SUMÁRIO TUTORIAL DO HQ. 2 DICAS PEDAGÓGICAS:. 2 DOWNLOAD DA INSTALAÇÃO. 2 PASSO 1 FORMULÁRIO PARA DOWNLOAD. 2 PASSO 2 ESCOLHENDO A VERSÃO.

IIIIIIII HAND INVENTORY

Introdução a Programação de Jogos

Manual do Publicador. Wordpress FATEA Sistema de Gerenciamento de Conteúdo Web

Sumário. 1 Tutorial: Blogs no Clickideia

Criação de formulários no Sphinx

2ª LISTA DE EXERCÍCIOS CLASSES E JAVA Disciplina: PC-II. public double getgeracaoatual() {return geracaoatual;}

Apostila para uso do Power Point

Para criar uma animação precisamos de uma imagem e que ela contenha alguns frames. O número de frames é uma escolha sua.

Tutorial: Abrindo Vídeos e Medindo Comprimentos no ImageJ

Outlook Apresentação

Desvendando Jogos 2D. Por Marcos Romero Setembro / Cyborg Arena - RHGames

Transcrição:

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE Programação de Computadores Um pouco de diversão - libgosu O exemplo desenvolvido nesta apresentação é o mesmo do tutorial GOSU, que pode ser acessado em: https://github.com/jlnr/gosu/wiki/ruby-tutorial Copyright 2013 IFRN

O que veremos hoje? Introdução Biblioteca GOSU A classe principal do jogo Construtor, draw e update Imagens Movimentação Construção de jogo Exemplo passo a passo 2 /49

Introdução libgosu Desenvolvimento de jogos 2D C++/Ruby Onde encontrar? http://www.libgosu.org Instalação sudo gem install gosu 3 /49

Introdução libgosu Desenvolvimento de jogos 2D C++/Ruby Onde encontrar? http://www.libgosu.org Instalação sudo gem install gosu 3 /49

Introdução Complementos Adicionam funcionalidades avançadas Exemplos: texplay (desenho) chingu (lógica de jogos) chipmunk (física e.g. gravidade) 4 /49

Gosu require 'gosu' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" def update 5 /49

Gosu Usar biblioteca Gosu require 'gosu' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" def update 5 /49

Gosu Usar biblioteca Gosu Classe que representa o jogo require 'gosu' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" def update 5 /49

Gosu Usar biblioteca Gosu Classe que representa o jogo Construtor require 'gosu' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" def update 5 /49

Gosu Usar biblioteca Gosu Classe que representa o jogo Construtor Desenha a janela require 'gosu' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" def update 5 /49

Gosu Usar biblioteca Gosu Classe que representa o jogo Construtor Desenha a janela Lógica do jogo require 'gosu' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" def update 5 /49

Gosu require 'gosu' class CataEstrela < Gosu::Window 480 def initialize super(640,480,false) self.caption= "Cata Estrelas" 640 def update 6 /49

Draw Método que desenha a janela Chamado quando for necessário desenhar TUDO deve ser redesenhado Imagens em arquivos def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @imagem_fundo.draw(0,0,0) 7 /49

Draw Método que desenha a janela Chamado quando for necessário desenhar TUDO deve ser redesenhado Imagens em arquivos def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @imagem_fundo.draw(0,0,0) 7 /49

Draw Um jogador Imagem em arquivo def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Gosu::Image.new(self,"Nave.bmp",true) @imagem_fundo.draw(0,0,0) @jogador.draw(320,230,1) draw (x,y,z): - x é o valor, em pixel, no eixo x - y é o valor, em pixel, no eixo y - z é a profundidade 8 /49

(0,0) Draw x Um jogador (320,230) Imagem em arquivo def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Gosu::Image.new(self,"Nave.bmp",true) @imagem_fundo.draw(0,0,0) @jogador.draw(320,230,1) y draw (x,y,z): - x é o valor, em pixel, no eixo x - y é o valor, em pixel, no eixo y - z é a profundidade 8 /49

Coordenadas (0,0) x y 9 /49

Coordenadas (0,0) 640 x z 480 y 9 /49

eixo z 10/49

eixo z 0 10/49

eixo z 0 10/49

eixo z 0 1 10/49

eixo z 0 1 2 10/49

eixo z 0 1 2 3 10/49

Update Dinâmica do jogo Chamado 60 vezes por segundo Configurável o método draw é sempre chamado após o update 11/49

Animação Movo o jogador com o update @pos_x: posição no eixo x class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrela" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Gosu::Image.new(self,"Nave.bmp",true) @pos_x = 320 @imagem_fundo.draw(0,0,0) @jogador.draw(@pos_x,230,1) def update if ( button_down?(gosu::button::kbright) ) then @pos_x = @pos_x + 10 if (@pos_x > 630) then @pos_x = 630 if ( button_down?(gosu::button::kbleft) ) then @pos_x = @pos_x - 10 if (@pos_x < 10) then @pos_x = 10 12/49

Animação Movo o jogador com o update @pos_x: posição no eixo x class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrela" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Gosu::Image.new(self,"Nave.bmp",true) @pos_x = 320 @imagem_fundo.draw(0,0,0) @jogador.draw(@pos_x,230,1) def update if ( button_down?(gosu::button::kbright) ) then @pos_x = @pos_x + 10 if (@pos_x > 630) then @pos_x = 630 if ( button_down?(gosu::button::kbleft) ) then @pos_x = @pos_x - 10 if (@pos_x < 10) then @pos_x = 10 desenha na posição @pos_x 12/49

Animação Movo o jogador com o update @pos_x: posição no eixo x Verifica se seta para direita está pressionada class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrela" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Gosu::Image.new(self,"Nave.bmp",true) @pos_x = 320 @imagem_fundo.draw(0,0,0) @jogador.draw(@pos_x,230,1) def update if ( button_down?(gosu::button::kbright) ) then @pos_x = @pos_x + 10 if (@pos_x > 630) then @pos_x = 630 if ( button_down?(gosu::button::kbleft) ) then @pos_x = @pos_x - 10 if (@pos_x < 10) then @pos_x = 10 desenha na posição @pos_x 12/49

Animação Movo o jogador com o update @pos_x: posição no eixo x Verifica se seta para direita está pressionada Verifica se seta para esquerda está pressionada class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrela" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Gosu::Image.new(self,"Nave.bmp",true) @pos_x = 320 @imagem_fundo.draw(0,0,0) @jogador.draw(@pos_x,230,1) def update if ( button_down?(gosu::button::kbright) ) then @pos_x = @pos_x + 10 if (@pos_x > 630) then @pos_x = 630 if ( button_down?(gosu::button::kbleft) ) then @pos_x = @pos_x - 10 if (@pos_x < 10) then @pos_x = 10 desenha na posição @pos_x 12/49

DEMO v0 13/49

Posição na tela Tamanho da janela self.height self.width Tamanho da imagem imagem.height @jogador.height imagem.width @jogador.width class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Gosu::Image.new(self,"Nave.bmp",true) @pos_x = 10 @pos_y = self.height / 2 @imagem_fundo.draw(0,0,0) @jogador.draw(@pos_x,@pos_y,1) def update if ( button_down?(gosu::button::kbright) ) then @pos_x = @pos_x + 10 if (@pos_x > self.width-(@jogador.width+10) ) then @pos_x = self.width-(@jogador.width+10) if ( button_down?(gosu::button::kbleft) ) then @pos_x = @pos_x - 10 if (@pos_x < 10) then @pos_x = 10 14/49

Posição na tela Tamanho da janela self.height self.width Tamanho da imagem imagem.height @jogador.height imagem.width @jogador.width class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Gosu::Image.new(self,"Nave.bmp",true) @pos_x = 10 @pos_y = self.height / 2 @imagem_fundo.draw(0,0,0) @jogador.draw(@pos_x,@pos_y,1) def update if ( button_down?(gosu::button::kbright) ) then @pos_x = @pos_x + 10 if (@pos_x > self.width-(@jogador.width+10) ) then @pos_x = self.width-(@jogador.width+10) if ( button_down?(gosu::button::kbleft) ) then @pos_x = @pos_x - 10 if (@pos_x < 10) then @pos_x = 10 14/49

Movimento completo class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Gosu::Image.new(self,"Nave.bmp",true) @pos_x = self.width / 2 @pos_y = self.height / 2 @imagem_fundo.draw(0,0,0) @jogador.draw(@pos_x,@pos_y,1) 15/49

Movimento completo def update if ( button_down?(gosu::button::kbright) ) then @pos_x = @pos_x + 10 if (@pos_x > self.width-(@jogador.width+10) ) then @pos_x = self.width-(@jogador.width+10) if ( button_down?(gosu::button::kbleft) ) then @pos_x = @pos_x - 10 if (@pos_x < 10) then @pos_x = 10 if ( button_down?(gosu::button::kbdown) ) then @pos_y = @pos_y + 10 if (@pos_y > self.height-(@jogador.height+10) ) then @pos_y = self.height-(@jogador.height+10) if ( button_down?(gosu::button::kbup) ) then @pos_y = @pos_y - 10 if (@pos_y < 10) then @pos_y = 10 16/49

DEMO v1 17/49

Organizando Colocar o jogo e o jogador em classes separadas jogador.rb require 'gosu' class Jogador def initialize (janela) @janela = janela @imagem = Gosu::Image.new(@janela,"Nave.bmp",true) @x = @janela.width/2 @y = @janela.height/2 @imagem.draw(@x,@y,1) def mover_direita @x = @x + 5 if (@x>@janela.width-(@imagem.width+10) ) then @x = @janela.width-(@imagem.width+10) def mover_esquerda @x = @x - 5 if (@x < 10) then @x = 10 Cata_estrela.rb $LOAD_PATH << '.' require 'gosu' require 'jogador' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Jogador.new(self) @imagem_fundo.draw(0,0,0) @jogador.draw() def update if ( button_down?(gosu::button::kbright) ) then @jogador.mover_direita if ( button_down?(gosu::button::kbleft) ) then @jogador.mover_esquerda 18/49

Organizando Colocar o jogo e o jogador em classes separadas jogador.rb require 'gosu' class Jogador def initialize (janela) @janela = janela @imagem = Gosu::Image.new(@janela,"Nave.bmp",true) @x = @janela.width/2 @y = @janela.height/2 @imagem.draw(@x,@y,1) def mover_direita @x = @x + 5 if (@x>@janela.width-(@imagem.width+10) ) then @x = @janela.width-(@imagem.width+10) def mover_esquerda @x = @x - 5 if (@x < 10) then @x = 10 Cata_estrela.rb $LOAD_PATH << '.' require 'gosu' require 'jogador' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Jogador.new(self) @imagem_fundo.draw(0,0,0) @jogador.draw() def update if ( button_down?(gosu::button::kbright) ) then @jogador.mover_direita if ( button_down?(gosu::button::kbleft) ) then @jogador.mover_esquerda 18/49

Organizando Colocar o jogo e o jogador em classes separadas jogador.rb require 'gosu' class Jogador def initialize (janela) @janela = janela @imagem = Gosu::Image.new(@janela,"Nave.bmp",true) @x = @janela.width/2 @y = @janela.height/2 @imagem.draw(@x,@y,1) def mover_direita @x = @x + 5 if (@x>@janela.width-(@imagem.width+10) ) then @x = @janela.width-(@imagem.width+10) def mover_esquerda @x = @x - 5 if (@x < 10) then @x = 10 Cata_estrela.rb $LOAD_PATH << '.' require 'gosu' require 'jogador' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Jogador.new(self) @imagem_fundo.draw(0,0,0) @jogador.draw() def update if ( button_down?(gosu::button::kbright) ) then @jogador.mover_direita if ( button_down?(gosu::button::kbleft) ) then @jogador.mover_esquerda 18/49

Organizando Colocar o jogo e o jogador em classes separadas jogador.rb require 'gosu' class Jogador def initialize (janela) @janela = janela @imagem = Gosu::Image.new(@janela,"Nave.bmp",true) @x = @janela.width/2 @y = @janela.height/2 @imagem.draw(@x,@y,1) def mover_direita @x = @x + 5 if (@x>@janela.width-(@imagem.width+10) ) then @x = @janela.width-(@imagem.width+10) def mover_esquerda @x = @x - 5 if (@x < 10) then @x = 10 Cata_estrela.rb $LOAD_PATH << '.' require 'gosu' require 'jogador' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Jogador.new(self) @imagem_fundo.draw(0,0,0) @jogador.draw() def update if ( button_down?(gosu::button::kbright) ) then @jogador.mover_direita if ( button_down?(gosu::button::kbleft) ) then @jogador.mover_esquerda 18/49

Organizando Colocar o jogo e o jogador em classes separadas jogador.rb require 'gosu' class Jogador def initialize (janela) @janela = janela @imagem = Gosu::Image.new(@janela,"Nave.bmp",true) @x = @janela.width/2 @y = @janela.height/2 @imagem.draw(@x,@y,1) def mover_direita @x = @x + 5 if (@x>@janela.width-(@imagem.width+10) ) then @x = @janela.width-(@imagem.width+10) def mover_esquerda @x = @x - 5 if (@x < 10) then @x = 10 Cata_estrela.rb $LOAD_PATH << '.' require 'gosu' require 'jogador' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Jogador.new(self) @imagem_fundo.draw(0,0,0) @jogador.draw() def update if ( button_down?(gosu::button::kbright) ) then @jogador.mover_direita if ( button_down?(gosu::button::kbleft) ) then @jogador.mover_esquerda 18/49

Organizando Colocar o jogo e o jogador em classes separadas jogador.rb require 'gosu' class Jogador def initialize (janela) @janela = janela @imagem = Gosu::Image.new(@janela,"Nave.bmp",true) @x = @janela.width/2 @y = @janela.height/2 @imagem.draw(@x,@y,1) def mover_direita @x = @x + 5 if (@x>@janela.width-(@imagem.width+10) ) then @x = @janela.width-(@imagem.width+10) def mover_esquerda @x = @x - 5 if (@x < 10) then @x = 10 Cata_estrela.rb $LOAD_PATH << '.' require 'gosu' require 'jogador' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Jogador.new(self) @imagem_fundo.draw(0,0,0) @jogador.draw() def update if ( button_down?(gosu::button::kbright) ) then @jogador.mover_direita if ( button_down?(gosu::button::kbleft) ) then @jogador.mover_esquerda 18/49

Organizando Colocar o jogo e o jogador em classes separadas jogador.rb require 'gosu' class Jogador def initialize (janela) @janela = janela @imagem = Gosu::Image.new(@janela,"Nave.bmp",true) @x = @janela.width/2 @y = @janela.height/2 @imagem.draw(@x,@y,1) def mover_direita @x = @x + 5 if (@x>@janela.width-(@imagem.width+10) ) then @x = @janela.width-(@imagem.width+10) def mover_esquerda @x = @x - 5 if (@x < 10) then @x = 10 Cata_estrela.rb $LOAD_PATH << '.' require 'gosu' require 'jogador' class CataEstrela < Gosu::Window def initialize super(640,480,false) self.caption = "Cata Estrelas" @imagem_fundo = Gosu::Image.new(self, "Space.png", true) @jogador = Jogador.new(self) @imagem_fundo.draw(0,0,0) @jogador.draw() def update if ( button_down?(gosu::button::kbright) ) then @jogador.mover_direita if ( button_down?(gosu::button::kbleft) ) then @jogador.mover_esquerda 18/49

Organizando Cada objeto tem suas próprias responsabilidades Características Ações Objetos precisam conhecer outros objetos Onde o jogador deve ser desenhado? Na janela O que deve acontecer quando apertar seta? Mudar o jogador de posição 19/49

Arquivos jogador.rb require 'gosu' class Jogador cata_estrela.rb $LOAD_PATH << '.' require 'gosu' require 'jogador' class CataEstrela < Gosu::Window principal.rb $LOAD_PATH << '.' require 'CataEstrela' jogo = CataEstrela.new jogo.show 20/49

DEMO v2 21/49

Mais Elementos Estrelas estrela.rb class Estrela attr_reader :x, :y def initialize(janela) @janela = janela @color = Gosu::Color.new(0xff000000) @color.red = rand(256-40) + 40 @color.green = rand(256-40) + 40 @color.blue = rand(256-40) + 40 @x = rand * 640 @y = rand * 480 @imagem = Gosu::Image.new(@janela,"Estrela.png",true) @imagem.draw(@x - @imagem.width / 2.0, @y - @imagem.height / 2.0, 1, 1, 1, @color, :add) 22/49

Mais Elementos Estrelas estrela.rb class Estrela criar métodos para leitura dos atributos: def x return @x attr_reader :x, :y def initialize(janela) @janela = janela @color = Gosu::Color.new(0xff000000) @color.red = rand(256-40) + 40 @color.green = rand(256-40) + 40 @color.blue = rand(256-40) + 40 @x = rand * 640 @y = rand * 480 @imagem = Gosu::Image.new(@janela,"Estrela.png",true) @imagem.draw(@x - @imagem.width / 2.0, @y - @imagem.height / 2.0, 1, 1, 1, @color, :add) 22/49

Mais Elementos Estrelas estrela.rb class Estrela criar métodos para leitura dos atributos: def x return @x attr_reader :x, :y def initialize(janela) @janela = janela @color = Gosu::Color.new(0xff000000) @color.red = rand(256-40) + 40 @color.green = rand(256-40) + 40 @color.blue = rand(256-40) + 40 @x = rand * 640 @y = rand * 480 @imagem = Gosu::Image.new(@janela,"Estrela.png",true) Arquivo de imagem Estrela.png @imagem.draw(@x - @imagem.width / 2.0, @y - @imagem.height / 2.0, 1, 1, 1, @color, :add) 22/49

Mais Elementos Estrelas estrela.rb class Estrela criar métodos para leitura dos atributos: def x return @x attr_reader :x, :y def initialize(janela) @janela = janela @color = Gosu::Color.new(0xff000000) @color.red = rand(256-40) + 40 @color.green = rand(256-40) + 40 @color.blue = rand(256-40) + 40 @x = rand * 640 @y = rand * 480 @imagem = Gosu::Image.new(@janela,"Estrela.png",true) Criar cor aleatoreamente (RGB) Arquivo de imagem Estrela.png @imagem.draw(@x - @imagem.width / 2.0, @y - @imagem.height / 2.0, 1, 1, 1, @color, :add) 22/49

Criando estrelas 23/49

Criando estrelas cata_estrela.rb require 'estrela' class CataEstrela < Gosu::Window def initialize @estrelas = [] for i in 1..25 do @estrelas << Estrela.new(self) for estrela in @estrelas do estrela.draw def update 23/49

Criando estrelas cata_estrela.rb Array para armazenar as estrelas require 'estrela' class CataEstrela < Gosu::Window def initialize @estrelas = [] for i in 1..25 do @estrelas << Estrela.new(self) for estrela in @estrelas do estrela.draw def update 23/49

Criando estrelas cata_estrela.rb Array para armazenar as estrelas Laço para criar 25 estrelas require 'estrela' class CataEstrela < Gosu::Window def initialize @estrelas = [] for i in 1..25 do @estrelas << Estrela.new(self) for estrela in @estrelas do estrela.draw def update 23/49

Criando estrelas cata_estrela.rb Array para armazenar as estrelas Laço para criar 25 estrelas No método draw deve desenhar todas as estrelas contidas no array estrelas require 'estrela' class CataEstrela < Gosu::Window def initialize @estrelas = [] for i in 1..25 do @estrelas << Estrela.new(self) for estrela in @estrelas do estrela.draw def update 23/49

DEMO v3 24/49

Nave cata estrelas Quando passar por uma estrela a nave deve capturá-la cata_estrela.rb class CataEstrela < Gosu::Window def initialize @estrelas = Array.new for i in 1..25 do @estrelas << Estrela.new(self) def update if (rand(100) < 10 and @estrelas.size < 25) then @estrelas.push(estrela.new(self)) @jogador.cata_estrelas(@estrelas) 25/49

Nave cata estrelas Quando passar por uma estrela a nave deve capturá-la O jogo começa sem estrelas cata_estrela.rb class CataEstrela < Gosu::Window def initialize @estrelas = Array.new for i in 1..25 do @estrelas << Estrela.new(self) def update if (rand(100) < 10 and @estrelas.size < 25) then @estrelas.push(estrela.new(self)) @jogador.cata_estrelas(@estrelas) 25/49

Nave cata estrelas Quando passar por uma estrela a nave deve capturá-la O jogo começa sem estrelas Novas estrelas são criadas no decorrer do jogo cata_estrela.rb class CataEstrela < Gosu::Window def initialize @estrelas = Array.new for i in 1..25 do @estrelas << Estrela.new(self) def update if (rand(100) < 10 and @estrelas.size < 25) then @estrelas.push(estrela.new(self)) @jogador.cata_estrelas(@estrelas) 25/49

Nave cata estrelas Quando passar por uma estrela a nave deve capturá-la O jogo começa sem estrelas Novas estrelas são criadas no decorrer do jogo O jogador deve verificar se está sobre uma ou mais estrelas cata_estrela.rb class CataEstrela < Gosu::Window def initialize @estrelas = Array.new for i in 1..25 do @estrelas << Estrela.new(self) def update if (rand(100) < 10 and @estrelas.size < 25) then @estrelas.push(estrela.new(self)) @jogador.cata_estrelas(@estrelas) 25/49

Nave cata estrelas Método no jogador que verifica posição da nave e de cada estrela. jogador.rb class Jogador def initialize (janela) def mover_direita def mover_esquerda def mover_cima def mover_baixo def cata_estrelas(estrelas) estrelas.reject! do estrela Gosu::distance(@x, @y, estrela.x, estrela.y) < 35 26/49

Nave cata estrelas Método no jogador que verifica posição da nave e de cada estrela. jogador.rb elimina do array as estrelas cuja distância da nave seja menor que 35. class Jogador def initialize (janela) def mover_direita def mover_esquerda def mover_cima def mover_baixo def cata_estrelas(estrelas) estrelas.reject! do estrela Gosu::distance(@x, @y, estrela.x, estrela.y) < 35 26/49

DEMO v4 27/49

Movimento da nave Nave deve acelerar para frente Giro em torno do eixo 0 270 90 180 28/49

Desenho da nave draw_rot @imagem.draw_rot(@x, @y, 2, @angulo) x,y é no centro da imagem 0 270 90 y 180 x 29/49

Desenho da nave draw_rot @imagem.draw_rot(@x, @y, 2, @angulo) x,y é no centro da imagem 0 draw_rot(x, y, 2, 90) 270 90 y 180 x 29/49

Movimento da nave Gosu::offset_x e Gosu::offset_y x = Gosu::offset_x(30.0,d) x = Gosu::offset_x(30.0,d) 0 offset x 270 30 o d 90 180 offset y 30/49

Movimento da nave Mudanças em jogador método draw Adicionar velocidades do eixo x do eixo y substituir os métodos mover_??? pelos: girar_esquerda girar_direita acelerar mover Se atingir bordas do espaço muda para o lado inverso jogador.rb class Jogador def initialize (janela) @vel_x = 0 @vel_y = 0 @angulo = 0.0 @imagem.draw_rot(@x, @y, 2, @angulo) def girar_direita @angulo += 5.0 def girar_esquerda @angulo -= 5.0 def acelerar @vel_x += Gosu::offset_x(@angulo, 0.5) @vel_y += Gosu::offset_y(@angulo, 0.5) def mover @x += @vel_x @y += @vel_y @x %= 640 @y %= 480 @vel_x *= 0.95 @vel_y *= 0.95 31/49

Movimento da nave Mudanças em CataEstrela Apenas método update Muda botões e chamadas aos métodos do jogador cata_estrela.rb class CataEstrela < Gosu::Window def update if ( button_down?(gosu::button::kbright) ) then @jogador.girar_direita if ( button_down?(gosu::button::kbleft) ) then @jogador.girar_esquerda if ( button_down?(gosu::button::kbup) ) then @jogador.acelerar if (rand(100) < 10 and @estrelas.size < 25) then @estrelas.push(estrela.new(self)) @jogador.cata_estrelas(@estrelas) @jogador.mover 32/49

DEMO v5 33/49

Animação das estrelas Efeito 3D Estrelas giram em torno do próprio eixo Várias imagens No arquivo uma imagem com as várias estrelas lado a lado Método load_tiles @imagens = Gosu::Image::load_tiles(@janela, "Estrela.png", 25, 25, false) 34/49

Animação das estrelas Efeito 3D Estrelas giram em torno do próprio eixo Várias imagens No arquivo uma imagem com as várias estrelas lado a lado Método load_tiles @imagens = Gosu::Image::load_tiles(@janela, "Estrela.png", 25, 25, false) Array com as imagens 34/49

Animação das estrelas Efeito 3D Estrelas giram em torno do próprio eixo Várias imagens No arquivo uma imagem com as várias estrelas lado a lado Método load_tiles @imagens = Gosu::Image::load_tiles(@janela, "Estrela.png", 25, 25, false) Array com as imagens A imagem é dividida em blocos de 25x25 pixels 34/49

Animação das estrelas estrela.rb class Estrela attr_reader :x, :y def initialize(janela) @janela = janela @color = Gosu::Color.new(0xff000000) @color.red = rand(256-40) + 40 @color.green = rand(256-40) + 40 @color.blue = rand(256-40) + 40 @x = rand * 640 @y = rand * 480 @imagens = Gosu::Image::load_tiles(@janela, "Estrela.png", 25, 25, false) imagem= @imagens[gosu::milliseconds / 100 % @imagens.size] imagem.draw(@x - imagem.width / 2.0, @y - imagem.height / 2.0,1, 1, 1, @color, :add) 35/49

Animação das estrelas estrela.rb class Estrela attr_reader :x, :y def initialize(janela) @janela = janela @color = Gosu::Color.new(0xff000000) @color.red = rand(256-40) + 40 @color.green = rand(256-40) + 40 @color.blue = rand(256-40) + 40 @x = rand * 640 @y = rand * 480 Define qual imagem mostrar @imagens = Gosu::Image::load_tiles(@janela, "Estrela.png", 25, 25, false) imagem= @imagens[gosu::milliseconds / 100 % @imagens.size] imagem.draw(@x - imagem.width / 2.0, @y - imagem.height / 2.0,1, 1, 1, @color, :add) 35/49

Animação das estrelas estrela.rb class Estrela attr_reader :x, :y def initialize(janela) @janela = janela @color = Gosu::Color.new(0xff000000) @color.red = rand(256-40) + 40 @color.green = rand(256-40) + 40 @color.blue = rand(256-40) + 40 @x = rand * 640 @y = rand * 480 Define qual imagem mostrar @imagens = Gosu::Image::load_tiles(@janela, "Estrela.png", 25, 25, false) Desenha imagem imagem= @imagens[gosu::milliseconds / 100 % @imagens.size] imagem.draw(@x - imagem.width / 2.0, @y - imagem.height / 2.0,1, 1, 1, @color, :add) 35/49

DEMO v6 36/49

Som ao catar estrela Arquivo de som Beep.wav Carrega no initialize Toca ao capturar uma estrela jogador.rb class Jogador def initialize (janela) @beep = Gosu::Sample.new(@janela, "Beep.wav") def cata_estrelas(estrelas) estrelas.reject! do estrela if Gosu::distance(@x, @y, estrela.x, estrela.y) < 35 then @beep.play true else false 37/49

Som ao catar estrela Arquivo de som Beep.wav Carrega no initialize Toca ao capturar uma estrela jogador.rb class Jogador def initialize (janela) @beep = Gosu::Sample.new(@janela, "Beep.wav") def cata_estrelas(estrelas) estrelas.reject! do estrela if Gosu::distance(@x, @y, estrela.x, estrela.y) < 35 then @beep.play true else false 37/49

Placar 10 pontos por estrela capturada Jogador conta seus pontos estrela.rb class Jogador attr_reader :placar def initialize (janela) @placar = 0 def cata_estrelas(estrelas) estrelas.reject! do estrela if Gosu::distance(@x, @y, estrela.x, estrela.y) < 35 then @beep.play @placar+=10 true else false 38/49

Placar 10 pontos por estrela capturada Jogador conta seus pontos estrela.rb class Jogador attr_reader :placar def initialize (janela) @placar = 0 def cata_estrelas(estrelas) estrelas.reject! do estrela if Gosu::distance(@x, @y, estrela.x, estrela.y) < 35 then @beep.play @placar+=10 true else false 38/49

Placar 10 pontos por estrela capturada Jogador conta seus pontos estrela.rb class Jogador attr_reader :placar def initialize (janela) @placar = 0 def cata_estrelas(estrelas) estrelas.reject! do estrela if Gosu::distance(@x, @y, estrela.x, estrela.y) < 35 then @beep.play @placar+=10 true else false 38/49

Placar 10 pontos por estrela capturada Jogador conta seus pontos estrela.rb class Jogador attr_reader :placar def initialize (janela) @placar = 0 def cata_estrelas(estrelas) estrelas.reject! do estrela if Gosu::distance(@x, @y, estrela.x, estrela.y) < 35 then @beep.play @placar+=10 true else false 38/49

Mostrar placar CataEstrela deve mostrar os pontos cata_estrela.rb $LOAD_PATH << '.' require 'gosu' require 'jogador' require 'estrela' class CataEstrela < Gosu::Window def initialize @font = Gosu::Font.new(self, Gosu::default_font_name, 20) @font.draw("placar: #{@jogador.placar}", 10, 10, 3, 1.0, 1.0, 0xffffff00) 39/49

Mostrar placar CataEstrela deve mostrar os pontos cata_estrela.rb $LOAD_PATH << '.' Cria o tipo da fonte require 'gosu' require 'jogador' require 'estrela' class CataEstrela < Gosu::Window def initialize @font = Gosu::Font.new(self, Gosu::default_font_name, 20) @font.draw("placar: #{@jogador.placar}", 10, 10, 3, 1.0, 1.0, 0xffffff00) 39/49

Mostrar placar CataEstrela deve mostrar os pontos cata_estrela.rb $LOAD_PATH << '.' Cria o tipo da fonte Desenha o texto nas cordenadas x=10 e y=10. Eixo z=3. require 'gosu' require 'jogador' require 'estrela' class CataEstrela < Gosu::Window def initialize @font = Gosu::Font.new(self, Gosu::default_font_name, 20) @font.draw("placar: #{@jogador.placar}", 10, 10, 3, 1.0, 1.0, 0xffffff00) 39/49

Mostrar placar CataEstrela deve mostrar os pontos cata_estrela.rb $LOAD_PATH << '.' Cria o tipo da fonte Desenha o texto nas cordenadas x=10 e y=10. Eixo z=3. require 'gosu' require 'jogador' require 'estrela' class CataEstrela < Gosu::Window def initialize @font = Gosu::Font.new(self, Gosu::default_font_name, 20) @font.draw("placar: #{@jogador.placar}", 10, 10, 3, 1.0, 1.0, 0xffffff00) Fator de proporcionalidade de x e y 39/49

Mostrar placar CataEstrela deve mostrar os pontos cata_estrela.rb $LOAD_PATH << '.' Cria o tipo da fonte Desenha o texto nas cordenadas x=10 e y=10. Eixo z=3. require 'gosu' require 'jogador' require 'estrela' class CataEstrela < Gosu::Window def initialize @font = Gosu::Font.new(self, Gosu::default_font_name, 20) @font.draw("placar: #{@jogador.placar}", 10, 10, 3, 1.0, 1.0, 0xffffff00) Fator de proporcionalidade de x e y Cor do texto 39/49

DEMO v7 40/49

Jogo Tela inicial com menu Tecla [i] para iniciar Jogo Temporizador para finalizar jogo Tela final com o placar Estado determina o que fazer 41/49

Jogo Tela inicial com menu Tecla [i] para iniciar Jogo Temporizador para finalizar jogo Tela final com o placar Estado determina o que fazer INICIO 41/49

Jogo Tela inicial com menu Tecla [i] para iniciar Jogo Temporizador para finalizar jogo Tela final com o placar Estado determina o que fazer Pressiona [i] INICIO JOGANDO 41/49

Jogo Tela inicial com menu Tecla [i] para iniciar Jogo Temporizador para finalizar jogo Tela final com o placar Estado determina o que fazer Pressiona [i] 30s INICIO JOGANDO FIM 41/49

Jogo Tela inicial com menu Tecla [i] para iniciar Jogo Temporizador para finalizar jogo Tela final com o placar Estado determina o que fazer cata_estrela.rb class CataEstrela < Gosu::Window def initialize @tempo = 0.0 @estado = "INICIO" Pressiona [i] 30s INICIO JOGANDO FIM 41/49

Jogo Métodos update e draw Pressiona [i] 30s INICIO JOGANDO FIM 42/49

Jogo Métodos update e draw cata_estrela.rb @imagem_fundo.draw(0,0,0) if (@estado == "INICIO") then elsif (@estado == "JOGANDO") then elsif(@estado == "FIM") then Pressiona [i] 30s INICIO JOGANDO FIM 42/49

Jogo Métodos update e draw cata_estrela.rb @imagem_fundo.draw(0,0,0) if (@estado == "INICIO") then elsif (@estado == "JOGANDO") then elsif(@estado == "FIM") then cata_estrela.rb def update if (@estado == "INICIO" ) then elsif (@estado =="JOGANDO" ) then elsif (@estado == "FIM") then Pressiona [i] 30s INICIO JOGANDO FIM 42/49

Menu inicial Tela inicial com mensagem Jogo começa O método draw desenha o menu cata_estrela.rb @imagem_fundo.draw(0,0,0) if (@estado == "INICIO") then msg = "PRESSIONE [I] PARA COMECAR" x=(self.width)/2-((@fonte.text_width(msg,1)/2)) @fonte.draw(msg, x, self.height/2, 3, 1.0, 1.0, 0xffffff00) 43/49

Menu inicial Jogo muda de estado quando usuário digita a tecla i cata_estrela.rb def update if (@estado == "INICIO" ) then if (button_down?(gosu::button::kbi)) then @estado = "JOGANDO" 44/49

Jogando Tempo de jogo Variável para contar o tempo Declarada em initialize com valor zero Incrementada quando estiver no estado JOGANDO Determina fim de jogo quando atinge tempo (30s) Draw e update de acordo com o funcionamento do jogo descrito anteriormente cata_estrela.rb elsif (@estado == "JOGANDO") then @jogador.draw() for estrela in @estrelas do estrela.draw() cata_estrela.rb @fonte.draw("placar: #{@jogador.placar}", 10, 10, 3, 1.0, 1.0, 0xffffff00) @fonte.draw("tempo: #{@tempo.to_i}s", 10, 30, 3, 1.0, 1.0, 0xffffff00) elsif(@estado == "FIM") then def update elsif (@estado =="JOGANDO" ) then if ( button_down?(gosu::button::kbright) ) then @jogador.girar_direita if ( button_down?(gosu::button::kbleft) ) then @jogador.girar_esquerda if ( button_down?(gosu::button::kbup) ) then @jogador.acelerar if (rand(100) < 10 and @estrelas.size < 25) then @estrelas.push(estrela.new(self)) @jogador.cata_estrelas(@estrelas) @jogador.mover @tempo+=1.0/60.0 if (@tempo.to_i == 30) then @estado = "FIM" 45/49

Fim de jogo Método draw mostra o placar O método update nada faz class CataEstrela < Gosu::Window elsif(@estado == "FIM") then msg = "FIM DE JOGO, VOCE FEZ #{@jogador.placar} PONTOS" x=(self.width)/2-((@fonte.text_width(msg,1)/2)) @fonte.draw(msg, x, self.height/2, 3, 1.0, 1.0, 0xffffff00) def update elsif (@estado == "FIM") then 46/49

DEMO v8 47/49

Conclusão Simplifica o desenvolvimento de jogos Bibliotecas extras especifica para jogos Tutorial GOSU para Ruby https://github.com/jlnr/gosu/wiki/ruby-tutorial Exercício: Faça o tutorial abaixo https://sites.google.com/a/ruby4kids.com/gosu/home 48/49

Dúvidas? 49/49