Você está na página 1de 4

Tutorial sobre SCTRLs (State ConTRoLS) e Triggers.

SCTRLs: ChangeAnim, ChangeAnim2 e ChangeState.


Triggers: Time , AnimElem, AnimTime, AnimElemTime, AnimTimeElem,
StateNo e PrevStateNo.
(Continuação)

Essa parte do tutorial, irá se propor a usar algumas lógicas quando se for “misturar” os SCtrls e Triggers
(explicados na parte anterior desse tutorial).

1. Usando 2 (dois) ou mais ChangeAnims:


Vamos supor que o char tenha que executar duas animações dependendo do que o jogador estiver fazendo
com ele. Que nem num power change, onde o char carrega suas barras de level. Então, quando o jogador
estiver executando o comando, o char executará uma animação e quando soltar o botão, executará outra
animação.
Geralmente makers fazem isso usando dois StateDefs, enquanto poderia usar apenas um, com dois
ChangeAnims.

Código:
[State 700, Animação do char executando o Power Charge]
type = ChangeAnim
trigger1 = command = “hold_c”
value = 700

[State 700, Animação do char parando de executar o Power Charge]


type = ChangeAnim
triggerall = Anim = 700
trigger1 = command != “hold_c”
value = 705

Neste código não colocamos o elem embaixo de value, por que caso o elem não seja atribuído, ele será
igual a 1.
Agora à explicação do código em si. É até meio óbvia a situação, mas explicarei mesmo assim.
Quando o comando hold_c estiver sendo pressionado, a animação do personagem será 700.
Quando o comando hold_c não estiver sendo pressionado (que nesse caso, está sendo solto), a animação do
personagem será 705.

Mas preste atenção na linha em negrito do código.


Aquele triggerall com a animação anterior à 705, é obrigatório quando uma animação está vindo após a
outra, num mesmo StateDef. Caso contrário, o char travará, e nunca sairá da animação.

Logo após ter feito os dois ChangeAnims, faremos o ChangeState retornando ao StateDef “base” do
personagem (sua pose de luta, sem estar fazendo nenhuma ação):
[State 700, Voltando ao State Base]
type = ChangeState
trigger1 = Anim = 705
trigger1 = !AnimTime
value = 0

Preste bem atenção nas linhas em negrito. Se você prestou bem a atenção no código, verá que o
ChangeState só será executado, logo após a animação 705 ter acabado.
Ficando os três SCtrl juntos, ficaria assim:
[State 700, Animação do char executando o Power Charge]
type = ChangeAnim
trigger1 = command = “hold_c”
value = 700

[State 700, Animação do char parando de executar o Power Charge]


type = ChangeAnim
triggerall = Anim = 700
trigger1 = command != “hold_c”
value = 705

[State 700, Voltando ao State Base]


type = ChangeState
trigger1 = Anim = 705
trigger1 = !AnimTime
value = 0

Onde: Se o comando for feito, a animação 700 será executada.


Quando o comando for desfeito após ter começado (quando estiver na Animação 700), o char vai para a
animação 705.
Quando a animação 705 chegar ao fim, o ChangeState levará o char ao StateDef 0.

2. Usando ChangeAnims privados


ChangeAnims privados geralmente são usados em intros/vitória especiais, ou em “custom anims” (que
diferente do ChangeAnim2, o custom state chamaria a animação do oponente, e não os sprites do mesmo).

E para não causar bugs em custom anims:


[State 6100, Custom Anim]
type = ChangeAnim
triggerall = SelfAnimExist(6100)
trigger1 = !time
value = 6100

[State 6100, Normal Anim]


type = ChangeAnim
triggerall = !SelfAnimExist(6100)
trigger1 = !time
value = 5000

Neste código, o oponente iria para a animação 6100, caso a mesma existir no *.air do oponente.
Caso contrário, iria para a animação 5000.

Usando ChangeAnim2 privados


Geralmente, quando vamos usar custom states, usamos o ChangeAnim2 pra fazer uma animação
customizada.
Mas infelizmente muitos chars não terão os sprites (dependendo do tipo de custom state) que necessita a
anim do ChangeAnim2.

Então para também não causar bugs, podemos “privar” o ChangeAnim2 para chars que temos certeza que
tem os tais sprites requeridos.
Código:
[State 6200, Custom Anim – Para os chars Ryu,Ken,Sub-Zero e Scorpion]
type = ChangeAnim2
triggerall = !time
trigger1 = enemynear, name = “Ryu”
trigger2 = enemynear, name = “Ken”
trigger3 = enemynear, name = “Sub-Zero”
trigger4 = enemynear, name = “Scorpion”
value = 6200

Esse exemplo executa o ChangeAnim2 no momento exato de inicialização do StateDef, e quando o


oponente se chamar Ryu, Ken, Sub-Zero ou Scorpion.

Obs.: Você poderá adicionar triggers com números diferentes, iguais a enemynear,name = “nome do
oponente”.

Mas privando o ChangeAnim2 dessa forma, quando o oponente não se chamar Ryu, Ken, Sub-Zero ou
Scorpion, ele ficará sem animação, travado no custom state.

Então teremos que criar uma animação no ChangeAnim para os personagens que não são os que o
ChangeAnim2 procura:

[State 6200, Custom Anim – Para outros chars]


type = ChangeAnim
triggerall = !time
trigger1 = enemynear, name != “Ryu”
trigger1 = enemynear, name != “Ken”
trigger1 = enemynear, name != “Sub-Zero”
trigger1 = enemynear, name != “Scorpion”
value = 5000

Nesse exemplo, se os chars se chamarem Ryu, Ken, Sub-Zero ou Scorpion, será executado o
ChangeAnim2 com a animação 6200, caso contrário será executado o ChangeAnim com a animação 5000.

3. Executando um SCtrl num determinado tempo (em time)


Para fazer acontecer isso, usaremos time maior que valor mínimo e time menor que valor máximo.

Então, seguiremos o exemplo:


[State 200, Soco do char]
type = ChangeAnim2
triggerall = Anim != 200
trigger1 = time >= 0 && time <= 10
value = 200

Esse simples exemplo diz que quando o time for maior ou igual a 0 (primeiro tick em diante) e menor ou igual
a 9 (décimo tick pra menos), fazendo que o SCtrl seja executado apenas nos primeiros 10 ticks do StateDef.
Já o triggerall ta dizendo que a animação 200 só será executada, quando a mesma não estiver sido
executada antes.
4. Executando um SCtrl num determinado tempo (em AnimElem/AnimElemTime)
Isso é útil para se fazer algo acontecer entre um AnimElem e outro, ou entre um tick do AnimElem e outro.
[State 200, Soco do char]
type = ChangeAnim2
triggerall = Anim != 200
trigger1 = AnimElem = 3, >= 0
trigger1 = AnimElem = 6, <= 4
value = 200

Isso faria que a Animação estivesse sendo executada entre o AnimElem 3 no primeiro tick, e entre o 5 tick do
AnimElem 6.

Isso em AnimElemTime seria assim:


[State 200, Soco do char]
type = ChangeAnim2
triggerall = Anim != 200
trigger1 = AnimElemTime(0) >= 0
trigger1 = AnimElemTime(6) <= 4
value = 200

Espero que você que leu esse tutorial, tenha entendido os princípios e usos dos SCTRLS:
ChangeAnim, ChangeAnim2 e ChangeState.
E dos triggers que os auxiliam:
Time, Anim, AnimTime, AnimElem, AnimElemTime, StateNo e PrevStateNo.

Tutorial feito por SonSon3000.

Você também pode gostar