Aula 4 – Tratamento de Input

Slides:



Advertisements
Apresentações semelhantes
IFTO ESTRUTURA DE DADOS AULA 05 Prof. Manoel Campos da Silva Filho
Advertisements

Programação em Java Prof. Maurício Braga
1 ANÁLISE E PROJETO NO PROCESSO DE DESENVOLVIMENTO DE SOFTWARE PROCESSO: CONCEITO MODELOS DE PROCESSO PROCESSO UNIFICADO HISTÓRIA CARACTERÍSTICAS AS QUATRO.
Noções de Sistemas Operacionais
Material pedagógico Multiplicar x 5 Clica!
Vamos contar D U De 10 até 69 Professor Vaz Nunes 1999 (Ovar-Portugal). Nenhuns direitos reservados, excepto para fins comerciais. Por favor, não coloque.
Kit Alfa Marcello Cláudio de Gouvêa Duarte.
Introdução à Programação usando Processing Programação Gráfica 2D Animações Exercício Animações 14/10/09 Bruno C. de Paula 2º Semestre 2009 > PUCPR >
14/10/09 Uma animação possui: Início; Passo; Fim; 1.
Introdução à Programação Exercício F13 - Minigame - Interação - Imagens 1º Semestre 2010 > PUCPR > Design Digital Bruno C. de Paula.
Exercício do Tangram Tangram é um quebra-cabeças chinês no qual, usando 7 peças deve-se construir formas geométricas.
BD em.NET: Passo a passo conexão com SQL Server 1º Semestre 2010 > PUCPR > BSI Bruno C. de Paula.
Windows Forms 2º Semestre 2010 > PUCPR > TPU Bruno C. de Paula.
Interação entre objetos
Copyright (c) 2003 by Valery Sklyarov and Iouliia Skliarova: DETUA, IEETA, Aveiro University, Portugal.
1 INQUÉRITOS PEDAGÓGICOS 2º Semestre 2003/2004 ANÁLISE GERAL DOS RESULTADOS OBTIDOS 1.Nº de RESPOSTAS ao inquérito 2003/2004 = (42,8%) 2.Comparação.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 2.
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 3.
Excel Profa. Cristina M. Nunes.
ES723 - Dispositivos Eletromecânicos
Estatística Básica Utilizando o Excel
Wiimote no Windows e Linux + Gotcha
Questionário de Avaliação Institucional
SISTEMA DE CONTROLE DE REMANEJAMENTO E RESERVA TÉCNICA - SISCORT
Listas Encadeadas.
Aula de reposição Prof. Grace e Ângela
Classes e objetos Arrays e Sobrecarga
Herança P. O. O. Prof. Ângela e Grace.
Classes e objetos P. O. O. Prof. Grace.
Técnica de Contagem.
Provas de Concursos Anteriores
MECÂNICA - ESTÁTICA Vetores Forças Cap. 2.
Conhecendo o Visual Studio.NET
Timken Store Brasil Denis Guimarães.
Módulo Financeiro Centro de Custo.
Impressão de etiquetas
INPUT Alexandre Tolstenko Nogueira
MECÂNICA - DINÂMICA Cinemática de uma Partícula Cap. 12.
Cinemática de uma Partícula Cap. 12
Desenvolvimento de Jogos com XNA
Resultantes de Sistemas de Forças Cap. 4
Cinemática Plana de um Corpo Rígido Cap. 16
Árvores binárias de pesquisa com balanceamento
Conteúdos do tutorial O que é um Slide Mestre?
1 António Arnaut Duarte. 2 Sumário: primeiros passos;primeiros passos formatar fundo;formatar fundo configurar apresentação;configurar apresentação animação.
Estruturas de Dados com Jogos
Coordenação Geral de Ensino da Faculdade
Entendendo as definições de classe
É u m e l e m e n t o f u n d a m e n t a l
EXERCÍCIOS PARA GUARDA-REDES
Introdução ao XNA e ao Game Developer Express
VI Fórum Banco Central sobre Inclusão Financeira
1 2 Observa ilustração. Cria um texto. Observa ilustração.
Computação Gráfica Aula 3 Transformações Geométricas
Agenda - Aula 2 Introdução (Computador Digital) Processadores
MATRICIAL CONSULTORIA LTDA. PREFEITURA MUNICIPAL DE GARIBALDI 23/10/ : ATENÇÃO Os locais descritos nas planilhas anexas não correspondem ao total.
XNA Game Studio Tutorial Criando um jogo com XNA em 1 hora
Estrutura de Dados André Augusto Nogueira Alves
Alexandre Tolstenko Nogueira
Máquina de Turing Universal
ÁREA DE TRABALHO DO WINDOWS
Cinemática Plana de um Corpo Rígido Cap. 16
INTRODUÇÃO À ORIENTAÇÃO A OBJETOS EM JAVA
Módulo Compras Relatórios e Relações 1. Objetivo 2 Conhecer os relatórios e as relações do sistema disponibilizadas no módulo Compras.
Planilha Eletrônica - Excel
Contagem Sequencial do Estoque
DESENVOLVIMENTO DE JOGOS 2D UTILIZANDO O FRAMEWORK

Aula 3 – Arquitetura XNA e desenho 2D
ASP.NET Passo a Passo Controles com Processamento Personalizado Criando um controle personalizado 1. Abra ou copie a solução ControlORama desenvolvido.
Transcrição da apresentação:

Aula 4 – Tratamento de Input O objetivo desta aula é apresentar aos alunos os conceitos básicos sobre como tratar a entrada de dados de diversos dispositivos de input (com destaque para gamepad, mouse e teclado) e tratamento básico de colisões 2D Para superar algumas limitações do tratamento de input no XNA, são usadas as classes de apoio (código aberto de uso livre) criadas por Benjamin Nitschke, http://benjaminnitschke.com Há diversos exemplos práticos para esta aula, cada exemplo é marcado por um slide escrito “demo” Ao fim da aula é reservado um tempo para os alunos exercitarem os conceitos apresentados, assim, não é recomendável que os alunos realizem os demos juntos com o professor, pois isso acaba tomando muito tempo da aula

XNA Game Studio Aula 4 Tratamento de Input Esteban Walter Gonzalez Clua

Agenda: Aula 4 Revisão Arquitetura de um programa XNA Tratamento de input do usuário Uso de classes de apoio para tratamento de input

Revisão: Componentes do XNA Game Studio Framework

Pipeline de Conteúdo (content pipeline) 4/1/2017 8:02 AM Revisão: XNA Framework Jogos Starter Kits Código Conteúdo Componentes Framework (extensões) Modelo de Aplicação Pipeline de Conteúdo (content pipeline) Framework (núcleo) Graphics Audio Input Math Storage Network Plataforma Direct3D XACT XINPUT XCONTENT Legenda XNA já provê Você cria Comunidade

Tratamento de input do usuário

4/1/2017 8:02 AM Input no XNA Framework O XNA Torna a obtenção do input do usuário extremamente fácil Suporte a Xbox 360 gamepad, guitarra, tambores, volantes, pedais, etc! Keyboard Mouse (apenas para Windows) Modelo de programação imediato Não demanda inicialização Não demanda gerenciamento de estado Tira uma fotografia do estado de todos os botões naquele momento The Input API is built on top of XInput, which is the cross-platform API that drives the common controller (Xbox 360 Controller). Input offers an immediate mode API that requires no initialization. No need to worry about acquiring or releasing a device, setting the sharing mode, etc. All you need to do is call GetState on the appropriate controller type and that’s it! We provide a GamePad type that represents the Xbox 360 Controller for Windows and the Xbox 360, as well as Keyboard type for both platforms and a Mouse type for Windows.

Tipos de controle gerenciados Enumeração gamePadType permite verificar o tipo de controle, e método GetCapabilities permite receber detalhes sobre capacidades. ArcadeStickController - arcade stick. DancePadController - dance pad. DrumKitController - drum kit (tambor). FlightStickController - flight stick (manche). GamePadController - Xbox 360 Controller. GuitarController - guitarra! UnknownController - unknown type (futuros dispositivos) WheelController – wheel (volante).

wireless receiver p/ PC Input no XNA Framework Exemplo de desenvolvimento multi-plataforma: Xbox 360 controller Wireless ou wired (USB) Pode ser usado tanto em jogos Windows como Xbox 360 A interface de programação é a mesma Pode ser usado como controle PC tradicional! wireless receiver p/ PC

Input no XNA Framework Xbox 360 controller 11 botões 2 triggers (alavancas) 2 direcionais analógicos 1 direcional digital Dois motores de vibração GamePadState state = GamePad.GetState(PlayerIndex.One);

Input no XNA Framework Botões A, B, X e Y Cada um pode estar ButtonState.Pressed ou ButtonState.Released

Input no XNA Framework Botões Start e Back Cada um pode estar ButtonState.Pressed ou ButtonState.Released

Input no XNA Framework Botão Xbox Guide Não é usado durante os jogos No PC... Abre janela de configuração do joystick No Xbox 360... Abre a dashboard O quadrante ao redor desse botão indica qual o índice do jogador (1 a 4)

Input no XNA Framework Direcionais thumb sticks Valores contínuos -1.0 a +1.0 no eixo X -1.0 a +1.0 no eixo Y Eixo Y incrementa de baixo para cima Contrário das coordenadas da tela! Podem ser pressionados também, como um botão ButtonState.Pressed ou ButtonState.Released

Input no XNA Framework D-pad Quatro direções Up Down Left Right Cada direção pode estar ButtonState.Pressed ou ButtonState.Released Valores binários, não contínuos É possível ter mais de uma direção pressionada Ex.: diagonais (Up + Left)

Input no XNA Framework Triggers Valores contínuos 0.0 a +1.0

Input no XNA Framework Bumpers ou Shoulders Cada um pode estar ButtonState.Pressed ou ButtonState.Released Valores contínuos

Input no XNA Framework Motores de vibração Esquerda: baixa-freqüência Direita: alta-freqüência Cada um pode vibrar com intensidade de 0.0 a 1.0 Valores contínuos (float) 1.0 é a vibração máxima 0.0 encerra a vibração – se não atribuir 0, continua vibrando! GamePad.SetVibration(PlayerIndex.One, 0.5f, 1.0f);

Tratamento de input do usuário Vamos adaptar um dos demos anteriores para incluir um novo objeto, controlado pelo usuário via teclado, gamePad e mouse, através dos seguintes passos: Copiar a classe clsSprite e renomeá-la para clsPlayer Alterar o método Update para tratar o input do usuário Alterar os métodos do objeto principal (game1) para incluir o novo componente e desenhá-lo

Tratamento de input do usuário 1. Copiar a classe clsSprite para clsPlayer Dica: use Copy e Paste direto na janela de “Solution Explorer” do C# Express Após renomear, vamos incluir na classe clsPlayer: using Microsoft.Xna.Framework.Input;

Tratamento de input do usuário 2. Alterar o método Update para tratar o input do usuário - GamePad public override void Update(GameTime gameTime) { Vector2 novaPosicao = posicao; bool podeMover = true; // usado para teste das bordas da janela // Muda a posição usando o thumbstick da esquerda GamePadState gamePad = GamePad.GetState(PlayerIndex.One); novaPosicao.X += gamePad.ThumbSticks.Left.X; novaPosicao.Y -= gamePad.ThumbSticks.Left.Y; // Atualiza a posição if(podeMover) posicao = novaPosicao; }

Tratamento de input do usuário 2. Alterar o método Update para tratar o input do usuário - Teclado public override void Update(GameTime gameTime) { ... // muda a posição usando o teclado KeyboardState keyboardState = Keyboard.GetState(); if (keyboardState.IsKeyDown(Keys.Up)) novaPosicao.Y -= 1; if (keyboardState.IsKeyDown(Keys.Down)) novaPosicao.Y += 1; if (keyboardState.IsKeyDown(Keys.Left)) novaPosicao.X -= 1; if (keyboardState.IsKeyDown(Keys.Right)) novaPosicao.X += 1; }

Tratamento de input do usuário 2. Alterar o método Update para tratar o input do usuário – Mouse public override void Update(GameTime gameTime) { ... // muda a posição usando o mouse MouseState mouse = Mouse.GetState(); novaPosicao.X = mouse.X; novaPosicao.Y = mouse.Y; }

Tratamento de input do usuário 2. Alterar o método Update para tratar o input do usuário – Testando as bordas da janela public override void Update(GameTime gameTime) { Vector2 novaPosicao = posicao; bool podeMover = true; ... // testa a nova posição para não sair pelas bordas da tela if(novaPosicao.X + textura.Width > this.Game.Window.ClientBounds.Width) podeMover = false; // direita if (novaPosicao.Y + textura.Height > this.Game.Window.ClientBounds.Height) podeMover = false; // de baixo if (novaPosicao.X < 0) podeMover = false; // esquerda if (novaPosicao.Y < 0) podeMover = false; // de cima // Atualiza a posição if(podeMover) posicao = novaPosicao; }

Tratamento de input do usuário 3. Adicionar o objeto Player ao Game private clsPlayer jogador; ... protected override void LoadContent() { // carrega o jogador jogador = new clsPlayer(this, content.Load<Texture2D>(“player_xna_thumbnail"), new Vector2(300, 100)); this.Components.Add(jogador ); }

Tratamento de input do usuário ...e finalmente atualizar o método Draw da classe Game protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(SpriteBlendMode.AlphaBlend); Desenho2D.Draw(spriteBatch); jogador.Draw(spriteBatch); spriteBatch.End(); base.Draw(gameTime); } Veja que as duas sprites são desenhadas com o mesmo spritebatch, melhorando a performance!

Tratamento de input do usuário Toque final: Incluindo detecção de colisão Incluir código na classe Player que testa colisão com objetos Sprite Chamar código na classe principal (game1) Incluir vibração no GamePad

Detecção de colisão Algoritmo de “bounding box” é um dos mais simples e comuns para detecção de colisão A idéia é testar de uma “caixa” que contém a sprite colide com a “caixa” da outra sprite Melhorias no algoritmo podem considerar diversas “caixas “ por sprite

Tratamento de input do usuário 1. Incluir código na classe Player que testa colisão com objetos Sprite public bool Colidiu(clsSprite sprite) { // Verifica se colidiu com a sprite if (this.posicao.X + this.textura.Width > sprite.posicao.X && this.posicao.X < sprite.posicao.X + sprite.textura.Width && this.posicao.Y + this.textura.Height > sprite.posicao.Y && this.posicao.Y < sprite.posicao.Y + sprite.textura.Height) return true; else return false; }

Tratamento de input do usuário 2. Chamar código na classe principal (game1) protected override void Update(GameTime gameTime) { ... // Testa se houve colisão if (jogador.Colidiu(Desenho2D)) Desenho2D.velocidade *= -1; GamePad.SetVibration(PlayerIndex.One, 1.0f, 1.0f); } else GamePad.SetVibration(PlayerIndex.One, 0f, 0f);

Tratamento de input e detecção de colisão Projeto: XNA 3.0 Demo - Input e colisão

Input não tem “memória” Os objetos de input (Mouse, Keyboard, GamePad) tiram uma “foto” do estado atual! Não dá para saber se o mouse “está se movendo”, só sua posição Não dá para saber se o usuário acabou de apertar uma tecla, ou se ela já estava apertada. Não dá para saber a última direção em que o usuário moveu o Mouse ou gamePad => Uso de classes de apoio (“helpers”)

Apoio ao tratamento de input Classes de uso livre, criadas por Benjamin Nitschke, http://benjaminnitschke.com Input.cs Mouse: Movimento, arraste, MouseInBox (se está em determinada região), etc; e desabilitação das rotinas de mouse quando rodando no Xbox 360 Teclado: Verificação de tecla “recém-pressionada”, se é tecla especial, conversão de caracteres para teclas Gamepad: verificação de controles “recém-pressionados”

Apoio ao tratamento de input Uso das classes de apoio: 1. Incluir Input.cs (modificada) no projeto 2. Chamar Input.Update no update do jogo Input.Update(gameTime); 3. Usar os métodos (exemplos) if (Input.KeyboardUpJustPressed) incremento = -1; ... if(Input.GamePadLeftShoulderJustPressed) if (Input.MouseLeftButtonJustPressed) { if (Input.MouseInBox(this[BotaoAtivo].retangulo)) this[BotaoAtivo].Executa(); }

Desafio 1: Navegação entre telas Criar uma lista de telas Navegar pela lista de telas

Criando uma classe “Tela” A tela é fácil – mais simples que uma sprite! class Tela { private Texture2D fundo; // Textura da tela public Tela(Texture2D Textura) fundo = Textura; } public void Draw(SpriteBatch Renderizador2D) Renderizador2D.Draw(fundo, Vector2.Zero, Color.White); public void Unload() fundo.Dispose();

Navegando entre telas Também é fácil – basta desenhar uma tela em vez da outra! private Tela tela1; private Tela tela2; private Tela telaAtual; ... protected override void Initialize()... Tela1 = new Tela(Content.Load<Texture2D>("Tela_Inicial")); Tela2 = new Tela(Content.Load<Texture2D>("Tela_GameOver")); telaAtual = Tela1; protected override void Update(GameTime gameTime)... if (GamePad.GetState(PlayerIndex.One).Buttons.A==ButtonState.Pressed) telaAtual = Tela2; protected override void Draw(GameTime gameTime) telaAtual.Draw(spriteBatch);

Dica: E a lista de telas? No C#, podemos criar listas de objetos com List Estas listas podem ser acessadas como arrays ou via foreach. Por exemplo: List<string> palavras = new List<string>(); palavras.Add("Teste1"); palavras.Add("Teste2"); foreach (string palavra in palavras) { MessageBox.Show(palavra); } for(int i = 0; i < palavras.Count;i++ ) MessageBox.Show(palavras[i]);

Desafio 2: Criar uma lista de botões Duas imagens: selecionado / não selecionado Com evento que é disparado ao executar o botão Criar lista que gerencia navegação entre botões

Uso de classes de apoio ao input para criar botões e telas Rodar o projeto e depois remover comentários na classe clsButtons e executar novamente Projeto: XNA 3.0 Demo - Botoes e Telas

Dica: Organizar Projeto! Atual Organizado Content.Load<Texture2D>(@“Botoes\blackBall“) Content.Load<Texture2D>(@“Telas\Tela_Inicial") Content.Load<Texture2D>(@"blackBall“) Content.Load<Texture2D>(@"Tela_Inicial")

Exemplo de projeto organizado Projeto: XNA 3.0 Demo - Projeto organizado

4/1/2017 8:02 AM Perguntas? 43