terça-feira, 4 de junho de 2013
Dica: Curso online (e gratuito!) de Gamification
Agora você pode fazer um curso de Gamification sem sair de casa. E o melhor: sem pagar nada por isso.
A dica de hoje do GameStorming é o curso de Gamification da Coursera, uma empresa de tecnologia educacional fundada por professores de Ciência da Computação da Universidade de Stanford, nos Estados Unidos.
O curso é totalmente gratuito e pode ser feito pela internet. Além disso, o aluno recebe um certificado após a conclusão das aulas.
Gamification é a aplicação de elementos de jogo e técnicas de design de jogos digitais para problemáticas “reais”, como desafios de negócios e de impacto social. O objetivo do curso é ensinar os mecanismos de gamification e como usá-los de forma eficaz.
Quem irá ministrar o curso é Kevin Werbach, professor na Universidade da Pensilvânia, especialista em negócios e em consultoria em tecnologia. A bagagem de Kevin é muito boa, sendo fundador do Grupo Supernova e fazendo parte da transição presidencial de Barack Obama.
O que podemos aprender com os desenvolvedores indies?
A resposta? Muito.
Não é de hoje que várias pessoas ao redor do globo tentam com variados graus de sucesso, se entregar ao exercício sagrado do desenvolvimento de jogos digitais, imaginando inicialmente que poderão impactar as vidas alheias de maneira parecida com a qual foram atingidos, elevados e descompensados pelos seus primeiros jogos digitais, em um futuro nem tão distante assim. Querem, muitas vezes, revolucionar: às vezes sem saber ao certo o que, pois o mercado de jogos digitais está mais amplo do que nunca. Ainda assim, querem revolucionar alguma coisa: serem lembrados, talvez reconhecidos na rua, assediados, marcar e serem marcados.
E aí, a coisa fica feia e a inspiração dos documentários não dura para sempre. Este, senhores, é um texto sobre sugestões do que não esperar do desenvolvimento indie de jogos digitais. Haverá alguma verdade nas palavras deste articulista? Talvez os mais experientes saberão dizer.
- Dinheiro: a maioria das pessoas que conheço e que está no desenvolvimento de jogos digitais retira seus proventos de outros lugares. Os poucos que de fato ganham dinheiro com isso vivem, até onde sei, remediadamente. Há casos, inclusive no Brasil, de gente que ganha muito bem desenvolvendo jogos, mas estes títulos são de propaganda e, às vezes, educativos. Digamos que esse tipo de jogo digital não seja o modelo que você aprendeu a conhecer como entretenimento digital.
- Fama: parece até ingênuo incluir isso aqui, mas estou dialogando com aquela parte do seu ser que já associou o desenvolvimento à fama e que não tem coragem de admitir em público… sim, você! Ah, sobre a citada: a ideia de ser reconhecido e talvez bem-visto dentro de um seleto grupo de pessoas pode ser caracterizado como fama, então, é possível. Não espere muito mais do grande público além de ser reconhecido como uma pessoa que faz joguinhos, pelo menos com a cultura brasileira.
- Cooperação: ela existe, mas é limitada. Não me parece preciso enxergar a comunidade brasileira de desenvolvedores de jogos digitais como uma fraternidade. Há muito sendo escondido entre as poucas empresas e/ou grupos em atividade. Quando se fala em gastos ou ganhos, há um silêncio ensurdecedor. Entretanto, há muita gente boa e cooperativa, que parece ter percebido que ainda não somos uma comunidade e que não podemos nos dar ao luxo de ter segredos empresariais.
Ainda sobre isso: os trabalhos desenvolvidos durante jams abrem portas e servem muito bem para o intercâmbio de idéias. Por isso, participe de quantas puder. As pessoas costumam ser mais receptivas quando se trata de transmissão de conhecimentos sobre a área, e também sobre ferramentas de trabalho.
- Compromisso: prepare-se para encontrar muitas pessoas que se empolgarão com o seu projeto e, por diversos motivos, o abandonarão. Quando não há remuneração imediatamente presente, isso só piora. Faltam-me palavras para enfatizar o quanto existem pessoas em nosso meio que estão mais interessadas em mentir para si mesmas e se acharem desenvolvedoras de jogos do que ativamente trabalharem e terminarem um projeto. Cuidado com os muito empolgados: eles não costumam aguentar por muito tempo.
Aliás, concordo com os que dizem que essa evasão é muito comum dentro do trabalho criativo: devemos evitá-la a qualquer custo e, caso você tenha que sair de um projeto alheio, tenha a decência de avisar. Parece mentira, mas há os que sequer o fazem.
Por fim, na situação mais corriqueira no nosso desenvolvimento – sem remuneração, sem espaço físico próprio ou qualquer tipo de formalidade empresarial – há de se ser forte, paciente, tolerante à frustração e, principalmente, engajado.
Encerrarei o texto considerando a possibilidade de novamente abordar o assunto futuramente. Quero, entretanto, deixar uma mensagem positiva, talvez a única até agora: fazer jogos, para os que gostam, é algo ímpar. É muito prazeroso ver um título pronto e lançado, e melhor ainda é saber que algo que germinou como um lampejo em nossas mentes acaba por influenciar a vida alheia. Esperando que isso influencie, da mesma forma positiva em que fomos influenciados, naquele dia mágico em que, pela primeira vez, interagimos com um jogo digital.
“É complicado, mas vale a pena. Sustente o fogo: a vitória é certa.” (Almirante Barroso)
A era de ouro dos Indie Games
Os Indie Games estão mudando a história dos videogames. A facilidade de entrada no mercado e o enorme retorno financeiro que podem gerar nos mais de 500 mil Androids e iPhones no mercado, fazem com que esse estilo de games experimente um crescimento excepcional. A parte mais atrativa desse crescimento são as possibilidades de enriquecimento e as histórias de sucesso instantâneo que parecem ter criado uma nova “corrida do ouro”, na qual os game designers disputam o mercado no desejo de que sua ideia seja, literalmente, comprada pelas empresas.
Um exemplo de como o mercado dos Indie Games podem transformar uma empresa é o Draw Something, criado pela OMGPOP, que estava à beira da falência quando lançou o jogo, em fevereiro deste ano. O sucesso absurdo do jogo, que é uma espécie de Imagem & Ação para smartphones, chamou a atenção da Zynga, responsável por sucessos como Famville e Cityville. A bilionária produtora se interessou pelo jogo, que tinha alcançado a marca de 50 milhões de usuários, e comprou a OMGPOP por US$ 210 milhões. Dan Porter, dono da empresa, ficou tão feliz com a fortuna instantânea, que recontratou os antigos funcionários, demitidos quando a empresa estava à beira da falência, dando a eles uma parte do lucro.
O mais interessante dessa história é que o jogo é muito simples. Para jogar Draw Something, é necessário baixar o app em seu Android ou iOS e criar uma conta através do seu perfil no Facebook ou seu email. Depois basta convidar seus amigos e desenhar uma das três palavras sorteadas pelo jogo, de uma maneira que seu parceiro consiga respondê-la. A diferença entre o Draw Something e o Imagem & Ação é que ao contrário da versão física do jogo, na versão para smartphone você ganha pontos se seu adversário conseguir adivinhar o desenho. Com essa “disputa cooperativa”, fica mais fácil convidar os amigos para jogar, além é claro, de poder publicar os desenhos nas redes sociais.
Além desse, há diversos exemplos de jogos com conceitos aparentemente muito simples, mas que permitem aos jogadores uma experiência divertida e enriquecedora. Poderíamos citar vários exemplos de indie games que deram certo, como Minecraft, feito por um sueco chamado Markus Persson (o “Notch”), que já vendeu milhões de cópias e surgiu de poucos recursos e uma boa ideia. O jogo tem um conceito parecido com um balde de LEGO, só que com um visual que lembra jogos em 8 bit. O jogo não tem uma história linear, na qual a mão invisível do criador te empurra para um final inevitável. Não há quests ou objetivos, o que possibilita uma liberdade muito grande aos jogadores.
O sucesso de jogos como Draw Something e Minecraft mostram que o mercado em constante crescimento, facilitando a vida de quem desenvolve games independentes. Alumas pessoas estão chamando essa de “a Era de Ouro dos Indie Games”, devido aos fenômenos de vendas que cada vez mais saltam aos nossos olhos. Por isso, se você é desenvolvedor de games, programador, ou simplesmente tem uma grande ideia, esse é o momento ideial para concretizá-la.
Última semana para se tornar um testador Beta de Submundo II: Condenados
Esta é a última semana para se tornar um testador Beta de Submundo II
Condenados, jogo brasileiro de terror sendo desenvolvido pela empresa
independente Sultek Software, o jogo tem previsão de lançamento para o
3º trimestre de 2013 e já possui versões de demonstração.
Para se inscrever basta preencher o formulário encontrado no link: http://sulteksite.blogspot.com.br/2013/05/beta.html
Para se inscrever basta preencher o formulário encontrado no link: http://sulteksite.blogspot.com.br/2013/05/beta.html
Entendendo a JMonkey Engine
JMonkey Engine (jME) é um framework Open Source de alta performance para desenvolvimento de aplicações Java que utilzem recursos 3D. A primeira versão do framework foi criada por Mark Powell em 2003, enquanto pesquisava sobre o processo renderização utilizado em OpenGL.
A arquitetura do framework é baseada em grafos de cenas, ou seja, os dados do ambiente estão organizados em uma estrutura de árvore, onde um nodo origem pode ter um conjunto de nodos filhos. Estes nodos filhos, por sua vez, têm uma referência única de seu nodo de origem (também chamado nodo pai). Toda essa estrutura tem o objetivo de tornar o processo de renderização mais ágil.
Por exemplo, se construírmos um grafo de cena que representa um conjunto de móveis, que estão relacionados através de seu nodo pai, que é a sala, que por sua vez compartilham um andar, que estão localizados em um determinado edifício.O segredo para poupar recursos preciosos do sistema tornando esse sistema de renderização realmente eficiente está em um bom algoritmo para o sistema de câmeras. A câmera é o objeto que aponta, em um determinado ambiente 3D, para onde estamos focalizando (olhando) num determinado momento. Ela que decide quem deverá ser desenhado ou não, num determinado instante de tempo.
Se neste ambiente hierárquico bem definido, estivermos interessados em mostrar apenas um determinado andar, podemos facilmente descartar do processo de renderização todos os ramos do grafo que representam os outros andares, e por consequência, suas salas e seus móveis mostrando apenas o que realmente deve ser mostrado.
Knights of Pen & Paper será lançado no Steam
Nas paredes da Behold Studios, fundada em 2009 na cidade de Brasília, está impressa a frase:
Criamos os games que gostaríamos de jogar.E ao contrário do que você pode estar imaginando, não é um daqueles games educativos chatos que sempre vemos ganharem ‘fama’ no território nacional. ”Knights of Pen & Paper” é a melhor prova de que o slogan funciona, afinal, após 500 mil downloads nas plataformas iOS e Android, o agora famoso RPG está a caminho do PC (via Steam), Mac e Linux, chancelado pela publisher européia Paradox Interactive.
Como tudo começou
Como todo bom nerd, os integrantes da empresa, durante uma sessão de RPG de mesa, se deram conta de que, nenhum jogo digital lançado até o momento, se equiparava a “Dungeons & Dragons”, segundo os critérios deles. Foi aí quando tiveram sua epifania:
Somos desenvolvedores de jogos. Vamos criar nosso próprio game,
O visual pixelado e a música chip tune, foi uma idéia deles, visto que, RPGs tradicionas ‘de mesa’ estão relacionados as decadas de 80 e 90.
GAME DE TABULEIRO
“Knights of Pen & Paper” é um RPG clássico com influências de jogos de tabuleiro e do próprio RPG de mesa, jogado com dados, fichas de personagem de papel e um narrador que conduz o enredo.O jogo combina as tradicionais classes de RPG, como mago, paladino e ladrão, com personagens inusitados, como motoboy, nerd e hipster. O humor é presença constante nos diálogos do game, cujo enredo passa por vilas, cavernas e masmorras, em que as mais variadas missões podem ser cumpridas.
A começar pelo nome, “Knights of Pen & Paper”, é voltado para o mercado internacional. A originalidade, mesmo sob um gênero conhecido, fez o jogo obter sucesso lá fora e aparecer em muitos veículos especializados estrangeiros.
EUA, Canadá e Inglaterra são os responsáveis por mais de 60% dos downloads do game. O Brasil aparece em sexto lugar, atrás também de Austrália e Alemanha.
O foco está no mercado internacional. O público brasileiro, em geral, não consome muitos jogos independentes nacionais. O brasileiro compra muitos jogos, sim, mesmo com a pirataria, mas tende a optar pelos games ‘blockbusters‘,
Mudanças no PC
O lançamento da nova edição, intitulada Knights of Pen & Paper +1, ainda não tem data definida, mas chega em 2013.O game põe os jogadores no controle do dungeon master e de todos os outros personagens em aventuras tradicionais e bem humoradas. A versão atualizada inclui o game original com novas dungeons, monstros e itens. O Behold Studios também adicionou uma taverna que permite a troca de personagens, o que facilita a vida de quem não quer iniciar uma partida nova sempre que abrir um novo tipo de personagem.
O game já concorreu ao prêmio de Melhor Game Estudantil no Independent Games Festival, ao lado de Back to Bed, ATUM e Pulse.
Com lançamento programado para entre junho e setembro, “Knights” ainda não tem preço definido, mas uma coisa é certa: vai manter as microtransações, tal qual nas plataformas móveis.
No PC as novidades começam com ajustes finos que incluem a possibilidade de se locomover diretamente para onde se deseja ir (antes era preciso passar lugar por lugar até o destino final), e o recurso para trocar de personagens na Taverna, sem que seja preciso iniciar uma nova partida.
Porém, a maior boa nova fica mesmo por conta da adição de “dungeons“. Nessas masmorras há vários ambientes, nos quais é preciso circular para encontrar a chave que leva ao chefão. Cada sala funciona como um teste e costuma guardar itens valiosos para a jornada.
sexta-feira, 31 de maio de 2013
JAVA GAMES 2D::Exportando para *.jar::15
Olá pessoal!
Nesse tutorial mostrarei como exportar o nosso game para o formato *.jar
Runnable ("Executável"), uma coisa que iremos querer fazer após
terminarmos de desenvolver um game é gerar o executável para distribuir
para os nossos usuários/clientes!
Muito bem vamos lá!
Estarei aqui usando a IDE Eclipse para exportar o nosso game para *.jar <<download do Eclipse>>
o ideal quando estivermos desenvolvendo um game, é ter um projeto na
workspace somente para o jogo que estamos desenvolvendo, quando
estudamos o básico de java, aprendemos que o método main() é o método
principal, nossa aplicação começará a ser executada a partir do método
main(), normalmente em um projeto temos várias classes, ao exportarmos o
game, temos que informar em que classe está o método main(), observe a
figura abaixo (vamos exportar o game Snake)
Esse é um print de uma workspace minha, observe o projeto snake, dentro dele temos um pacote chamado game, e dentro do pacote game temos a classe Game.java que contem o método main(), então para começar a exportação faremos assim:
1- pressione o botão direto sobre o projeto snake e em seguida clique sobre "Export..." ou "Exportar...".
2- na janela que aparecerá clique em java e em seguida clique sobre Runnable JAR file, agora clique em Next ou Próximo.
3- agora em Launch configuration escolha o item que é [Nome da classe com método main]-[Nome do projeto] nome caso aqui é Game - Snake, em Library Handling (Biblioteca de manipulação), escolha Package required libraries into generated JAR (pacote exigido em bibliotecas JAR gerado.)
Agora em Export destination, escolha a pasta destino para onde
você deseja exportar o "executável" do seu game e dê um nome ao arquivo,
(eu estou salvando em minha área de trabalho com o nome Snake.jar).
4- para finarlizar clique em finish.
Muito simples não é? está ai o "executável" do nosso game, para que usa Ruindows
Windows basta clicar duas vezes sobre o arquivo para executar o game,
para quem usa alguma distro do Linux pode ser feito de uma das seguintes
formas: clicar com o botão direito sobre o arquivo e escolher "Abrir com Java(TM) Platform SE Binary" ou abrir o terminal entrar no diretório onde o arquivo está salvo e exucutar a seguinte linha de comando: sudo java -jar nome_do_arquivo.jar.
Observe como ficou o meu:
Obrigado por visitar o blog!
Não deixem de comentar ou postar duvidas aqui! Até o nosso próximo tutorial!
Os tutoriais seguintes serão uma série de jogos que iremos construir do começo ao fim, comentado linha por linha!
JAVA GAMES 2D::Menu::14
Olá pessoal!
Nesse tutorial iremos mostrar uma maneira de como construir um menu para os nossos games, além da classe Game.java que iremos criar no nosso pacote tutorial14 dentro do projeto JAVAGAMES2D iremos também criar um uma classe chamada Menu.java. então é o seguinte, na classe Menu.java, iremos definir como os nossos menus irá se comportar, e iramos criar um menu dentro Game.java.
No exemplo de hoje teremos três cenários, e um menu que nos levará para cada cenário(Jogar, Opções e Ajuda) e um item no menu para sair do game!
Observe com atenção a nossa classe Menu.java (Leia os comentários com atenção!)
Agora veja como criaremos o nosso menu dentro de Game.java, (leita os comentários com atenção!)
Super simples! não é?
Observem como ficou o meu:
Até o nosso próximo tutorial!
Abraços e não deixem de comentar...
Nesse tutorial iremos mostrar uma maneira de como construir um menu para os nossos games, além da classe Game.java que iremos criar no nosso pacote tutorial14 dentro do projeto JAVAGAMES2D iremos também criar um uma classe chamada Menu.java. então é o seguinte, na classe Menu.java, iremos definir como os nossos menus irá se comportar, e iramos criar um menu dentro Game.java.
No exemplo de hoje teremos três cenários, e um menu que nos levará para cada cenário(Jogar, Opções e Ajuda) e um item no menu para sair do game!
Observe com atenção a nossa classe Menu.java (Leia os comentários com atenção!)
1: import java.awt.Color;
2: import java.awt.Font;
3: import java.awt.Graphics;
4: import java.awt.event.KeyEvent;
5: import java.awt.image.BufferedImage;
6: public class Menu {
7: int cenario = -1; //ESSA VARIAVEL INDICA EM QUE CENÁRIO ESTAMOS, -1(NENHUM CENÁRIO) (0,1,2,3...N) OUTROS CENÁRIOS
8: int itemSelecionado = 0; //ESSA VARIAVEL SERVIRÁ PARA INDICAR QUAL ITEM QUE ESTÁ SELECIONADO (o atual é zero que é o primeiro item do menu)
9: String itens[]; //aqui vamos guardar os itens do nosso menu (jogar, opções, sair...etc)
10: Graphics bbg; //como nos outros métodos da classe game.java usamos essa varialvel para desenhar elementos na tela
11: boolean ativo; //indica se o menu está ativo ou não (ao inicar o jogo desativamos o menu, para o controlemos durante o jogo)
12: int x; //coordenada x do menu
13: int y; //coordenada y do menu
14: int tamanhoDaFonte = 20; //nem precisa explicar não é ?
15: int distanciaEntreItens = 15;//distância entre cada item do menu!
16: Font fonte = new Font("Arial", Font.BOLD, tamanhoDaFonte);//a fonte do nosso menu
17: Color corSelecionado = new Color(255, 0, 0); // COR VERMELHA para o item selecionado
18: Color corNaoSelecionado = new Color(0, 0, 0); // COR PRETA para o item que não está selecionado
19: //isso é o construtor ao criarmos o objeto do tipo Menu, teremos que informar o número de itens as coordenadas e se ele estará ativo ou não!
20: public Menu(int numeroDeItens, int x, int y, boolean ativo) {
21: itens = new String[numeroDeItens];
22: this.x = x;
23: this.y = y;
24: this.ativo = ativo;
25: }
26: //esse metodo só chamará o método controlaMenu se ele estiver ativo!
27: public void controlar(KeyEvent e) {
28: if (ativo) {
29: controlarMenu(e);
30: }
31: }
32: //esse método nos fará retornar ao menu ao pressinarmos "Esc"
33: public void voltarAoMenu(KeyEvent e){
34: //se tecla pressionada for igual a "Esc"
35: if(e.getKeyCode() == e.VK_ESCAPE){
36: cenario = -1; //com isso sai dos cenários em que estivermos...
37: ativo = true; //e reativa o menu para que o possamos controlar novamente...
38: }
39: }
40: //esse método controlará o nosso menu através do teclado
41: //ele é chamando dentro do método controla()
42: private void controlarMenu(KeyEvent e) {
43: //se pressionar a tecla "cima" diminui 1 em itemSelecionado
44: if (e.getKeyCode() == e.VK_UP) {
45: itemSelecionado -= 1;
46: }
47: //se pressionar a tecla "baixo" aumenta 1 em itemSelecionado
48: if (e.getKeyCode() == e.VK_DOWN) {
49: itemSelecionado += 1;
50: }
51: //isso aqui é para controlar os limites extrmos do menu
52: //caso eu esteja com 1º item selecionado e pressione para cima, ele vai para a ultima opção
53: //caso eu esteja com o ultimo item selecionado e pressione para baixo, ele vai para primeira opção
54: if (itemSelecionado >= itens.length) {
55: itemSelecionado = 0;
56: }
57: if (itemSelecionado < 0) {
58: itemSelecionado = itens.length - 1;
59: }
60: //se pressionar a tecla Enter ele muda o valor de cenario para o item que está selecionado
61: //isso fará mudar de cenário e desativará o menu para que ele não seja mais controlado!
62: if(e.getKeyCode() == e.VK_ENTER){
63: cenario = itemSelecionado;
64: ativo = false;
65: }
66: }
67: //esse método irá desenhar o nosso menu na tela!
68: //a um loop (for) que irá listar todos os itens que está guardado em itens[]
69: //um calculo é feito para a coordenada y de cada intem do nosso menu, para que eles fiquem
70: //um distante do outro, então caso y = 10, o item 0 será: 10+(0*(20+15)) = 10
71: //para o item 1 será: 10+(1*(20+15)) = 45
72: //para o item 2 será: 10+(2*(20+15)) = 80
73: //para o item 3 será: 10+(3*(20+15)) = 115, e assim por diante...
74: public void desenharMenu() {
75: bbg.setFont(fonte);//seta a fonte que definimos bem acima na declaração de variáveis
76: for (int i = 0; i < itens.length; i++) {// aqui é o inicio do nosso loop
77: if(itemSelecionado == i){//se ele estiver selecionado muda a cor para vermelho e desenha o item na tela
78: bbg.setColor(corSelecionado);
79: bbg.drawString(itens[i], x, y+(i*(tamanhoDaFonte+distanciaEntreItens)));
80: }else{//se não estiver selecionado muda a cor para preto e desenha o item na tela
81: bbg.setColor(corNaoSelecionado);
82: bbg.drawString(itens[i], x, y+(i*(tamanhoDaFonte+distanciaEntreItens)));
83: }
84: }
85: }
86: }
Agora veja como criaremos o nosso menu dentro de Game.java, (leita os comentários com atenção!)
1: import java.awt.*;
2: import java.awt.event.KeyEvent;
3: import java.awt.event.KeyListener;
4: import java.awt.image.BufferedImage;
5: import java.io.File;
6: import javax.swing.ImageIcon;
7: import javax.swing.JFrame;
8: public class Game extends JFrame implements KeyListener{
9: BufferedImage backBuffer;
10: int FPS = 30;
11: int janelaW = 500;
12: int janelaH = 500;
13: //AQUI DECLARAMOS O NOSSO MENU COM:
14: //4 itens, coordenadas x e y = 100, a ativo = true
15: //agora olhe esse método abaixo cenarios()
16: Menu menuPrincipal = new Menu(4, 100, 100, true);
17: //esse método vai desenhar na tela alguns possíveis cenários do nosso game
18: //lá em Menu.java cenario foi definido como -1
19: //se cenario == 0 muda a cor do fundo e mostra um texto
20: //se cenario == 1 muda a cor do fundo e mostra um texto
21: //se cenario == n muda a cor do fundo e mostra um texto...
22: //agora obser o nosso método desenharGraficos()
23: public void cenarios(){
24: Graphics bbg = backBuffer.getGraphics();
25: bbg.setFont(new Font("Arial",Font.BOLD,20));
26: if(menuPrincipal.cenario == 0){
27: bbg.setColor(new Color(255,100,100));
28: bbg.fillRect(0, 0, janelaW, janelaH);
29: bbg.setColor(Color.BLACK);
30: bbg.drawString("Você escolheu Jogar", 100, 200);
31: //aqui você pode escolher o que irá aparecer caso o usuario escolha essa item do menu!
32: }
33: if(menuPrincipal.cenario == 1){
34: bbg.setColor(new Color(100,255,100));
35: bbg.fillRect(0, 0, janelaW, janelaH);
36: bbg.setColor(Color.BLACK);
37: bbg.drawString("Você escolheu Opções", 100, 200);
38: }
39: if(menuPrincipal.cenario == 2){
40: bbg.setColor(new Color(100,100,255));
41: bbg.fillRect(0, 0, janelaW, janelaH);
42: bbg.setColor(Color.BLACK);
43: bbg.drawString("Você escolheu Ajuda", 100, 200);
44: }
45: if(menuPrincipal.cenario == 3){
46: System.exit(0);//esse comando fecha o nosso game!
47: }
48: }
49: public void atualizar() {
50: }
51: public void desenharGraficos() {
52: Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI
53: Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...
54: bbg.setColor(Color.WHITE);
55: bbg.fillRect(0, 0, janelaW, janelaH); //PINTA O FUNDO COM UM QUADRADO BRANCO
56: menuPrincipal.desenharMenu();//isso desenhará nosso menu
57: cenarios();//isso irá desenhar os cenários que escolhermos no menu
58: //agora observe o método inicializar()
59: //==================================================================================
60: g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!
61: }
62: public void inicializar() {
63: setTitle("Titulo do Jogo!");
64: setSize(janelaW, janelaH);
65: setResizable(false);
66: setDefaultCloseOperation(EXIT_ON_CLOSE);
67: setLayout(null);
68: setVisible(true);
69: backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
70: //AQUI ESTAMOS ADICIONANDO UM ESCUTADOR DE TECLAS
71: addKeyListener(this);
72: //aqui definimos o texto de cada item do nosso menu
73: menuPrincipal.itens[0] = "Jogar";
74: menuPrincipal.itens[1] = "Opções";
75: menuPrincipal.itens[2] = "Ajuda";
76: menuPrincipal.itens[3] = "Sair";
77: //aqui fazemos o método desenhaMenu() que fica lá em Menu.java
78: //desenhar no nosso buffer
79: //.. agora para finalizar observe o método de evento keyPressed() mais abaixo...
80: menuPrincipal.bbg = backBuffer.getGraphics();
81: }
82: public void run() {
83: inicializar();
84: while (true) {
85: atualizar();
86: desenharGraficos();
87: try {
88: Thread.sleep(1000/FPS);
89: } catch (Exception e) {
90: System.out.println("Thread interrompida!");
91: }
92: }
93: }
94: public static void main(String[] args) {
95: Game game = new Game();
96: game.run();
97: }
98: public void keyPressed(KeyEvent e) {
99: //aqui, chamamos os métodos que irá controlar o menu pelo teclado
100: menuPrincipal.controlar(e);//esse controla o menu
101: menuPrincipal.voltarAoMenu(e);//esse faz voltar para o menu quando pressionarmos "Esc"
102: }
103: public void keyReleased(KeyEvent e) {
104: }
105: public void keyTyped(KeyEvent e) {
106: }
107: }
Super simples! não é?
Observem como ficou o meu:
Até o nosso próximo tutorial!
Abraços e não deixem de comentar...
JAVA GAMES 2D::Eventos do Mouse::13
Olá pessoal!
Lembrem de adicionar a implementação dos métodos dessas interfaces, observem que podemos implementar quantas interfaces quisermos, bastando apenas separar por virgula, então é possível usar eventos de teclado e mouse num mesmo jogo...
Agora veja os método que serão implementados no final da Classe Game.java:
Recomendo apagar esses comentários gerados (caso você tenha mandado gerar automaticamente), Muito bem... vamos lá....
Os métodos mouseMoved() e mouseDragged() são da interface MouseMotionsListener, e os outros métodos são de MouseListener, bem... vejamos para quê serve cada um desses eventos:
mouseMoved(): é acionado todo vez que você mover o mouse.
mouseDragged(): é acionado toda vez que você clica segura e arrasta.
mouseReleased(): é acionado quando você libera o clique.
mousePressed(): é acionado no momento em quê o clique é pressionado e mantamos pressionado.
mouseExited(): é acionado quando o cursor é retirado de cima de um elemento.
mouseEntered(): é acionado quando o cursor ficar sobre um elemento.
mouseClicked(): é acionando quando clicamos com o mouse.
Agora a próxima etapa é adicionar um escutador para esses eventos no nosso JFrame dentro do método inicializar(), se não adicionarmos esses escutadores nenhum desses métodos serão executados quando os eventos forem acionados (lembrando, o escutador é que manda executar esses métodos quando o evento for acionado).
Observe o código abaixo:
Muito simples! não é?
Agora vamos ver um exemplo de uso de eventos do mouse, no nosso exemplo iremos mover uma mira, exibir as coordenadas do cursor no JFrame e quando clicarmos exibir uma mensagem!
(LEIAM OS COMENTÁRIOS DO CÓDIGO COM ATENÇÃO)
Veja como ficou:
Muito simples não é ?
Até o próximo tutorial!!! não deixem de comentar ou tirar duvidas! (assim que dé, respondo!!!)
Nesse tutorial iremos aprender uma das maneiras de como usar os Eventos
do Mouse, é muito semelhante ao tutorial anterior de Eventos do
Teclado, para o nosso tutorial de hoje utilizaremos duas Interfaces: MouseListener e MouseMotionListener.
(Criem um pacote tutorial13 no nosso projeto JAVAGAMES2D com o arquivo Game.java)
Muito bem....Vamos lá!
A primeira coisa a ser feita é implementar as interfaces na nossa Classe Game.java
1: public class Game extends JFrame implements MouseListener, MouseMotionListener{
Lembrem de adicionar a implementação dos métodos dessas interfaces, observem que podemos implementar quantas interfaces quisermos, bastando apenas separar por virgula, então é possível usar eventos de teclado e mouse num mesmo jogo...
Agora veja os método que serão implementados no final da Classe Game.java:
1: @Override
2: public void mouseClicked(MouseEvent e) {
3: // TODO Auto-generated method stub
4: }
5: @Override
6: public void mouseEntered(MouseEvent e) {
7: // TODO Auto-generated method stub
8: }
9: @Override
10: public void mouseExited(MouseEvent e) {
11: // TODO Auto-generated method stub
12: }
13: @Override
14: public void mousePressed(MouseEvent e) {
15: // TODO Auto-generated method stub
16: }
17: @Override
18: public void mouseReleased(MouseEvent e) {
19: // TODO Auto-generated method stub
20: }
21: @Override
22: public void mouseDragged(MouseEvent e) {
23: // TODO Auto-generated method stub
24: }
25: @Override
26: public void mouseMoved(MouseEvent e) {
27: // TODO Auto-generated method stub
28: }
Recomendo apagar esses comentários gerados (caso você tenha mandado gerar automaticamente), Muito bem... vamos lá....
Os métodos mouseMoved() e mouseDragged() são da interface MouseMotionsListener, e os outros métodos são de MouseListener, bem... vejamos para quê serve cada um desses eventos:
mouseMoved(): é acionado todo vez que você mover o mouse.
mouseDragged(): é acionado toda vez que você clica segura e arrasta.
mouseReleased(): é acionado quando você libera o clique.
mousePressed(): é acionado no momento em quê o clique é pressionado e mantamos pressionado.
mouseExited(): é acionado quando o cursor é retirado de cima de um elemento.
mouseEntered(): é acionado quando o cursor ficar sobre um elemento.
mouseClicked(): é acionando quando clicamos com o mouse.
Agora a próxima etapa é adicionar um escutador para esses eventos no nosso JFrame dentro do método inicializar(), se não adicionarmos esses escutadores nenhum desses métodos serão executados quando os eventos forem acionados (lembrando, o escutador é que manda executar esses métodos quando o evento for acionado).
Observe o código abaixo:
1: public void inicializar() {
2: setTitle("Titulo do Jogo!");
3: setSize(janelaW, janelaH);
4: setResizable(false);
5: setDefaultCloseOperation(EXIT_ON_CLOSE);
6: setLayout(null);
7: setVisible(true);
8: backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
9: //AQUI ESTAMOS ADICIONANDO OS ESCUTADORES DE EVENTOS DO MOUSE
10: addMouseListener(this);
11: addMouseMotionListener(this);
12: }
Muito simples! não é?
Agora vamos ver um exemplo de uso de eventos do mouse, no nosso exemplo iremos mover uma mira, exibir as coordenadas do cursor no JFrame e quando clicarmos exibir uma mensagem!
(LEIAM OS COMENTÁRIOS DO CÓDIGO COM ATENÇÃO)
1: import java.awt.*;
2: import java.awt.event.KeyEvent;
3: import java.awt.event.KeyListener;
4: import java.awt.event.MouseEvent;
5: import java.awt.event.MouseListener;
6: import java.awt.event.MouseMotionListener;
7: import java.awt.image.BufferedImage;
8: import java.io.File;
9: import javax.swing.ImageIcon;
10: import javax.swing.JFrame;
11: import javax.swing.JOptionPane;
12: public class Game extends JFrame implements MouseListener, MouseMotionListener{
13: BufferedImage backBuffer;
14: int FPS = 30;
15: int janelaW = 500;
16: int janelaH = 500;
17: //VARIAVEIS QUE VAMOS UTILIZAR
18: //UMA IMAGEM PARA REPRESENTAR A MIRA
19: //E AS SUAS COORDENADAS X e Y
20: //NÃO SE ESQUEÇA DE OLHAR O MÉTODO desenharGraficos()
21: //e os métodos de eventos que é onde iremos tratar algumas coisas
22: ImageIcon mira = new ImageIcon("src/tutor13/mira.png");
23: int xMira;
24: int yMira;
25: public void atualizar() {
26: }
27: public void desenharGraficos() {
28: Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI
29: Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...
30: bbg.setColor(Color.WHITE);
31: bbg.fillRect(0, 0, janelaW, janelaH); //PINTA O FUNDO COM UM QUADRADO BRANCO
32: bbg.setColor(Color.RED);
33: bbg.setFont(new Font("helvica",Font.BOLD,20));
34: bbg.drawString("X=: "+xMira+" Y="+yMira, 50, 100); //EXIBE UM TEXTO + O VALOR DA TECLA PRESSIONADA
35: //QUE ESTÁ NA VARIÁVEL teclaPressionada
36: //AQUI DESENHAMOS A MIRA, O -25 É PARA FICAR CENTRALIZADA COM O CURSOR
37: bbg.drawImage(mira.getImage(), xMira-25, yMira-25, this);
38: //==================================================================================
39: g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!
40: }
41: public void inicializar() {
42: setTitle("Titulo do Jogo!");
43: setSize(janelaW, janelaH);
44: setResizable(false);
45: setDefaultCloseOperation(EXIT_ON_CLOSE);
46: setLayout(null);
47: setVisible(true);
48: backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
49: //AQUI ESTAMOS ADICIONANDO OS ESCUTADORES DE EVENTOS DO MOUSE
50: addMouseListener(this);
51: addMouseMotionListener(this);
52: }
53: public void run() {
54: inicializar();
55: while (true) {
56: atualizar();
57: desenharGraficos();
58: try {
59: Thread.sleep(1000/FPS);
60: } catch (Exception e) {
61: System.out.println("Thread interrompida!");
62: }
63: }
64: }
65: public static void main(String[] args) {
66: Game game = new Game();
67: game.run();
68: }
69: public void mouseClicked(MouseEvent e) {
70: JOptionPane.showMessageDialog(null, "Você clicou!!!!");
71: }
72: public void mouseEntered(MouseEvent e) {
73: }
74: public void mouseExited(MouseEvent e) {
75: }
76: public void mousePressed(MouseEvent e) {
77: }
78: public void mouseReleased(MouseEvent e) {
79: }
80: public void mouseDragged(MouseEvent e) {
81: }
82: public void mouseMoved(MouseEvent e) {
83: //AQUI X e Y DA MIRA RECEBE AS COORDENADAS DO CURSOR
84: xMira = e.getX();
85: yMira = e.getY();
86: }
87: }
Veja como ficou:
Muito simples não é ?
Até o próximo tutorial!!! não deixem de comentar ou tirar duvidas! (assim que dé, respondo!!!)
JAVA GAMES 2D::Eventos do Teclado::12
Olá pessoal!
Quando fizer isso salve as alterações, como eu uso o Eclipse ele vai acusar um erro, informando que eu preciso adicionar a implementação dos métodos da interface Keylistner, observe a figura abaixo:
agora vamos usar um truque do Eclipse, observe o x vermelho antes de public class, dê um clique sobre esse ícone, que irá aparecer o seguinte:
Agora basta dar um duplo clique em Add unimplmented methods, para que o Eclipse adicione automaticamente essas linhas de código no final da classe Game.java
... O que temos ai é o seguinte: três métodos sem retorno (void), que recebe um parâmetro do tipo KeyEvent, (caso queiram apaguem esses comentários gerado pelo Eclipse)
//TODO Auto-generated method stub
@Override
Agora para finalizar vamos adicionar no nosso método inicializar() o escutador de teclas que é que vai acionar esses três métodos que foram criados toda vez que um evento de teclado for acionado!
Falando brevemente sobre os três métodos criados:
O keyPressed é acionado no momento em que você pressiona a tecla e enquanto ela estiver pressionada
O keyReleased é acionado no momento em que você libera a tecla pressionada
O keyTyped é acionado toda vez que o usuário digitar um caractere em algum elemento que está com o foco!
Muito bem.... agora vamos ver um um bom exemplo, vamos exibir a tecla que o usuário pressionou e mover uma bola com as teclas direcionais....
(Leia os comentários com atenção!)
Muito bem.... vejam como ficou o meu:
Então é isso.... até o próximo tutorial, não deixem de comentar ou postar suas dúvidas aqui....
Nesse tutorial vamos mostrar uma maneira de como usar eventos do teclado
para controlar algumas ações nos nossos jogos. é realmente muito
simples fazer isso! tudo que iremos fazer é implementar uma Interface na nossa classe, reescrever os métodos abstratos dessa interface, e adicionar um escutador de teclas no nosso JFrame!
(Criem um pacote tutorial12 no nosso projeto JAVAGAMES2D com o arquivo Game.java)
(Criem um pacote tutorial12 no nosso projeto JAVAGAMES2D com o arquivo Game.java)
Vamos lá!
1º passo implemente na Classe Game.java a seguinte Interface: KeyListiner
1
| public class Game extends JFrame implements KeyListener{ |
Quando fizer isso salve as alterações, como eu uso o Eclipse ele vai acusar um erro, informando que eu preciso adicionar a implementação dos métodos da interface Keylistner, observe a figura abaixo:
agora vamos usar um truque do Eclipse, observe o x vermelho antes de public class, dê um clique sobre esse ícone, que irá aparecer o seguinte:
Agora basta dar um duplo clique em Add unimplmented methods, para que o Eclipse adicione automaticamente essas linhas de código no final da classe Game.java
1: @Override
2: public void keyPressed(KeyEvent e) {
3: // TODO Auto-generated method stub
4: }
5: @Override
6: public void keyReleased(KeyEvent e) {
7: // TODO Auto-generated method stub
8: }
9: @Override
10: public void keyTyped(KeyEvent e) {
11: // TODO Auto-generated method stub
12: }
... O que temos ai é o seguinte: três métodos sem retorno (void), que recebe um parâmetro do tipo KeyEvent, (caso queiram apaguem esses comentários gerado pelo Eclipse)
//TODO Auto-generated method stub
@Override
Agora para finalizar vamos adicionar no nosso método inicializar() o escutador de teclas que é que vai acionar esses três métodos que foram criados toda vez que um evento de teclado for acionado!
1: public void inicializar() {
2: setTitle("Titulo do Jogo!");
3: setSize(janelaW, janelaH);
4: setResizable(false);
5: setDefaultCloseOperation(EXIT_ON_CLOSE);
6: setLayout(null);
7: setVisible(true);
8: backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
9: //AQUI ESTAMOS ADICIONANDO UM ESCUTADOR DE TECLAS
10: addKeyListener(this);
11: }
Falando brevemente sobre os três métodos criados:
O keyPressed é acionado no momento em que você pressiona a tecla e enquanto ela estiver pressionada
O keyReleased é acionado no momento em que você libera a tecla pressionada
O keyTyped é acionado toda vez que o usuário digitar um caractere em algum elemento que está com o foco!
Muito bem.... agora vamos ver um um bom exemplo, vamos exibir a tecla que o usuário pressionou e mover uma bola com as teclas direcionais....
(Leia os comentários com atenção!)
1: import java.awt.*;
2: import java.awt.event.KeyEvent;
3: import java.awt.event.KeyListener;
4: import java.awt.image.BufferedImage;
5: import java.io.File;
6: import javax.swing.ImageIcon;
7: import javax.swing.JFrame;
8: public class Game extends JFrame implements KeyListener{
9: BufferedImage backBuffer;
10: int FPS = 30;
11: int janelaW = 500;
12: int janelaH = 500;
13: //VAMOS EXIBIR A TECLA PRESSIONADA
14: //E MOVER UMA BOLA COM AS DIRECIONAIS
15: //OBSER ISSO LÁ NO MÉTODO desenaharGraficos()
16: char teclaPressionada;
17: int xBola = 200;
18: int yBola = 200;
19: public void atualizar() {
20: }
21: public void desenharGraficos() {
22: Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI
23: Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...
24: bbg.setColor(Color.WHITE);
25: bbg.fillRect(0, 0, janelaW, janelaH); //PINTA O FUNDO COM UM QUADRADO BRANCO
26: bbg.setColor(Color.RED);
27: bbg.setFont(new Font("helvica",Font.BOLD,20));
28: bbg.drawString("Você pressionou: "+teclaPressionada, 50, 100); //EXIBE UM TEXTO + O VALOR DA TECLA PRESSIONADA
29: //QUE ESTÁ NA VARIÁVEL teclaPressionada
30: //DESENHA UMA BOLA VERMELHA NA TELA
31: bbg.fillOval(xBola, yBola, 50, 50);
32: //AGORA VEJA O CÓDIGO DO MÉTODO keyPressed()
33: //LÁ VAMOS DIZER O QUE VAI ACONTECER QUANDO UM TECLA FOR PRESSIONADA!!!
34: //==================================================================================
35: g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!
36: }
37: public void inicializar() {
38: setTitle("Titulo do Jogo!");
39: setSize(janelaW, janelaH);
40: setResizable(false);
41: setDefaultCloseOperation(EXIT_ON_CLOSE);
42: setLayout(null);
43: setVisible(true);
44: backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
45: //AQUI ESTAMOS ADICIONANDO UM ESCUTADOR DE TECLAS
46: addKeyListener(this);
47: }
48: public void run() {
49: inicializar();
50: while (true) {
51: atualizar();
52: desenharGraficos();
53: try {
54: Thread.sleep(1000/FPS);
55: } catch (Exception e) {
56: System.out.println("Thread interrompida!");
57: }
58: }
59: }
60: public static void main(String[] args) {
61: Game game = new Game();
62: game.run();
63: }
64: //ESSES SÃO OS MÉTODOS DE EVENTOS DO TECLADO
65: public void keyPressed(KeyEvent e) {
66: //AQUI A VARIAVEL VAI RECEBER O VALOR UNICODE DA TECLA QUE O USUÁRIO PRESSIONAR!!!
67: teclaPressionada = e.getKeyChar();
68: //OBS: e.VK_ depois pressione ctrl+espaço para autocompletar!
69: //ai tem todas as teclas do teclado!!!
70: //SE A TECLA PRESSIONADA FOR LEFT = ESQUERDA xBola diminue 10
71: if(e.getKeyCode() == e.VK_LEFT){
72: xBola -= 10;
73: }
74: //SE A TECLA PRESSIONADA FOR RIGHT = DIREITA xBola aumenta 10
75: if(e.getKeyCode() == e.VK_RIGHT){
76: xBola += 10;
77: }
78: //SE A TECLA PRESSIONADA FOR UP = CIMA yBola diminue 10
79: if(e.getKeyCode() == e.VK_UP){
80: yBola -= 10;
81: }
82: //SE A TECLA PRESSIONADA FOR DOWN = BAIXO yBola aumenta 10
83: if(e.getKeyCode() == e.VK_DOWN){
84: yBola += 10;
85: }
86: }//FIM DO MÉTODO keyPressed()
87: public void keyReleased(KeyEvent e) {
88: }
89: public void keyTyped(KeyEvent e) {
90: }
91: }
Muito bem.... vejam como ficou o meu:
Então é isso.... até o próximo tutorial, não deixem de comentar ou postar suas dúvidas aqui....
JAVA GAMES 2D::Colisão II::11
Olá pessoal!
Esse método trada de verificar a colisão de um único ponto!, etão você pode traçar quantos pontos imaginários quiser e verificar se o mesmo está colidindo em algum objeto!
colisao(x, y, x2, y2, w, h);
Abaixo segue o nosso exemplo do tutorial de hoje:
(leiam atentamente os comentários do código!)
Muito simples não é pessoal ?
Vejam como ficou o meu:
Muito bem!!!.... até o próximo tutorial!!!
No tutorial anterior vimos uma maneira de como verificar uma colisão
simples. Nesse tutorial de hoje veremos uma outra forma de verificar se
um objeto colidiu com outro, no método anterior não era apenas informado
de que houve uma colisão, mas não era informado de qual lado do objeto
que estava sendo colidido! Então sabendo qual lado do objeto está sendo
tocado, é possível mandar o nosso objeto se comportar de uma maneira
dependendo de onde ele foi tocado. Imagine um jogo de Corrida de Carros,
caso o carro bata a sua lateral numa parede na pista, ele deve ser
empurrado na direção oposta!
Muito bem.... então vamos ao que interessa: como é essa tal técnica?
(ah lembrando que: o que tá sendo postado aqui, não são técnicas
oficiais padrão! é a forma como eu faço e acho mais simples e funciona!
pode ser feito diversas maneiras diferente! essa é epenas uma mera
sugestão!)
A técnica é a seguinte: como no tutorial anterior nos iremos traçar os
pontos(pontos imaginários... tá lá mais não tá!!!) de colisão no nosso
objeto, ah! você pode traçar quantos pontos de colisão você quiser!
dependendo do que se pretende fazer! ao ao colidir com com determinado
ponto nosso objeto pode se comportar de uma maneira diferente!
Observe a imagem abaixo (ah! essas imagens são produzidas no Inkscape!
sugiro estuda-las para usar na confecção do design dos seus games!)
Agora observe como o nosso código de colisão é simples, ele irá tratar de verificar a colisão de um único ponto!
1
2
3
4
5
6
7
| public boolean colisao( int pontoX, int pontoY, int x, int y, int w, int h) { if ((pontoX >= x && pontoX <= x + w) && (pontoY >= y && pontoY <= y + h)) { return true ; } else { return false ; } } |
Esse método trada de verificar a colisão de um único ponto!, etão você pode traçar quantos pontos imaginários quiser e verificar se o mesmo está colidindo em algum objeto!
colisao(x, y, x2, y2, w, h);
Abaixo segue o nosso exemplo do tutorial de hoje:
1: import java.awt.*;
2: import java.awt.image.BufferedImage;
3: import java.io.File;
4: import javax.swing.ImageIcon;
5: import javax.swing.JFrame;
6: public class Game extends JFrame {
7: BufferedImage backBuffer;
8: int FPS = 30;
9: int janelaW = 500;
10: int janelaH = 500;
11: // --------------------------------------------------------------------
12: // OBSERVEM ESSAS VÁRIÁVEIS (ISSO PODERIA SER ATRIBUTOS DE UMA CLASSE!)
13: // --------------------------------------------------------------------
14: int obj1X = 0; // COORDENADA X
15: int obj1Y = 225; // COORDENADA Y
16: int obj1W = 50; // LARGURA = Width
17: int obj1H = 50; // ALTURA = Height
18: boolean colidiuEsquerda = false;
19: boolean colidiuDireita = false;
20: boolean colidiuCima = false;
21: boolean colidiuBaixo = false;
22: int obj2X = 400;
23: int obj2Y = 200;
24: int obj2W = 50;
25: int obj2H = 50;
26: // --------------------------------------------------------------------
27: // ESSE MÉTODO VAI MOVER O OBJETO ATÉ A COORDENADA X = 500
28: // PARA QUE ELE TOQUE O OBJETO 2
29: // E A CADA VEZ QUE ELE CHEGAR NO FINAL DA TELA, VOLTA PRA O COMEÇO
30: // EM COM UMA NOVA COORDENADA Y ALEATÓRIA!!!
31: // --------------------------------------------------------------------
32: public void moveObjeto1() {
33: obj1X += 5;
34: if (obj1X > 500) {
35: obj1X = 0;
36: obj1Y = (int)(Math.random()*100)+150;
37: }
38: }
39: // --------------------------------------------------------------------
40: // SE O OBJETO COLEDIR EM UM DOS PONTOS, EXIBIRÁ UM TEXTO DIZENDO QUAL FOI TOCADO
41: // ESSE MÉTODO VAI SER CHAMANDO LÁ NO DENTRO DO MÉTODO desenharGraficos()
42: // --------------------------------------------------------------------
43: public void exibeTexto() {
44: Graphics bbg = backBuffer.getGraphics();
45: bbg.setColor(Color.RED);
46: if (colidiuEsquerda) {
47: bbg.drawString("COLISÃO: ESQUERDA!!!", 200, 110);
48: }
49: if (colidiuDireita) {
50: bbg.drawString("COLISÃO: DIREITA!!!", 200, 120);
51: }
52: if (colidiuCima) {
53: bbg.drawString("COLISÃO: CIMA!!!", 200, 130);
54: }
55: if (colidiuBaixo) {
56: bbg.drawString("COLISÃO: BAIXO!!!", 200, 140);
57: }
58: }
59: // --------------------------------------------------------------------
60: // ESSE É O NOSSO MÉTODO QUE VAI TRATAR A COLISÃO DE APENAS UM PONTO
61: // ESSE MÉTODO RECEBE COMO ARGUMENTO: X, Y DO PONTO E
62: //X,Y,W,H DO OBJETO ONDE VAI COLIDIR!
63: // --------------------------------------------------------------------
64: public boolean colisao(int pontoX, int pontoY, int x, int y, int w, int h) {
65: if ((pontoX >= x && pontoX <= x + w) && (pontoY >= y && pontoY <= y + h)) {
66: return true;
67: } else {
68: return false;
69: }
70: }
71: // --------------------------------------------------------------------
72: public void atualizar() {
73: //AQUI VAMOS VERIFICAR SE CADA PONTO ESTÁ SENDO TOCADO NO OBJETO 2
74: colidiuEsquerda = colisao(obj1X, obj1Y+obj1H/2, obj2X, obj2Y, obj2W, obj2H);
75: colidiuDireita = colisao(obj1X+obj1W, obj1Y+obj1H/2, obj2X, obj2Y, obj2W, obj2H);
76: colidiuCima = colisao(obj1X+obj1W/2, obj1Y, obj2X, obj2Y, obj2W, obj2H);
77: colidiuBaixo = colisao(obj1X+obj1W/2, obj1Y+obj1H, obj2X, obj2Y, obj2W, obj2H);
78: moveObjeto1();
79: }
80: public void desenharGraficos() {
81: Graphics g = getGraphics(); // ISSO JÁ ESTAVA AQUI
82: Graphics bbg = backBuffer.getGraphics();// ISSO TAMBÉM JÁ ESTAVA AQUI...
83: // ==================================================================================
84: bbg.setColor(Color.WHITE);
85: bbg.fillRect(0, 0, janelaW, janelaH);// DESENHA UM FUNDO BRANCO NA TELA!
86: // EXIBE UM TEXTO CASO O OBJETO COLIDA!
87: exibeTexto();
88: // DESENHA O OBJETO 2
89: bbg.setColor(Color.BLUE);
90: bbg.fillRect(obj2X, obj2Y, obj2W, obj2H);
91: // DESENHA O OBJETO 1 //com transparência
92: // new Color(red,green, blue, alpha) o alpha é o valor da trasnparência
93: // vai de 0 à 255
94: bbg.setColor(new Color(0, 255, 0, 200));
95: bbg.fillRect(obj1X, obj1Y, obj1W, obj1H);
96: // ==================================================================================
97: g.drawImage(backBuffer, 0, 0, this);// OBS: ISSO DEVE FICAR SEMPRE NO
98: // FINAL!
99: }
100: public void inicializar() {
101: setTitle("Tutorial 11 Colisão!");
102: setSize(janelaW, janelaH);
103: setResizable(false);
104: setDefaultCloseOperation(EXIT_ON_CLOSE);
105: setLayout(null);
106: setVisible(true);
107: backBuffer = new BufferedImage(janelaW, janelaH,
108: BufferedImage.TYPE_INT_RGB);
109: }
110: public void run() {
111: inicializar();
112: while (true) {
113: atualizar();
114: desenharGraficos();
115: try {
116: Thread.sleep(1000 / FPS);
117: } catch (Exception e) {
118: System.out.println("Thread interrompida!");
119: }
120: }
121: }
122: public static void main(String[] args) {
123: Game game = new Game();
124: game.run();
125: }
126: }
(leiam atentamente os comentários do código!)
Muito simples não é pessoal ?
Vejam como ficou o meu:
Muito bem!!!.... até o próximo tutorial!!!
JAVA GAMES 2D::Colisão I::10
Olá pessoal!
Vamos ver uma maneira de verificar essas colisões com um único método! então vamos lá! crie um pacote chamado tutorial10 no nosso projeto JAVAGAMES2D, e cole no pacote o nosso template pra jogos Game.java!
Agora observe o código abaixo (leita atentamente os comentários no código):
Muito bem... Agora vamos entender o método colisão que é o que está menos comentado no nosso código acima....
Observe a seguinte imagem:
Então perceba que se um dos nossos pontos invadir o outro objeto, o nosso método irá retornar TRUE
No tutorial de hoje iremos ver uma maneira de como testar uma colisão
simples entre dois objetos! existe várias formas de testar uma colisão
como: verificar se o objeto tocou a extremidade do outro, verificar se
eles estão se intersectando, ou se ambos tem a mesma coordenada X e , e
após constatar a colisão iremos dizer como esses objetos irão se
comportar durante a colisão!
Agora observe o código abaixo (leita atentamente os comentários no código):
1: import java.awt.*;
2: import java.awt.image.BufferedImage;
3: import java.io.File;
4: import javax.swing.ImageIcon;
5: import javax.swing.JFrame;
6: public class Game extends JFrame {
7: BufferedImage backBuffer;
8: int FPS = 30;
9: int janelaW = 500;
10: int janelaH = 500;
11: // --------------------------------------------------------------------
12: // OBSERVEM ESSAS VÁRIÁVEIS (ISSO PODERIA SER ATRIBUTOS DE UMA CLASSE!)
13: // --------------------------------------------------------------------
14: int obj1X = 0; // COORDENADA X
15: int obj1Y = 225; // COORDENADA Y
16: int obj1W = 50; // LARGURA = Width
17: int obj1H = 50; // ALTURA = Height
18: boolean objeto1Colediu = false;
19: int obj2X = 400;
20: int obj2Y = 200;
21: int obj2W = 50;
22: int obj2H = 50;
23: // --------------------------------------------------------------------
24: // ESSE MÉTODO VAI MOVER O OBJETO ATÉ A COORDENADA X = 390
25: // PARA QUE ELE TOQUE O OBJETO 2
26: // MAS NÃO IMPORTA COMO ELE SE MOVA, UM MÉTODO VAI TRATAR DE
27: // VERIFICAR SE OUVE COLISÃO OU NÃO!
28: // --------------------------------------------------------------------
29: public void moveObjeto1() {
30: obj1X += 2;
31: if (obj1X > 500) {
32: obj1X = 0;
33: }
34: }
35: // --------------------------------------------------------------------
36: // SE O OBJETO COLEDIR APARECERÁ UM TEXTO INFORMANDO!!!
37: // ESSE MÉTODO VAI SER CHAMANDO LÁ NO DENTRO DO MÉTODO desenharGraficos()
38: // --------------------------------------------------------------------
39: public void exibeTexto() {
40: Graphics bbg = backBuffer.getGraphics();
41: if (objeto1Colediu) {
42: bbg.setColor(Color.RED);
43: bbg.drawString("UIII fui tocado!!!", 200, 100);
44: }
45: }
46: // --------------------------------------------------------------------
47: // ESSE É O NOSSO MÉTODO QUE VAI TRATAR A COLISÃO
48: // ESSE MÉTODO RECEBE COMO ARGUMENTO: X, Y, W, H do Obj1 e Obj2
49: // NÃO SE PREOCUPE NOS VAMOS EXPLICAR ESSA LAVAGEM DE CÓDIGO!!!
50: // --------------------------------------------------------------------
51: public boolean colisao(int obj1X, int obj1Y, int obj1W, int obj1H,
52: int obj2X, int obj2Y, int obj2W, int obj2H) {
53: if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)
54: && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
55: return true;
56: } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
57: && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
58: return true;
59: } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)
60: && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {
61: return true;
62: } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
63: && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {
64: return true;
65: } else {
66: return false;
67: }
68: }
69: // --------------------------------------------------------------------
70: public void atualizar() {
71: objeto1Colediu = colisao(obj1X, obj1Y, obj1W, obj1H, obj2X, obj2Y,
72: obj2W, obj2H);
73: moveObjeto1();
74: }
75: public void desenharGraficos() {
76: Graphics g = getGraphics(); // ISSO JÁ ESTAVA AQUI
77: Graphics bbg = backBuffer.getGraphics();// ISSO TAMBÉM JÁ ESTAVA AQUI...
78: // ==================================================================================
79: bbg.setColor(Color.WHITE);
80: bbg.fillRect(0, 0, janelaW, janelaH);// DESENHA UM FUNDO BRANCO NA TELA!
81: // EXIBE UM TEXTO CASO O OBJETO COLIDA!
82: exibeTexto();
83: // DESENHA O OBJETO 2
84: bbg.setColor(Color.BLUE);
85: bbg.fillRect(obj2X, obj2Y, obj2W, obj2H);
86: // DESENHA O OBJETO 1 //com transparência
87: // new Color(red,green, blue, alpha) o alpha é o valor da trasnparência
88: // vai de 0 à 255
89: bbg.setColor(new Color(0, 255, 0, 200));
90: bbg.fillRect(obj1X, obj1Y, obj1W, obj1H);
91: // ==================================================================================
92: g.drawImage(backBuffer, 0, 0, this);// OBS: ISSO DEVE FICAR SEMPRE NO
93: // FINAL!
94: }
95: public void inicializar() {
96: setTitle("Tutorial 10 Colisão simples!");
97: setSize(janelaW, janelaH);
98: setResizable(false);
99: setDefaultCloseOperation(EXIT_ON_CLOSE);
100: setLayout(null);
101: setVisible(true);
102: backBuffer = new BufferedImage(janelaW, janelaH,
103: BufferedImage.TYPE_INT_RGB);
104: }
105: public void run() {
106: inicializar();
107: while (true) {
108: atualizar();
109: desenharGraficos();
110: try {
111: Thread.sleep(1000 / FPS);
112: } catch (Exception e) {
113: System.out.println("Thread interrompida!");
114: }
115: }
116: }
117: public static void main(String[] args) {
118: Game game = new Game();
119: game.run();
120: }
121: }
Muito bem... Agora vamos entender o método colisão que é o que está menos comentado no nosso código acima....
Observe a seguinte imagem:
Muito bem... temos um quadrado, e nesse quadrado temos quatro pontos
(marcado de vermelho), cada ponto possui uma coordenada X e Y,
conhecendo apenas as coordenadas e dimensões do nosso quadrado é
possível deduzir as coordenadas de cada um desses quatro pontos, como
mostra o circulo laranja... "blz... entendi... o que devemos fazer
agora...?"
agora vamos verificar se cada um desses pontos está invadindo a área de outro objeto (quadrado...)
Observe a imagem abaixo:
Para verificar se cada ponto do Objeto1 está dentro do Objeto2, temos
que fazer algumas verificações como mostra o circulo laranja, Observe o
nosso ponto P, as coordenadas X do nosso ponto P em relação ao
Objeto2 tem que ser: X de P >= X do Objeto 2 e ao mesmo tempo o X de P
<= X+largura do Objeto 2 ..... E ao mesmo tempo Y de P >= Y do
Objeto 2 e ao mesmo tempo o Y de P <= Y+altura do Objeto 2.
Então essas condições tem que ser verificadas para cada um dos nossos
pontos 1, 2, 3 e 4! Observe novamente o nosso método colisao()
1: public boolean colisao(int obj1X, int obj1Y, int obj1W, int obj1H,
2: int obj2X, int obj2Y, int obj2W, int obj2H) {
3: if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)
4: && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
5: return true;
6: } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
7: && (obj1Y >= obj2Y && obj1Y <= obj2Y + obj2H)) {
8: return true;
9: } else if ((obj1X >= obj2X && obj1X <= obj2X + obj2W)
10: && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {
11: return true;
12: } else if ((obj1X + obj1W >= obj2X && obj1X + obj1W <= obj2X + obj2W)
13: && (obj1Y + obj1H >= obj2Y && obj1Y + obj1H <= obj2Y + obj2H)) {
14: return true;
15: } else {
16: return false;
17: }
18: }
Então perceba que se um dos nossos pontos invadir o outro objeto, o nosso método irá retornar TRUE
Observe também que o nosso método foi chamado dentro do método
atualizar, então estará sendo verificado o tempo inteiro se está havendo
colisão ou não, caso haja uma colisão o nosso método retorna TRUE caso
não retorna FALSE. esse valor será retornado para uma variável, caso ela
receba true, um texto será exibido na tela!!!
(Estudem o código atentamente!!!)
Observem como ficou o meu:
Até o nosso próximo tutorial!!!
JAVA GAMES 2D::Movimentando Objetos::09
Olá pessoal!
Nesse tutorial de hoje, irei mostrar como fazer para um objeto se mover
sozinho nos nosso games! existe várias formas de se fazer isso, e
dependendo do que se deseja o código pode vir a se tornar complexo,
usarei como exemplo o código do tutorial anterior (Animando Sprites),
então sugiro que faça o seguinte, criem um novo pacote chamado tutorial9 dentro do nosso projeto JAVAGAMES2D, cole nele tudo que está no pacote tutorial8 e vamos fazer umas pequenas modificações tal como a do código abaixo:
1: import java.awt.*;
2: import java.awt.image.BufferedImage;
3: import java.io.File;
4: import javax.swing.ImageIcon;
5: import javax.swing.JFrame;
6: public class Game extends JFrame {
7: BufferedImage backBuffer;
8: int FPS = 30;
9: int janelaW = 500;
10: int janelaH = 500;
11: //EU REMOVI O VILÃO 2 QUE TINHA AQUI...
12: //E MUDEI A IMAGEM DO FUNDO, MAS ISSO É UM MERO DETALHE!!!
13: Sprite vilao = new Sprite(3, 200, 300);
14: ImageIcon fundo = new ImageIcon("src/tutor9/fundo.jpg");
15: boolean vai = true; //ESSA VARIÁVEL PODERIA ESTAR NA CLASSE Sprite
16: boolean volta = false; //ESSA VARIÁVEL PODERIA ESTAR NA CLASSE Sprite
17: //TENTE ENTENDER O CÓDIGO ABAIXO:
18: //ESSE MÉTODO SERÁ RESPONSÁVEL POR FAZER O OBJETO IR E VOLTAR
19: //ESSE MÉTODO TAMBÉM PODERIA ESTAR NA CLASSE SPRITE!!!
20: //DEPENDENDO DO QUE SE PRETENDER FAZER, ESSE MÉTODO PODERIA SER MAIS COMPLEXO!!
21: public void mover(){
22: if(vai){ vilao.x += 5; }
23: if(volta){ vilao.x -= 5; }
24: if(vilao.x>400){ vai = false; volta = true; }
25: if(vilao.x<100){ vai = true; volta = false; }
26: }
27: //AGORA DEVEMOS CHAMAR ESSE MÉTODO AQUI
28: //PARA QUE ELE SEJA EXECUTADO O TEMPO INTEIRO
29: public void atualizar() {
30: mover();//AQUI CHAMAMOS O MÉTODO MOVER!
31: }
32: public void desenharGraficos() {
33: Graphics g = getGraphics(); //ISSO JÁ ESTAVA AQUI
34: Graphics bbg = backBuffer.getGraphics();//ISSO TAMBÉM JÁ ESTAVA AQUI...
35: //AQUI VAMOS MANDAR DESENHAR ALGUNS IMAGENS NA TELA
36: bbg.drawImage(fundo.getImage(),0,0,500,500,this);//QUI DESENHAMOS O FUNDO
37: //AS DIMENSÕES ORIGINAIS DO FUNDO SÃO: 500X500 QUE É O TAMANHO DA NOSSA TELA!
38: bbg.drawImage(vilao.cenas[vilao.cena].getImage(), vilao.x, vilao.y,this);
39: vilao.animar();
40: //==================================================================================
41: g.drawImage(backBuffer, 0, 0, this);//OBS: ISSO DEVE FICAR SEMPRE NO FINAL!
42: }
43: public void inicializar() {
44: setTitle("Titulo do Jogo!");
45: setSize(janelaW, janelaH);
46: setResizable(false);
47: setDefaultCloseOperation(EXIT_ON_CLOSE);
48: setLayout(null);
49: setVisible(true);
50: backBuffer = new BufferedImage(janelaW, janelaH, BufferedImage.TYPE_INT_RGB);
51: vilao.cenas[0] = new ImageIcon("src/tutor8/s1.gif");
52: vilao.cenas[1] = new ImageIcon("src/tutor8/s2.gif");
53: vilao.cenas[2] = new ImageIcon("src/tutor8/s3.gif");
54: }
55: public void run() {
56: inicializar();
57: while (true) {
58: atualizar();
59: desenharGraficos();
60: try {
61: Thread.sleep(1000/FPS);
62: } catch (Exception e) {
63: System.out.println("Thread interrompida!");
64: }
65: }
66: }
67: public static void main(String[] args) {
68: Game game = new Game();
69: game.run();
70: }
71: }
Muito bem.... então basicamente criamos um método que modifica os
valores das coordenadas X e Y da nossa Sprite! dependendo do que se
pretende fazer o método poderia ficar mais complexo! você iria detalhar
como ele iria se comportar! é um exemplo bem básico (ele vai e
volta!!!)... mas já dá para compreender como funciona + ou -, e começar
a terem ideias (implementem também e compartilhem o link nos
comentários)!!!
Olhe como ficou o meu:
Viu como é simples! Até o próximo tutorial!
Assinar:
Postagens (Atom)