[Tutorial] Criando Missões

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Tutorial] Criando Missões

Mensagem por Gonçalves em Qua 13 Mar 2013, 23:42

Tutorial
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:

Engine Base

Veja bem como funciona tudo na engine, nosso foco não é ela, mas é bom que entenda como tudo ocorre. Ela tem um jogador, que se move com WSAD e atira com o mouse, um obj_aliado, que não faz nada, e um obj_inimigo, que ataca quem estiver mais próximo.

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:
objetivo = 0
show_message("Está a nossa missão.")

Agora criaremos um inimigo (crie onde quiser) salvando-o numa variável. E logo após, outra mensagem:

Código:
show_message("Seu primeiro objetivo é matar um inimigo.")

E pra finalizar, criaremos a variável desc que salvará a descrição do objetivo atual:

Código:
desc = ""

No todo, ficará assim:

Código:
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 = ""

Vamos desenhar no Draw o objetivo atual.

Código:
draw_set_color(c_red)
draw_text(10,room_height-30,desc)

Agora começaremos a criar o sistema de objetivos, que vai no Step. Vamos começar com a seguinte estrutura:

Código:
if objetivo = 0
{
    // Descrição do objetivo
    Código

    // Outros
    Código

    // Condição de fracasso
    Código

    // Condição de sucesso
    Código
}

Onde está "código" vamos adicionar o conteúdo do objetivo, em cada "aba". Vamos usar esse exemplo:

Código:
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
    }
}

Explicando as abas:

"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:
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()
    }
}

Crie a variável tempo no Create e defina como 0.

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:
// Condição de sucesso
    if ! instance_exists(meu_inimigo)
    {
        objetivo += 1
        meu_aliado = instance_create(room_width/2,room_height/2,obj_aliado)
    }

Criaremos o objetivo 1, que ficará assim:

Código:
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()
    }
}

Crie a variável spawn no Create e defina como 0.

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:

  • Engine Exemplo (Básico)
  • Engine Exemplo (Intermediário)
  • Engine Exemplo (Avançado)


Obrigado pela atenção, espero que seja útil!


Última edição por Gonçalves em Sab 16 Mar 2013, 08:16, editado 5 vez(es)

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por Isaque Onix em Qua 13 Mar 2013, 23:52

Ótimo tutorial, gostei mesmo!!! Feliz

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por Gonçalves em Qui 14 Mar 2013, 02:49

@MC D_LIRIO:

Obrigado! Criei um outro exemplo de missão:

Engine Exemplo (Intermediário)

Spoiler:

Nesse tem contador de mortes, objetivo de "falar com...", e um exemplo de como retornar o motivo do fracasso (no último objetivo). A engine do próprio TDS é um pouquinho mais complexa, mas nada grave, rs.

Até mais! elephant


Última edição por Gonçalves em Qui 14 Mar 2013, 06:16, editado 2 vez(es)

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por Isaque Onix em Qui 14 Mar 2013, 03:40

flw, só num vou baixar agora purque estou baixando umas parada pra um outro projeto É MAIS PESADO QUE BAIXAR O GTA SAN ANDREAS mais é um arquivo particular de um amigo meu e ele vai deletar... mais assim q o download terminar, se eu ainda tiver vivo, eu baixo a nova engine o/

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por Gonçalves em Qui 14 Mar 2013, 09:03

Criei outra engine, com todas as missões anteriores juntas, numa engine melhorzinha:

Engine Exemplo (Avançado)

Com cutscenes, etc. Pode ser que a última missão dê algum erro (não chegou a acontecer comigo), estou testando ainda pra ver se acho algum erro.

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por DNilo em Qui 14 Mar 2013, 09:24

Gonçalves Realmente uma ótima engine =) vai me ajudar em um projeto !

e você estava falando sobre algum erro, quando joga no modo avançado, assim que você fracassa na missão ela fica reiniciando sem ter fim =) aqui pelo menos aconteceu isso 2 vezes, mais como irei usar só pra estudos pra mim esta de boa =)

Obrigado por compartilhar !

DNilo

Número de Mensagens : 108
Idade : 26
Data de inscrição : 22/02/2013
Reputação : 8
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

http://www.gamindie.com.br

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por saim em Qui 14 Mar 2013, 10:41

Não cheguei a baixar a engine, mas pelo texto, parece que dá pra melhorar em alguns aspectos.
Scripts, aqui, podem ser muito úteis. Vou considerar que todo mundo concorda e dar minhas sugestões com base nisso.
Seria legal fazer uma variável pra ver se EXISTE uma missão ativa ou não. Só rode os scripts de missão se houver alguma missão ativa. Isso vai deixar o step ridiculamente leve, se não houver uma missão em andamento, e tão leve quanto possível se houver.
Aí, comece o jogo com as missões desativadas e defina eventos pra iniciar uma missão.
No objeto "objMissoes"
>create<
Código:
ativo = false; // se está rolando uma missão ou não
objetivo = 0; // qual a missão a ser cumprida
Nmissoes = 3; // número de missões (alterar conforme o jogo)
>step<
Código:
if (ativo){
   verificaStatusDaMissao(objetivo);
   }
>evento que inicia a missão - pode ser apertar uma tecla, um trigger ou user event, pode ser um evento desencadeado por NPCs, pode ser o diabo a quatro<
Código:
ativo = true;
// outras alterações na room - volto nesse assunto mais pra frente
Aí, você tem o script "verificaStatusDaMissao" - que ainda não mostrei como pode ser (é o próximo). Ele, na verdade, vai usar a missão que está rolando como argumento pra chamar um outro script. Esse outro script é que vai controlar a missão, de fato, com as condições de sucesso ou fracasso. O script pode ser assim:
Código:
// verificaStatusDaMissao(missaoAgora)
// roda o script da missão em andamento
var emAndamento;
emAndamento = argument0; // só pra deixar o script mais legível - poderia usar argument0, mesmo.
switch (emAndamento){ // um switch é sempre melhor que dezenas de if-elses
   case 0: scriptDaMissao0();
      break;
   case 1: scriptDaMissao1();
      break;
   case 2: scriptDaMissao2();
      break;
   // e assim vai.
   }
Por fim tem os scripts das missões. Acho legal tirar o andamento da missão assim que ela chegar ao fim, tanto em caso de sucesso quanto de fracasso. Lembrando que esses scripts vão rodar a cada step que tiver uma missão em andamento, a alteração pro seu primeiro exemplo (matar 1 inimigo) ficaria mais ou menos assim:
Código:
if (!instance_exists(obj_jogador){ // falhou
   show_message("MISSÃO FRACASSADA!"); // mostra que falhou
   ativo = false; // finaliza a missão
   }
if (! instance_exists(meu_inimigo)){ // sucesso
   show_message("MISSÃO COMPLETA!"); // mostra que teve sucesso
   ativo = false; // finaliza a missão
   objetivo += 1; // pra não repetir a missão
   }
E você pode fazer o que quiser quando o valor de "objetivo" for igual a "nMissoes": voltar pra zero, parar as missões, finalizar o jogo, dar um bônus, o que quiser. Pode criar outro script pra isso!


Agora, quanto ao comentário que eu fiz no evento que inicializa a missão, o mesmo raciocínio pode ser aplicado: rode um script que faz uma coisa diferente pra cada valor de "objetivo". Se for "0", cria um inimigo na posição tal, se for "1", não faz nada, se for "2", cria um monte de inimigos em posições aleatórias, etc.

Ainda é possível eliminar a necessidade do script "verificaStatusDaMissao" se no crate event você colocar todos os scripts de missões numa array. Aí, ao invés de chamar um script pra chamar outro, você usa a função "script_execute" e usa como argumento a array no índice "objetivo". O create ficaria assim:
Código:
//parte inalterada
ativo = false; // se está rolando uma missão ou não
objetivo = 0; // qual a missão a ser cumprida
Nmissoes = 3; // número de missões (alterar conforme o jogo)
//coloca os scripts numa array
arrayDeScripts[0] = scriptDaMissao0;
arrayDeScripts[1] = scriptDaMissao1;
arrayDeScripts[2] = scriptDaMissao2;
E o step ficaria assim:
Código:
if (ativo){
   script_execute(arrayDeScripts[objetivo]);
   }

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por Gonçalves em Qui 14 Mar 2013, 18:29

@DNilo:

Obrigado, cara. Vou ver se faço mais uns exemplos.

@saim:

Então cara, eu vou fazer um exemplo de missões de cidade mesmo, no qual tem isso de usar um mesmo mapa pra várias missões. Talvez você possa ter entendido errado algumas coisas, por exemplo:

Nesses exemplos que fiz, cada objeto de missão fica em um mapa, ou seja, você já entra numa missão com ela ativa, e os outros não chegam a rodar sem necessidade.

objetivo é a variável que aumenta a cada objetivo da missão que você completa, por exemplo, uma missão pode ter uns 10 deles. Eu poderia criar uma variável missões pro caso que você citou ali.

Você acha que ficaria melhor se o Step das missão ficasse num script? De qualquer forma, farei um exemplo assim aí quem for usar decide como é melhor.

Não vou comentar tudo que você escreveu mas levei em consideração também, vou ver se crio um exemplo de uma cidadezinha com algumas missões pra fazer, inclusive com missões que só podem ser desbloqueadas se outras forem feitas, etc.

VALEU! =D

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por Isaque Onix em Qui 14 Mar 2013, 18:41

que aliado legal esse que mata a gente kkk brincadeira

ta muito boa essa engine, só achei ruim os 'caras que atiram' atirarem antes mesmo de ver a gente, mais é só uma engine, quem quiser que edite né XD

Isaque Onix

Número de Mensagens : 1597
Idade : 23
Data de inscrição : 15/08/2010
Reputação : 147
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://spyreserver.16mb.com

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por saim em Sex 15 Mar 2013, 09:18

O que eu mostrei é só uma forma diferente de fazer a mesma coisa. Realmente eu tinha entendido que você estava usando "objetivos" como "missões", mas meio que pode ser assim. A condição de sucesso da missão é que teria que ser um "if" cheio de "and's".

Dessa forma que eu mostrei, a missão pode ser ativada em qualquer momento, não existe a necessidade de entrar no mapa com ela ativa, basta definir qual evento irá ativá-la. Sei que do seu jeito isso é possível também, mas assim já está pronto.
Isso é importante pra jogos com história não-linear, como GTA, mas realmente não me preocupei em possibilitar que existam mais de uma missão ativa ao mesmo tempo, como na maioria dos RPGs. Se eu me lembrar, mais tarde, vou tentar melhorar isso (mas não imediatamente, o bicho tá pegando aqui tonto ).

Não fica MELHOR se usar scripts, na verdade eu acho é mais maleável, no sentido de que você pode bolar uma missão nova na cabeça, acrescentar um script à parte e mudar o valor de "nMissoes". Fazer tudo no step é mais complicado de alterar. No mínimo, o trabalho de achar a posição de editar o código você já economiza. Parece uma bobagem, mas se cada missão ocupar umas 15-20 linhas e você tiver 10 missões, ficar "catando milho" vai ser uma droga.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por Gonçalves em Sab 16 Mar 2013, 08:12

Parece uma bobagem, mas se cada missão ocupar umas 15-20 linhas e você tiver 10 missões, ficar "catando milho" vai ser uma droga.
Cada missão fica em um objeto diferente, entende? Aí basta, quando for iniciar a missão, criar a instância da mesma. Por exemplo, na última engine que postei, tem três missões, uma em cada objeto (missao1, missao2 e missao3).

No mais, já estou quase acabando o sistema de missões no mesmo mapa. Devo postar amanhã porquê hoje estou meio "atolado".

Até mais! elephant

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Tutorial] Criando Missões

Mensagem por Conteúdo patrocinado Hoje à(s) 09:56


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum