YesNoOk
avatar

[TUTORIAL] (飛び道具を跳ね返し方法)PROJECTILE REFLECTION (Read 5942 times)

Started by Vans, February 09, 2017, 11:15:58 am
Share this topic:
[TUTORIAL] (飛び道具を跳ね返し方法)PROJECTILE REFLECTION
#1  February 09, 2017, 11:15:58 am
  • ****
    • Japan
This tutorial will explain and show how to use the projectile reflection system I developed. This tutorial will be divided in TWO parts, just like the system.

1. The FIRST part will cover how to apply this system during the creation of projectiles.
2. The SECOND part will cover how to apply this system during the creation of reflectors.

These two parts co-exist and are necessary for reflection to work properly.

I reserve this post for any further important information that may arise.



このガイドは飛び道具を跳ね返しシステムの説明です。ガイドは二つに分割される。

1.最初は飛び道具の跳ね返し行動です。
2.後はリフレクターの行動。

この二つは大事な物から、ちゃんと二つを使えばきちんと飛び道具の跳ね返しできます。
Last Edit: February 09, 2017, 11:22:13 am by Vans
Re: [TUTORIAL] (飛び道具を跳ね返し方法)PROJECTILE REFLECTION
#2  February 09, 2017, 11:21:44 am
  • ****
    • Japan
How to program reflection compatibility for projectiles.
飛び道具の行動について。


This is the place to start for those who are programming reflection behavior to a projectile.

In order to use this system, we have 3 important requirements to meet.

  • This system only works for helper-based projectiles.
  • This helper should have system variables number 0 and number 1 free (sysvar(0) & sysvar(1)).
    Since further expansions are likely to be made in the future, I would like to ask everyone to keep all system variables free as best as possible. These have been picked because they're the least used and will serve a very standard purpose from now on.
  • An empty (dummy) animation in the .air file with the number of YOUR choosing. The only requirement is that the animation contains no sprite data in it.

Things I will NOT cover in this guide:

  • How to program projectiles.
  • How to transfer projectile controller logic to helper-based logic.
  • Basics of coding with variables.

If you have any questions regarding any of the three topics I have mentioned, you should ask a question in one of the many help forums first. I will refrain from answering any questions regarding any of these three topics in this thread.

If you meet the previous three requirements, we can begin!

The projectile portion of the system requires to things: a set of headers (that I will provide) and a brand new state to define the behavior of the projectile once it is reflected.

I kindly ask everyone to keep the headers labeled just as I provide them here, this makes it easy to follow which parts belong to the reflection and which don't. This is to help people that might stumble upon it without looking at this guide. Thank you.

Step 1.

Locate the helper of the projectile you wish to make reflectable and insert this header in the state where the helper is created:

Code:
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY    ;
;飛び道具を跳ね返し行動設定               ;
;by Vans                                ;
;GUIDE:                                 ;
;FOR PROJECTILE / 飛び道具で            ;
;sysvar(0) = 131072                     ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE   ;
;=======================================;
[State 1005, COMPATIBILITY]
type = VarSet
trigger1 = !time
sysvar(0) = 131072
[State 1005, REFLECTED STATE]
type = VarSet
trigger1 = !time
sysvar(1) = REFLECTED_BEHAVIOR_STATE
;=======================================;

Explanation:

  • The number 131072 identifies the object as a projectile that is COMPATIBLE with reflection.
  • The REFLECTED_BEHAVIOR_STATE is the state where your helper should go to when it is reflected.

Notes:

If you wish to make your projectile UNREFLECTABLE, simply specify the REFLECTED_BEHAVIOR_STATE as the same state the projectile should be in when it is moving normally. Typically, this is the same state where you put the header.

Step 2.

Create the REFLECTED_BEHAVIOR_STATE. This state defines the behavior your projectile should have once it is reflected.

Typically, this state is simply a copy of your original projectile state with some modifications:

First, do NOT forget that we still need the header:

Code:
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY    ;
;飛び道具を跳ね返し行動設定               ;
;by Vans                                ;
;GUIDE:                                 ;
;FOR PROJECTILE / 飛び道具で            ;
;sysvar(0) = 131072                     ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE   ;
;=======================================;
[State 1005, COMPATIBILITY]
type = VarSet
trigger1 = !time
sysvar(0) = 131072
[State 1005, REFLECTED STATE]
type = VarSet
trigger1 = !time
sysvar(1) = NORMAL_BEHAVIOR_STATE**********************
;=======================================;

Notes:

Like in the previous case, sysvar(1) specifies the behavior of your projectile once it is reflected. However, we are reflecting a second time in this case. This means that the value for sysvar(1) should now be the state that defines the normal behavior of your projectile.

Step 3.

In the REFLECTED_BEHAVIOR_STATE, locate the hitdef of your projectile and change the following parameters:

Code:
affectteam = F
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY    ;
;飛び道具を跳ね返し行動設定               ;
;by Vans                                ;
;GUIDE:                                 ;
;FOR PROJECTILE / 飛び道具で          ;
;sysvar(0) = 131072                     ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE   ;
;=======================================;
id = sysvar(0)
;=======================================;

Explanation

  • The flag affectteam = F is required for the projectile to hit you back.
  • The id = sysvar(0) line is required to detect the reflected projectile as a compatible projectile once more.

Step 4.

Go to the portion of the code that defines the end of the reflected projectile behavior, located in the same state as the hitdef. Typically, this is a ChangeState.

Before this final ChangeState, place the following piece of code:

Code:
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY    ;
;飛び道具を跳ね返し行動設定               ;
;by Vans                                ;
;GUIDE:                                 ;
;FOR PROJECTILE / 飛び道具で          ;
;sysvar(0) = 131072                     ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE   ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで;
;sysvar(0) = 262144                    ;
;=======================================;
[State 1007, Turn]
type = Turn
trigger1 = movecontact
trigger1 = root,NumProjID(262144)
persistent = 0
ignorehitpause = 1
[State 1206, ChangeState]
type = ChangeState
trigger1 = movecontact
trigger1 = root,NumProjID(262144)
value = sysvar(1)
ctrl = 0
ignorehitpause = 1
;=======================================;

Explanation:

  • The value 262144 identifies an object that acts as a COMPATIBLE reflector.
  • In this case specifically, the code NumProjID(262144) identifies if your character is attempting to reflect their own projectile.
  • If you look closely, this changestate will revert your projectile to NORMAL_PROJECTILE_BEHAVIOR if it is reflected by your own reflector.
  • If your character does not use or posses a reflector, then this piece of code is kept for compatibility. Please, do not skip this step.

Conclusion.

If you followed all the steps correctly, then your projectile should now be compatible with reflection.

You can find characters that possess compatible reflectors and projectiles in my folder.

For beginners, I recommend examining the code in Athena as it is the most basic implementation (projectile + reflector).

Athena's Psycho Ball helper begins in Statedef 1005. Feel free to examine my code as an example.

You can test if your implementation was correct by reflecting your projectile with Athena, Rugal or Chizuru.

This concludes the first part of this guide.


(Japanese will come later).



Cómo programar compatibilidad con la reflexión de proyectiles





Este es el primer paso para programar el comportamiento de un proyectil al ser reflejado.

Para usar este sistema tenemos 3 requerimientos:

  • El sistema funciona con proyectiles programados con helpers.
  • El helper debe tener las dos variables de sistema 0 y 1 completamente libres (sysvar(0) & sysvar(1)).
    Es muy probable que se hagan expansiones en el futuro, por esta razón me gustaría pedir que dejemos libres las variables de sistema lo mejor posible. Estas variables fueron elegidas porque son las que menos se usan y ahora tendrán una gran utilidad a nivel de sistema.
  • Una animación vacía (o dummy) en el archivo .air, el número de esta animación no importa. El único requerimiento es que la animación no dibuje sprites en pantalla si es utilizada.

Estás son algunas cosas que no voy a cubrir en este tutorial:

  • Cómo programar proyectiles.
  • Cómo convertir proyectiles hechos con el controlador de projectile a proyectiles hechos con helpers.
  • Programación básica usando variables.

Si hay alguna pregunta con respecto a estas tres cosas que mencioné, recomiendo hacer una pregunta en alguno de los foros de ayuda primero. En este topic no abordare preguntas sobre esos tres temas para mantener la discusión limpia.

Si cumples los tres requerimientos que puse al principio, entonces ya podemos empezar!

La parte de proyectiles de este sistema requiere dos cosas: un set de encabezados (que voy a proporcionar) y un estado (statedef) nuevo para definir el comportamiento del proyectil cuando es reflejado.

Me gustaría, de ser posible, que todos mantuvieramos los encabezados etiquetados como los pongo aquí, así es más fácil seguir qué partes vienen del sistema y cuales no. Esto es para ayudar a las personas que encuentren el sistema sin tener acceso a esta guía. ¡Gracias!

Paso 1.

Encuentra el helper del proyectil que quieres hacer compatible y coloca este header en el estado donde el helper es creado:


Code:
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY    ;
;飛び道具を跳ね返し行動設定               ;
;by Vans                                ;
;GUIDE:                                 ;
;FOR PROJECTILE / 飛び道具で            ;
;sysvar(0) = 131072                     ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE   ;
;=======================================;
[State 1005, COMPATIBILITY]
type = VarSet
trigger1 = !time
sysvar(0) = 131072
[State 1005, REFLECTED STATE]
type = VarSet
trigger1 = !time
sysvar(1) = REFLECTED_BEHAVIOR_STATE
;=======================================;

Explicación:

  • El número 131072 identifica el objecto como un proyectil que es COMPATIBLE con el sistema de reflexión.
  • La linea REFLECRED_BEHAVIOR_STATE es el estado al que debe ir tu helper cuando es reflejado.

Notas:

Si quieres que tu proyectil sea NO REFLEJABLE, entonces especifica REFLECTED_BEHAVIOR_STATE como el mismo estado en el que debe estar el helper cuando se mueve de manera normal. Usualmente este estado es el mismo donde pusiste el header.

Paso 2.

Crea el estado con número REFLECTED_BEHAVIOR_STATE. Este estado va a definir el comportamiento de tu proyectil cuando es reflejado.

De manera usual este estado es una copia del estado original de tu proyectil con algunas modificaciones.

Primero, es importante que en este nuevo state no olvidemos el encabezado:

Code:
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY    ;
;飛び道具を跳ね返し行動設定               ;
;by Vans                                ;
;GUIDE:                                 ;
;FOR PROJECTILE / 飛び道具で            ;
;sysvar(0) = 131072                     ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE   ;
;=======================================;
[State 1005, COMPATIBILITY]
type = VarSet
trigger1 = !time
sysvar(0) = 131072
[State 1005, REFLECTED STATE]
type = VarSet
trigger1 = !time
sysvar(1) = NORMAL_BEHAVIOR_STATE**********************
;=======================================;

Notas:

Como en el primer paso, sysvar(1) especifica el comportamiento del proyectil cuando es reflejado. Como estamos reflejando un proyectil que ya fue reflejado una vez, entonces el valor de esta variable (NORMAL_BEHAVIOR_STATE) debe ser el estado de tu helper cuando el comportamiento es normal.

Paso 3.

En el estado con número REFLECTED_BEHAVIOR_STATE localiza el hitdef de tu proyectil y cambia los siguientes parámetros:

Code:
affectteam = F
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY    ;
;飛び道具を跳ね返し行動設定               ;
;by Vans                                ;
;GUIDE:                                 ;
;FOR PROJECTILE / 飛び道具で          ;
;sysvar(0) = 131072                     ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE   ;
;=======================================;
id = sysvar(0)
;=======================================;

Explicación:

  • El flag de affectteam = F es necesaria para que el proyectil pueda pegarte de regreso.
  • La linea de id = sysvar(0) is necesaria para detectar que el proyectil reflejado también es compatible.

Parte 4.

Ve a la porción del código que define el final del comportamiento del proyectil que ha sido reflejado, localizado en el mismo estado que el hitdef. De manera usual, este final es un ChangeState.

Antes de este ChangeState final, agrega el siguiente pedazo de código:

Code:
;=======================================;
;PROJECTILE REFLECTION COMPATIBILITY    ;
;飛び道具を跳ね返し行動設定               ;
;by Vans                                ;
;GUIDE:                                 ;
;FOR PROJECTILE / 飛び道具で          ;
;sysvar(0) = 131072                     ;
;sysvar(1) = REFLECTED_BEHAVIOR_STATE   ;
;FOR REFLECTOR / 飛び道具を跳ね返するHELPERで;
;sysvar(0) = 262144                    ;
;=======================================;
[State 1007, Turn]
type = Turn
trigger1 = movecontact
trigger1 = root,NumProjID(262144)
persistent = 0
ignorehitpause = 1
[State 1206, ChangeState]
type = ChangeState
trigger1 = movecontact
trigger1 = root,NumProjID(262144)
value = sysvar(1)
ctrl = 0
ignorehitpause = 1
;=======================================;

Explicación:

  • El número 262144 identifica un objecto que actúa como reflector COMPATIBLE.
  • En este caso específico, la linea NumProjID(262144) identifica si tu personaje está intentando reflejar su propio proyectil.
  • Si observas con cuidado, este ChangeState hará que tu proyectil vaya a NORMAL_PROJECTILE_BEHAVIOR si es reflejado por un reflector propio (reflejado dos veces)
  • Si tu personaje no tiene o no hace uso reflectores entonces este pedazo de código está aquí para preservar compatibilidad. ¡Por favor no hay que saltar este paso!

Conclusión.

Si seguiste todos los pasos de manera completa, entonces tu proyectil debería ser compatible con el sistema de reflexión!

Para más ejemplos, mi folder contiene personajes que son compatibles con esta reflexión y tienen una diversidad de ejemplos de distintos proyectiles y reflectores.

Para principiantes, recomiendo revisar el código en Athena, pues es la implementación más básica (proyectil + reflector).

El helper de Pyscho Ball de Athena comienza en el Statedef 1005. Es un buen ejemplo e invito a todos a revisarlo para verlo en acción.

Para probar si la implementación es correcta, es suficiente con intentar reflejar el proyectil con Athena, Rugal o Chizuru.

¡Esto concluye la primera parte de la guía!
Last Edit: February 24, 2017, 09:38:09 am by Vans
Re: [TUTORIAL] (飛び道具を跳ね返し方法)PROJECTILE REFLECTION
#3  February 09, 2017, 11:21:59 am
  • ****
    • Japan
(Reserved for Part 2)

     Posted: February 24, 2017, 09:38:43 am
I have added spanish! I'm still writing part 2, I hope I will be done soon.
Last Edit: February 24, 2017, 09:38:43 am by Vans
Re: [TUTORIAL] (飛び道具を跳ね返し方法)PROJECTILE REFLECTION
#4  October 05, 2018, 09:27:30 pm
    • Mexico
Muchas gracias amigo :),intentare implementar su codigo amigo es un gran aporte, ya que es lo que estaba buscando amigo haber si me sale amigo, esperando que me respondas y la parte 2 :)
Last Edit: October 05, 2018, 09:32:15 pm by Mazter Arzate