Entrar
Últimos assuntos
» Retorno da GMBR!!!por theguitarmester Ter 19 Mar 2024, 22:38
» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27
» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30
» Mudar cor de apenas uma palavra
por lunalol Sex 01 Mar 2024, 13:42
» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17
» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18
» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34
» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13
» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18
» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12
» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02
» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55
» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42
» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56
» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49
» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21
» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21
» Asteroid Core - Early Acesse Update [0.2.0.0]
por JOZ. Seg 08 Jan 2024, 14:39
» Versionamento de código com GitHub
por GabrielXavier Seg 08 Jan 2024, 07:32
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por kolesovsup Sex 29 Dez 2023, 07:16
» a funçao approach ainda existe?
por PEDRINDEV Ter 26 Dez 2023, 20:05
» Inimigo ataca até por trás! >:(
por saim Sex 22 Dez 2023, 08:55
» [RESOLVIDO]Spawn após morte
por Deception_1999 Dom 17 Dez 2023, 16:39
» Remunerado $$$ - Procuro programador para ajudar a "montar" um jogo
por theguitarmester Sáb 02 Dez 2023, 16:28
» Game maker nao abre
por Cerf Dom 26 Nov 2023, 12:01
[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
Tópicos semelhantes
» [TUTORIAL] Criando sua própria cor!!!
» [tutorial] Criando um Save por slot
» Tutorial - Criando Executaveis
» [Tutorial] Criando Libs
» [Tutorial]Criando primitives
» [tutorial] Criando um Save por slot
» Tutorial - Criando Executaveis
» [Tutorial] Criando Libs
» [Tutorial]Criando primitives
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|