You are on page 1of 5

www.indiegamerbrasil.

com Tutorial bsico de games Lio 3

IndieGamerBrasil.com
Tutorial bsico de games
(c) 2013 by Cleuton Sampaio
Lio 3: NPCs

Voc tem a liberdade de:

Compartilhar copiar, distribuir e transmitir a obra.

Com as seguintes condies:

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.

Vedada a criao de obras derivadas Voc no pode alterar, transformar ou criar em


cima desta obra.

Leia mais sobre esta licena em: http://creativecommons.org/licenses/by-nc-nd/3.0/br/legalcode.

www.indiegamerbrasil.com Tutorial bsico de games Pgina: 1 de: 5

www.indiegamerbrasil.com Tutorial bsico de games Lio 3

Lio 3: NPCs
NPC significa Non-player character ou personagem no controlado pelo jogador. Geralmente, os
NPCs so os inimigos em um game.
Em nosso caso, os carros sero os NPCs, e precisamos control-los.
No exemplo desta lio, os carros ignoram a pessoa, pois o objetivo apenas criar e controlar os
NPCs.

Criar carros
Inicialmente, precisamos criar alguns carros para que o jogo tenha graa. Isto feito dentro de
gameloop.js, na funo iniciar():
carros = new Array();
criarCarros();
// Primeiros carros:
novoCarro(pista1Y);
novoCarro(pista2Y);
novoCarro(pista3Y);

Para facilitar a criao de carros, eu criei um vetor novo carros, que contm os objetos pr
criados, mas sem fazer parte do game. A funo criarCarros() preenche este vetor, e a funo
novoCarro() cria uma cpia de um carro e coloca dentro de gameObjects:
function novoCarro(pista) {
var indx = aleatorio(carros.length) - 1;
var novo = new GameObject();
novo.player = carros[indx].player,
novo.arqImagem = carros[indx].arqImagem;
novo.imagem = carros[indx].imagem;
novo.centroX = -6;
novo.centroY = carros[indx].centroY;
novo.velocidadeX = carros[indx].velocidadeX * (1 + Math.random());
novo.velocidadeY = 0;
novo.aceleracaoX = carros[indx].aceleracaoX;
novo.aceleracaoY = carros[indx].aceleracaoY;
novo.altura = carros[indx].altura;
novo.largura = carros[indx].largura;
novo.ativa = carros[indx].ativa;
novo.centroY = pista + 1;

www.indiegamerbrasil.com Tutorial bsico de games Pgina: 2 de: 5

www.indiegamerbrasil.com Tutorial bsico de games Lio 3


armazenarCarro(novo);
totalGO++;
setarUltimoPista(novo);

Note que eu criei uma funo para retornar um nmero aleatrio, variando de 1 at o limite
fornecido. Isto nos permite escolher um dos carros do estoque.
Depois, eu crio um novo carro e copio as propriedades do carro escolhido, alterando sua velocidade
e a pista (centroY) onde ele correr.
Ao final, eu armazeno o carro em gameObjects. Quando um carro chega ao final da pista, ele
eliminado do vetor gameObjects, e a sua posio preenchida como null. A funo
armazenarCarro() vai procurar uma posio vaga no vetor gameObjects, e, caso no exista, ela
acrescenta mais uma posio.
Eu controlo a quantidade de gameobjects ativos com a varivel totalGO. Alis, eu criei algumas
variveis na funo inicializa() (dentro de inicializacao.js) que controlam os carros:
MAXGO = 10;
totalGO = 0;
// Pistas:
pista1Y = 1.5;
ultimoPista1 = null;
pista2Y = 3.5;
ultimoPista2 = null;
pista3Y = 5.5;
ultimoPista3 = null;

MAXGO o limite mximo de carros ativos. Eu coloquei em 10 porque um limite razovel.


Quanto mais carros ativos, menor a performance do game. Tambm criei variveis para apontar
para o ltimo carro criado em cada pista. Isto permite saber se h espao na pista para novos carros.

Atualizar os carros
Precisamos fazer o seguinte:

Atualizar a posio dos carros;

Verificar se d para criarmos novos carros.

Para atualizar a posio, eu uso a velocidade, como fiz com a pessoa. S que tem dois problemas:

www.indiegamerbrasil.com Tutorial bsico de games Pgina: 3 de: 5

www.indiegamerbrasil.com Tutorial bsico de games Lio 3


1. Os carros podem sair fora da pista;
2. Os carros podem colidir com os que esto sua frente.
Eu testo se os carros saram da pista e se podem colidir com os da frente, na funo updateGO:
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;
}
}
else {
var deslocamentoX = go.velocidadeX * intervalo;
go.centroX += deslocamentoX;
verificarSeSaiuDeCena(go);
verificarSeVaiColidir(go);
verificarSeCriaNovoCarro(go);
}
}

As trs funes servem, respectivamente, para: verificar se o carro saiu da pista, verificar se ele est
muito prximo ao da sua frente, e verificar se pode criar um novo carro na mesma pista.
Quando eu crio um carro, eu posso aumentar sua velocidade normal:
novo.velocidadeX = carros[indx].velocidadeX * (1 + Math.random());

Isto cria um efeito bem interessante, pois os carros se movem em velocidades diferentes. Porm,
cria um problema: o carro de trs pode andar mais rpido do que o da frente, e, consequentemente,
passar por cima dele. Para evitar isso, eu criei a funo verificarSeVaiColidir():
function verificarSeVaiColidir(go) {
var resultado = false;
for (var x=1; x < gameObjects.length; x++) {
var inter = gameObjects[x];
if (inter == null) {
continue;
}
if (inter.centroY != go.centroY) {
continue;
}
if (inter.centroX <= go.centroX) {

www.indiegamerbrasil.com Tutorial bsico de games Pgina: 4 de: 5

www.indiegamerbrasil.com Tutorial bsico de games Lio 3


continue;
}
var distancia = inter.centroX - go.centroX;
if (distancia <= 4) {
go.velocidadeX = inter.velocidadeX;
}
}
return resultado;
}

Ela procura os carros que esto frente do carro atual, e verifica a distncia entre os seus centros.
Se for menor que 4 metros, ento torna a velocidade do carro atual igual do que est a sua frente.
como se o motorista diminusse para no bater no carro frente.

www.indiegamerbrasil.com Tutorial bsico de games Pgina: 5 de: 5

You might also like