Criando Missões com Objetivos
Você quer adicionar um pouco mais de diversão aos seu jogos? Que tal adicionar um sistema bem simples de missão? É bem simples de fazer, funciona pra qualquer tipo de jogo e é fácil de deixar do seu jeito. Primeiramente vamos baixar essa engine que servirá de base pra gente:
Código: Selecionar todos
https://dl.dropbox.com/s/j4e7qww5wghc3nb/[Tutorial]%20Criando%20Miss%C3%B5es%20-%20Engine%20Base.gmk
Desenvolvimento
Primeiro vamos criar nosso objeto missao1, com depth -100000, já coloque-o na room. Agora exclua todos os outros objetos, exceto os blocos e o jogador.
No Create, vamos colocar tudo que terá no início da missão, no nosso caso, definiremos a variável objetivo como 0 e logo depois a mensagem inicial.
Código: Selecionar todos
objetivo = 0
show_message("Está a nossa missão.")
Código: Selecionar todos
show_message("Seu primeiro objetivo é matar um inimigo.")
Código: Selecionar todos
desc = ""
Código: Selecionar todos
objetivo = 0
show_message("Está a nossa missão.")
meu_inimigo = instance_create(600,300,obj_inimigo1)
show_message("Seu primeiro objetivo é matar um inimigo.")
desc = ""
Código: Selecionar todos
draw_set_color(c_red)
draw_text(10,room_height-30,desc)
Código: Selecionar todos
if objetivo = 0
{
// Descrição do objetivo
Código
// Outros
Código
// Condição de fracasso
Código
// Condição de sucesso
Código
}
Código: Selecionar todos
if objetivo = 0
{
// Descrição do objetivo
desc = "Mate o inimigo"
// Outros
// Condição de fracasso
if ! instance_exists(obj_jogador)
{
show_message("MISSÃO FRACASSADA!")
game_restart()
}
// Condição de sucesso
if ! instance_exists(meu_inimigo)
{
objetivo += 1
}
}
"Descrição do objetivo": O código atualiza a descrição atual. A atualização é feita a cada Step, o que não é a forma mais adequada apesar de que muito dificilmente isso pesará no jogo. Cabe ao programador otimizar da melhor mais viável pra ele. Eu costumava atualizar a descrição de objetivo apenas quando cumprisse o anterior, mas prefiro assim.
"Outros": Nessa "aba", eu deixo tudo que não se encaixa no resto, como timers por exemplo, o que não usaremos nesse exemplo.
"Condição de fracasso": Condição para que a missão seja dada como fracassada. Nesse caso, apenas a morte do jogador nos dará esse resultado.
"Condição de sucesso": Condição para que o objetivo seja alcançado e a missão avance, ou se for o caso do último, a missão seja dada como cumprida. Nela checamos se o meu_inimigo, criado no início da missão, não existe/está morto, se sim, avançar.
Agora, como teste, colocaremos abaixo dessa estrutura (fora dela, claro) essa:
Código: Selecionar todos
else if objetivo = 1
{
// Descrição do objetivo
desc = "Espere 5 segundos para que a missão seja dada como cumprida"
// Outros
tempo += 1
// Condição de fracasso
if ! instance_exists(obj_jogador)
{
show_message("MISSÃO FRACASSADA!")
game_restart()
}
// Condição de sucesso
if tempo >= room_speed*5
{
show_message("MISSÃO CUMPRIDA!")
game_restart()
}
}
O objetivo é apenas esperar 5 segundos, e aí então será decretada como cumprida a missão.
Apague esse último objetivo, agora vamos adicionar ao efeito da condição de sucesso do objetivo 0 a criação de um obj_aliado, salvando-o numa variável. Que ficará assim:
Código: Selecionar todos
// Condição de sucesso
if ! instance_exists(meu_inimigo)
{
objetivo += 1
meu_aliado = instance_create(room_width/2,room_height/2,obj_aliado)
}
Código: Selecionar todos
else if objetivo = 1
{
// Descrição do objetivo
desc = "Proteja a seu aliado dos inimigos ("+string(20-floor(tempo/room_speed))+" segundos restantes)"
// Outros
tempo += 1
spawn += 1
if spawn >= 30
{
ox = random(room_width)
oy = random(room_height)
if ! collision_circle(ox,oy,50,obj_bloco,0,0)
and ! collision_circle(ox,oy,120,obj_jogador,0,0)
and ! collision_circle(ox,oy,120,obj_aliado,0,0)
{
instance_create(ox,oy,obj_inimigo1)
spawn = 0
}
}
// Condição de fracasso
if ! instance_exists(obj_jogador)
or ! instance_exists(meu_aliado)
{
show_message("MISSÃO FRACASSADA!")
game_restart()
}
// Condição de sucesso
if tempo >= room_speed*20
{
show_message("MISSÃO CUMPRIDA!")
game_restart()
}
}
Ele é um pouco mais complexo. O que acontece nesse?
A descrição tem um contador do tempo restante.
Em "Outros" temos o temporizador da missão e de spawn dos inimigos. Logo após fazemos a checagem do tempo de spawn e criamos um inimigo, também, checamos se ele não está perto demais do jogador, do aliado, e dos blocos.
A condição de fracasso agora, além da morte do jogador, é também a do aliado.
A condição de sucesso é a variável tempo bater 20 segundos, que dará a missão como cumprida.
Engine
A engine final você pode baixar aqui:
Obrigado pela atenção, espero que seja útil!