Escolar Documentos
Profissional Documentos
Cultura Documentos
IndieGamerBrasil.com
Tutorial bsico de games
(c) 2013 by Cleuton Sampaio
Lio 2: Limites e tamanhos
Atribuio Voc deve creditar a obra da forma especificada pelo autor ou licenciante
(mas no de maneira que sugira que estes concedem qualquer aval a voc ou ao seu uso da
obra).
Uso no comercial Voc no pode usar esta obra para fins comerciais.
Limites
Precisamos estabelecer limites para a bola se mover. Isto possvel com uma pequena alterao no
nosso gameloop (gameloop.js):
function updateGO(go, intervalo) {
if (go.player) {
// Atualizao exclusiva para o Player object
var deslocamentoX = velocidadeX * intervalo;
var deslocamentoY = velocidadeY * intervalo;
if (caminhoLivre(go,deslocamentoX,deslocamentoY)) {
go.centroX += deslocamentoX;
go.centroY += deslocamentoY;
}
else {
velocidadeX = 0;
velocidadeY = 0;
alert("limite");
}
}
}
Para comear, introduzimos uma condio ANTES de alterar a posio do nosso gameobject.
Precisamos verificar se o caminho est livre, na direo do prximo movimento, antes de realmente
movimentar o objeto. Note que inclumos uma propriedade player no gameobject, mas vamos
falar disso mais adiante. A funo caminhoLivre verifica se o prximo movimento da bola no vai
coloc-la fora dos limites:
function caminhoLivre(go, desX, desY) {
// Verifica se o caminho est livre para o gameobject
retorno = true;
desXpixels = desX * metroPixels;
desYpixels = desY * metroPixels;
goPixels = toPixels(go);
newTopo = goPixels.topo + desYpixels;
newEsquerda = goPixels.esquerda + desXpixels;
newBaixo = newTopo + goPixels.altura;
newDireita = newEsquerda + goPixels.largura;
if (newTopo < 0) {
// Vai ficar alm do limite superior?
retorno = false;
}
else if (newBaixo > retangulo.altura) {
// E do limite inferior?
retorno = false;
}
else if (newEsquerda < 0) {
// E do limite esquerdo?
retorno = false;
}
else if (newDireita > retangulo.largura) {
// e do limite direito?
retorno = false;
}
return retorno;
}
s verificar se o topo vai ser menor que zero, ou se a parte de baixo vai ser maior que a altura da
janela de jogo. Depois, verificamos se os limites esquerdo e direito tambm so vlidos. Antes de
calcularmos limites, importante transformar as coordenadas do gameobject em pixels, e o que a
funo toPixels() faz:
function toPixels(go) {
// Converte as coordenadas do modelo em pixels
var
var
var
var
var
var
var
var
var
velocidadeX = 0;
velocidadeY = 0;
alert("limite");
Tamanhos
Bom, temos um problema... A nossa pista tem 5 faixas distintas:
De cima para baixo, temos: uma calada, 3 pistas para automveis e mais uma calada. Como
vamos acertar as propores corretas?
A primeira coisa a fazer tornar a pista proporcional. E fizemos isto no Draw:
www.indiegamerbrasil.com Tutorial bsico de games Pgina: 4 de: 8
Tornamos nossa imagem proporcional. Assim, cada calada ter 1,5 metros, e cada pista ter 2,0
metros. Quando convertermos em pixels, tudo ficar proporcional.
Porm, temos que fazer algumas alteraes na nossa inicializao (inicializacao.js), de modo a
alterar um pouco a proporo metro / pixels (para 5% da largura da tela), e calcular a altura da
arena proporcionalmente altura da pista (9 metros):
function inicializa() {
larguraJanela = window.innerWidth;
// Calcula a proporcao metro-tela: 1 metro = 10% da tela
metroPixels = Math.round(larguraJanela * 0.05);
// Prepara a "canvas" do game:
conteudo = document.getElementById("conteudo");
// Calcula tamanhos e posiciona a canvas:
/*
* A
* * * *
*/
// Pistas:
pista1Y = 1.5;
pista2Y = 3.5;
pista3Y = 5.5;
Alm de tornar a altura proporcional, criamos o deslocamento das trs pistas de automveis.
Tive que alterar o estilo (estilo.css) para retirar o tamanho fixo que eu atribu ao Canvas:
#tela {
position: fixed;
top: 15%;
left: 1%;
border: 2px solid black;
background-color: gray;
}
Game Objects
Eu pretendo carregar alguns carros, logo, mudei o nome do script e da classe pessoa.js para
gameobject.js, pois ele no vai carregar s pessoas:
/* Tutorial basico de games
* www.indiegamerbrasil.com
* (c) 2013 by Cleuton Sampaio
*
*/
// pessoa.js
var templateGO = {
player : false,
arqImagem : "images/pessoa.png",
imagem : null,
centroX : 0,
centroY : 0,
velocidadeX : 1.0,
velocidadeY : 1.0,
aceleracaoX : 0.0,
Agora, a classe que representa a pessoa e os carros se chama GameObject, e tem uma nova
propriedade player, que indica se o gameobject um Player Object (controlado pelo jogador) ou
um NPC Non-Player Character (controlado pela IA do game).
E tambm separei a funo updateGO() para atualizar apenas o movimento do player, pois os
carros eu atualizarei mais tarde:
function updateGO(go, intervalo) {
if (go.player) {
// Atualizao exclusiva para o Player object
Finalmente, eu adicionei alguns carros, mesmo parados, s para ver como ficariam:
function iniciar() {
// Carrega o fundo
fundo = new Image();
fundo.src = "images/pista.png";
// Posiciona a pessoa
pessoa = new GameObject();
pessoa.player = true;
pessoa.centroX = retanguloMetros.largura / 2;
pessoa.centroY = retanguloMetros.altura / 2;
pessoa.imagem = new Image();
pessoa.imagem.src = pessoa.arqImagem;
gameObjects[0] = pessoa;
idGameLoop = window.setInterval("gameLoop()", 50);
// Carrega alguns carros, s para mostrar
Resultado
Com as novas alteraes, nosso game ficou assim: