domingo, 8 de novembro de 2009

Triggers (Triggerzones)


Neste post irei falar a respeito de Trigges.
Houve significativas mudanças do conceito de triggers entre o Ofp1 e Ofp2. Agora as triggers basicamente são apenas Triggerzones, que só é ativada com a presença de uma unidade, seja ela AI ou player.
Na palheta Modify você não irá encontrar nenhum campo onde você configure a tarefa ou o script serem executados quando a Trigger for ativada.
Todo o controle, desde o que fazer quando alguem invade a triggerzone (função onEnter), ou quando a deixa (função onExit), serão manipulados através de scripts.

Aqui no caso, darei continuidade a missão que criamos lá no início (http://ofp2editor.blogspot.com/2009/11/passos-iniciais.html), inserindo a triggerzone, onde caso o player entre na triggerzone (que seria o suposto ponto de extração) a missão seja terminada.
Abra a sua missão, escolha um ponto de extração e insira uma Triggerzone. Para abra a Barra de Ferramentas na palheta Create, depois a Categoria Systems, expanda a pasta Mission e selecione o objeto "Triggers events when someone enter or exits" e o insira no mapa.


Ao inserir a triggerzone no mapa, ela terá o formato quadrado, que pode ser redimensionado através dos pontos das arestas, como eu fiz formando um losango, ou ainda você pode escolher a opção Circle, na palheta Modify do Editor de Propriedades. Nomeie esta trigger zone com PontoExtracao, ou o nome que preferir, mas lembre-se que este nome será usado futuramente.
Agora não há nada a faze mais com ela, senão ajeitar os detalhes como descricao.
Para deixar um pouco mais bonitinho, ficando o ponto visível no mapa, irei inserir um novo objeto "Mission Objective" (descrito em http://ofp2editor.blogspot.com/2009/11/passos-iniciais.html), só que agora irei configurá-lo como Objetivo Primário 2, e darei ele o nome de objExtracao.



As palhetas foram redimensionadas no editor para facilitar a visualização.

Só que agora, teremos que dar uma mexida nos scripts criados anteriormente e prepará-los para trabalhar com este novo objetivo, além de criarmos a função onEnter da triggerzone que será responsável por finalizar a missão.
Acesse o mesmo objeto levelScript já criado na missao do topico anterior.
Segue a alteração feita, que explicarei mais adiante.



As Alterações foram:

- A inclusão de uma variavel chamada obj1Completo para indicar se o objetivo principal foi cumprido ou não. Repare que logo no inicio da missão, no evento onMissionStart eu já atribuo a ela o valor 0, para dizer que o objetivo ainda não foi completo.
-Em seguida, no método onDeath incluino a mudança de estado através da função OFP:setObjectiveState do novo objetivo (ponto de extração). Note que estou informando o nome do objetivo (objExtracao) para a mudança de estado. Além disso altero o valor da variavel obj1Completo para 1, para identificar que o objetivo foi completo.
- A inclusão da função onEnter_PontoExtracao. Lembre-se que quando declaramos a função com o nome do objeto apos o prefixo "onEnter", estamos informando ao jogo que somente execute este método quando ouver invasões de zonas na trigger em questão, do contrário você terá que determinar por um if qual a triggerzone que foi ativada. Dentro da função onEnter_PontoExtracao, comparamos a variavel obj1Completo para saber se o objetivo principal foi ou não cumprido. Enquanto o valor da variavel for 0, mesmo que vc invada a triggerzone, nada ocorre, mas se a variavel tiver o valor 1, então ele muda o estado do objetivo para completo e finaliza a missão atraves da função missionCompleted().

Abaixo segue o código para copiar e colar

local obj1Completo;

function onMissionStart()
OFP:setObjectiveState("objective", "IN_PROGRESS");
obj1Completo = 0;
end
function onDeath(victim, killer)
if OFP:getEchelonSize("Echelon")==0 then
OFP:setObjectiveState("objective", "COMPLETED");
OFP:setObjectiveState("objExtracao", "IN_PROGRESS");
obj1Completo = 1;
end
end

function onEnter_PontoExtracao(zoneName, unitName)
if obj1Completo == 1 then
OFP:setObjectiveState("objExtracao", "COMPLETED");
OFP:missionCompleted();
end
end


Saudações
IlluminatusBR

Nenhum comentário:

Seguidores