Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Qui 21 Nov 2024, 13:33
» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
[Tutorial] Criando Missões
4 participantes
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
[Tutorial] Criando Missões
Tutorial
Criando Missões com Objetivos
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 Sáb 16 Mar 2013, 08:16, editado 5 vez(es)
Gonçalves- Games Ranking :
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios :
x 0 x 4 x 0
x 2 x 0 x 0
x 0 x 0 x 0
Re: [Tutorial] Criando Missões
@MC D_LIRIO:
Obrigado! Criei um outro exemplo de missão:
Engine Exemplo (Intermediário)
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!
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!
Última edição por Gonçalves em Qui 14 Mar 2013, 06:16, editado 2 vez(es)
Gonçalves- Games Ranking :
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios :
x 0 x 4 x 0
x 2 x 0 x 0
x 0 x 0 x 0
Re: [Tutorial] Criando Missões
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/
Re: [Tutorial] Criando Missões
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.
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- Games Ranking :
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios :
x 0 x 4 x 0
x 2 x 0 x 0
x 0 x 0 x 0
Re: [Tutorial] Criando Missões
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 !
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 !
Re: [Tutorial] Criando Missões
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.
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:
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.
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:No objeto "objMissoes"
>create<>step<
- 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)>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:
if (ativo){
verificaStatusDaMissao(objetivo);
}
- Código:
ativo = true;
// outras alterações na room - volto nesse assunto mais pra frente
- 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.
}
- 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
}
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;
- Código:
if (ativo){
script_execute(arrayDeScripts[objetivo]);
}
saim- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: [Tutorial] Criando Missões
@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
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- Games Ranking :
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios :
x 0 x 4 x 0
x 2 x 0 x 0
x 0 x 0 x 0
Re: [Tutorial] Criando Missões
ta muito boa essa engine, só achei ruim os 'caras que atiram' atirarem antes mesmo de ver a gente, mais é só uma engine,
Re: [Tutorial] Criando Missões
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 ).
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.
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 ).
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: [Tutorial] Criando Missões
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).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.
No mais, já estou quase acabando o sistema de missões no mesmo mapa. Devo postar amanhã porquê hoje estou meio "atolado".
Até mais!
Gonçalves- Games Ranking :
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios :
x 0 x 4 x 0
x 2 x 0 x 0
x 0 x 0 x 0
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos