1 Tutorial básico de vJASS Mar Ene 10, 2012 1:03 pm
lukario!
Administrador
Hola!
He estado estudiando vJass en estos días y les traigo un tutorial de lo que he aprendido
Antes que nada, quiero dar un agradecimiento muy especial a Sauron y Musk sin los cuales no podría haber aprendido esto.
Esperá, cómo querés que aprenda vJass si ni siquiera sé qué es Jass???
Vamos por partes.
¿Qué es JASS?
Jass(Just Another Scripting Syntax) es el lenguaje de programación interno de Warcraft III.
¿Qué es vJASS?
Es una extensión personalizada de las funciones del JASS con algunas características extras.
¿Por qué vJASS?
La "v" viene de "very" y no por "Vexorian"(Un gran usuario de wc3c). Vexorian quería llamarlo JASS++, mientras que Zoxc sugirió vJASS por "veryJASS" y a Vexorian le gustó la idea.
¿Qué es JESP?
Muchos piensan que JESP es otro lenguaje o extensión de JASS o vJASS, pero en realidad no es ninguno de los dos.
JESP(JASS Enhanced Spell Pseudotemplate) es un argumento de la comunidad de codificadores que dice: "Toda spell debe tener una sección de CONFIGURACIÓN en el código. Denstro de esta configuación, el usuario debe ser capaz de modificar la spell sin necesidad de adentrarse en el código o sin necesidad de entenderlo. Una sección de configuración puede estar en CUALQUIER lugar de la spell"
¿Qué necesito para usar vJASS?
Necesitas el Jass NewGen pack ---> [Tienes que estar registrado y conectado para ver este vínculo]
¿Es difícil aprender vJASS?
Si alguna vez has programado no te será tan difícil. A medida que vas aprendiendo te va resultando más fácil.
¿Cómo uso JASS?
Simplemente crea un detonador vacío y ve a Editar > Convertir a texto personalizado.
Comencemos con el tuto:
¿Qué son las variables?
Las variables, como bien ha dicho Sauron, son como cajas, en las que se pueden almacenar datos. Podés guardar unidades, números o cadenas de texto(string).
Crear una variable
Se pueden crear dos tipos de variables: locales y globales
Variables locales
Las variables locales se pueden usar UNICAMENTE en la función en la cual han sido declaradas.
ah?
Las funciones son otras cajas en las que se almacenan acciones, tales como crear o matar una unidad. Éstas pueden tomar valores y devolver un valor.
Por ejemplo:
Tenemos dos funciones: Función A y función B.
Si en la función A creamos una variable local, esta variable NO PUEDE SER USADA EN LA FUNCION B y viceversa.
Declarar una variable local
Para crear una variable local debemos poner lo siguiente( las variables locales SOLO SE PUEDEN CREAR DENTRO DE UNA FUNCION):
También podemos crear una variable y darle un valor:
Por ejemplo:
local unit = miunidad
Tipos de variables:
Hay varios tipos de variables en warcraft, las más usadas (comunes) son las siguientes:
unit - guarda cualquier tipo de unidad.
boolean - guarda valores "true" o "false"
integer - guarda valores enteros, también Rawcodes (ID's de habilidades, unidades, etc)
real - guarda números con coma,.
effect - guarda un efecto especial del juego.
location - guarda un punto específico del mapa.
group - guarda un grupo de unidades.
trigger - guarda un detonador
Globales
Las variables globales pueden ser utilizadas en cualquier función.
Sim embargo hay que tener cuidado, ya que éstas se declaran dentro de un bloque Globals
Asi:
Este bloque puede ir en cualquier parte, pero es recomendable que que valla en la parte superior del detonador.
Creando un detonador
Con lo aprendido hasta ahora ya estamos en condiciones de crear nuestro primer detonador en vJASS.
Para poder hacer nuestro detonador, primero necesitamos saber la ESTRUCTURA de la función.
ejemplo:
function Init - declaramos la función y le damos el nombre Init
takes nothing - toma el argumento ninguno. pueden ser uno o más argumentos separados por una coma, , y especificando que tipo de datos se estan tomando. En este casom al ser ninguno, no se especifica.
returns nothing - devuelve el valor ninguno
Ahora para crear nuestro detonador necesitamos saber como llamar a las acciones. Las acciones se llaman usando "call"(llamar)
Por ejemplo:
Si no usamos call nos tirará error
Ahora sí, creemos el detonador:
solo necesitamos una cosita más: scope
PrimerTrigger : es el nombre que le damos a nuestro scope, NO PUEDEN REPETIRSE LOS NOMBRES Y SE ACEPTAN SOLO LETRAS Y NUMEROS.
initializer Init : Es la función que se ejecutará primero. En este caso, será la función Init (Init, es el nombre de la función. La función que primero se ejecuta, es la función que crea el trigger (detonador) y es donde nosotros le podemos decir en que función se encuentra el evento/condición/acción del trigger que acabamos de crear.
private function : El private, es para que sea una función privada, es decir, que esta función SOLAMENTE se podrá utilizar dentro del scope en donde se encuentra.
Ahora agreguemos las acciones:
Expliquemos que significa todo eso
local trigger t = CreateTrigger() - Se crea una variable de tipo trigger llamada t, que almacena un detonador. Create de crear, Trigger de detonador, Crear Detonador .
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT) - En esta línea, estamos diciéndo qué evento será el que dispare el detonador. En este caso, el evento es EVENT_PLAYER_UNIT_SPELL_EFFECT, osea, al lanzar una habilidad se dispara el detonador. La t es el detonador.
call TriggerAddAction(t, function Actions) - Decimos que las acciones del detonador t están en la función Actions.
call TriggerAddCondition(t, Condition(function Conditions)) - Decimos que las condiciones del detonador t están en la función Conditions.
set t = null - Seteamos el valor de t a nulo, para evitar memory leaks.
Y? Es tan difícil como pensaban?
ahora cramos la función Acions en la cual se encuentran las acciones.
Recuerden: las funciones que contienen las acciones NO PUEDEN TOMAR NI DEVOLVER VALORES.
Creo que no necesita explicación XD
Ahora creamos la función que contiene las condiciones:
Esta si la explico un poco:
returns boolean - hace que la función devuelva un valor verdadero o falso
Ahora les explico la estructura de un bloque If Then Else:
Si la condición es verdadera se realizan las acciones siguientes. En caso de que sea falsa, tenemos el bloque Else donde pondremos las acciones si es falsa.
Por último, cerramos el bloque If/Then/Else mediante endif
if IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true then - Si la unidad que lanzó el conjuro es un héroe, entonces realiza las acciones que siguen.
return true - la función devuelve un valor verdadero
else - el bloque en el que están las acciones si la condición es falsa
return false - devuelve un valor falso
endif - terminamos el bloque If/Then/Else
Recordemos que TODA FUNCIÓN QUE CONTENGA UNA CONDICIÓN DEBE DEVOLVER UN VALOR BOOLEAN(true o false). Si se devuelve false, la función no se ejecuta.
Ahora nuestro detonador quedaría así:
Ahora probamos nuestro mapa y a ver como funciona nuestro trigger
Cuando una una unidad lanza un hechizo, se activa el trigger. Comprueba si la unidad es un héroe o no. Si lo es, lo mata. Si no, no pasa nada
Eso es todo por ahora, SI TIENEN DUDAS PREGUNTEN!!!
Fuentes:
Parte de este post fue hecho a base de experiencias personales con vJASS. Mayor parte del contenido se basa en aportes de [Tienes que estar registrado y conectado para ver este vínculo]
He estado estudiando vJass en estos días y les traigo un tutorial de lo que he aprendido
Antes que nada, quiero dar un agradecimiento muy especial a Sauron y Musk sin los cuales no podría haber aprendido esto.
Esperá, cómo querés que aprenda vJass si ni siquiera sé qué es Jass???
Vamos por partes.
¿Qué es JASS?
Jass(Just Another Scripting Syntax) es el lenguaje de programación interno de Warcraft III.
¿Qué es vJASS?
Es una extensión personalizada de las funciones del JASS con algunas características extras.
¿Por qué vJASS?
La "v" viene de "very" y no por "Vexorian"(Un gran usuario de wc3c). Vexorian quería llamarlo JASS++, mientras que Zoxc sugirió vJASS por "veryJASS" y a Vexorian le gustó la idea.
¿Qué es JESP?
Muchos piensan que JESP es otro lenguaje o extensión de JASS o vJASS, pero en realidad no es ninguno de los dos.
JESP(JASS Enhanced Spell Pseudotemplate) es un argumento de la comunidad de codificadores que dice: "Toda spell debe tener una sección de CONFIGURACIÓN en el código. Denstro de esta configuación, el usuario debe ser capaz de modificar la spell sin necesidad de adentrarse en el código o sin necesidad de entenderlo. Una sección de configuración puede estar en CUALQUIER lugar de la spell"
¿Qué necesito para usar vJASS?
Necesitas el Jass NewGen pack ---> [Tienes que estar registrado y conectado para ver este vínculo]
¿Es difícil aprender vJASS?
Si alguna vez has programado no te será tan difícil. A medida que vas aprendiendo te va resultando más fácil.
¿Cómo uso JASS?
Simplemente crea un detonador vacío y ve a Editar > Convertir a texto personalizado.
Comencemos con el tuto:
¿Qué son las variables?
Las variables, como bien ha dicho Sauron, son como cajas, en las que se pueden almacenar datos. Podés guardar unidades, números o cadenas de texto(string).
Crear una variable
Se pueden crear dos tipos de variables: locales y globales
Variables locales
Las variables locales se pueden usar UNICAMENTE en la función en la cual han sido declaradas.
ah?
Las funciones son otras cajas en las que se almacenan acciones, tales como crear o matar una unidad. Éstas pueden tomar valores y devolver un valor.
Por ejemplo:
Tenemos dos funciones: Función A y función B.
Si en la función A creamos una variable local, esta variable NO PUEDE SER USADA EN LA FUNCION B y viceversa.
Declarar una variable local
Para crear una variable local debemos poner lo siguiente( las variables locales SOLO SE PUEDEN CREAR DENTRO DE UNA FUNCION):
- Código:
local <tipo de variable> <nombre>
También podemos crear una variable y darle un valor:
- Código:
local <tipo de variable> <nobmre> = <valor>
Por ejemplo:
local unit = miunidad
Tipos de variables:
Hay varios tipos de variables en warcraft, las más usadas (comunes) son las siguientes:
unit - guarda cualquier tipo de unidad.
boolean - guarda valores "true" o "false"
integer - guarda valores enteros, también Rawcodes (ID's de habilidades, unidades, etc)
real - guarda números con coma,.
effect - guarda un efecto especial del juego.
location - guarda un punto específico del mapa.
group - guarda un grupo de unidades.
trigger - guarda un detonador
Globales
Las variables globales pueden ser utilizadas en cualquier función.
Sim embargo hay que tener cuidado, ya que éstas se declaran dentro de un bloque Globals
Asi:
- Código:
globals
<tipo de variable> <nombre> = <valor>
endglobals
Este bloque puede ir en cualquier parte, pero es recomendable que que valla en la parte superior del detonador.
Creando un detonador
Con lo aprendido hasta ahora ya estamos en condiciones de crear nuestro primer detonador en vJASS.
Para poder hacer nuestro detonador, primero necesitamos saber la ESTRUCTURA de la función.
- Código:
function <nombre de la función> takes <argumento> returns <argumento>
endfunction
ejemplo:
- Código:
function Init takes nothing returns nothing
endfunction
function Init - declaramos la función y le damos el nombre Init
takes nothing - toma el argumento ninguno. pueden ser uno o más argumentos separados por una coma, , y especificando que tipo de datos se estan tomando. En este casom al ser ninguno, no se especifica.
returns nothing - devuelve el valor ninguno
Ahora para crear nuestro detonador necesitamos saber como llamar a las acciones. Las acciones se llaman usando "call"(llamar)
Por ejemplo:
- Código:
call KillUnit()
Si no usamos call nos tirará error
Ahora sí, creemos el detonador:
solo necesitamos una cosita más: scope
- Código:
scope Trigger1 initializer Init
private function Init takes nothing returns nothing
//acciones
endfunction
endscope
PrimerTrigger : es el nombre que le damos a nuestro scope, NO PUEDEN REPETIRSE LOS NOMBRES Y SE ACEPTAN SOLO LETRAS Y NUMEROS.
initializer Init : Es la función que se ejecutará primero. En este caso, será la función Init (Init, es el nombre de la función. La función que primero se ejecuta, es la función que crea el trigger (detonador) y es donde nosotros le podemos decir en que función se encuentra el evento/condición/acción del trigger que acabamos de crear.
private function : El private, es para que sea una función privada, es decir, que esta función SOLAMENTE se podrá utilizar dentro del scope en donde se encuentra.
Ahora agreguemos las acciones:
- Código:
scope Trigger1 initializer Init
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddAction(t, function Actions)
call TriggerAddCondition(t, Condition(function Conditions))
set t = null
endfunction
endscope
Expliquemos que significa todo eso
local trigger t = CreateTrigger() - Se crea una variable de tipo trigger llamada t, que almacena un detonador. Create de crear, Trigger de detonador, Crear Detonador .
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT) - En esta línea, estamos diciéndo qué evento será el que dispare el detonador. En este caso, el evento es EVENT_PLAYER_UNIT_SPELL_EFFECT, osea, al lanzar una habilidad se dispara el detonador. La t es el detonador.
call TriggerAddAction(t, function Actions) - Decimos que las acciones del detonador t están en la función Actions.
call TriggerAddCondition(t, Condition(function Conditions)) - Decimos que las condiciones del detonador t están en la función Conditions.
set t = null - Seteamos el valor de t a nulo, para evitar memory leaks.
Y? Es tan difícil como pensaban?
ahora cramos la función Acions en la cual se encuentran las acciones.
Recuerden: las funciones que contienen las acciones NO PUEDEN TOMAR NI DEVOLVER VALORES.
- Código:
private function Actions takes nothing returns nothing
call KillUnit(GetTriggerUnit())
call BJDebugMsg("Un héroe ha muerto por lanzar una habilidad")
endfunction
Creo que no necesita explicación XD
Ahora creamos la función que contiene las condiciones:
- Código:
private function Conditions takes nothing returns boolean
if IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true then
return true
else
return false
endif
endfunction
Esta si la explico un poco:
returns boolean - hace que la función devuelva un valor verdadero o falso
Ahora les explico la estructura de un bloque If Then Else:
- Código:
If <argumento> then
else
endif
Si la condición es verdadera se realizan las acciones siguientes. En caso de que sea falsa, tenemos el bloque Else donde pondremos las acciones si es falsa.
Por último, cerramos el bloque If/Then/Else mediante endif
if IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true then - Si la unidad que lanzó el conjuro es un héroe, entonces realiza las acciones que siguen.
return true - la función devuelve un valor verdadero
else - el bloque en el que están las acciones si la condición es falsa
return false - devuelve un valor falso
endif - terminamos el bloque If/Then/Else
Recordemos que TODA FUNCIÓN QUE CONTENGA UNA CONDICIÓN DEBE DEVOLVER UN VALOR BOOLEAN(true o false). Si se devuelve false, la función no se ejecuta.
Ahora nuestro detonador quedaría así:
- Código:
scope Trigger1 initializer Init
private function Conditions takes nothing returns boolean
if IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO) == true then
return true
else
return false
endif
endfunction
private function Actions takes nothing returns nothing
call KillUnit(GetTriggerUnit())
call BJDebugMsg("Un héroe ha muerto por lanzar una habilidad")
endfunction
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t, Condition(function Conditions))
call TriggerAddAction(t, function Actions)
set t= null
endfunction
endscope
Ahora probamos nuestro mapa y a ver como funciona nuestro trigger
Cuando una una unidad lanza un hechizo, se activa el trigger. Comprueba si la unidad es un héroe o no. Si lo es, lo mata. Si no, no pasa nada
Eso es todo por ahora, SI TIENEN DUDAS PREGUNTEN!!!
Fuentes:
Parte de este post fue hecho a base de experiencias personales con vJASS. Mayor parte del contenido se basa en aportes de [Tienes que estar registrado y conectado para ver este vínculo]
Última edición por lukario! el Sáb Mayo 19, 2012 5:51 pm, editado 6 veces