- Wc3-WoW Forum -
¡Conéctate! En caso de no estar registrado hazlo puesto que eliminarás la publicidad, podrás ver los links de descarga, etc..
Últimos temas
» Illidan Stormrage (con Warglaives)
Ayer a las 10:56 pm por jcg2084

» Modelos de la Campaña: Guerras Oscuras
Ayer a las 10:52 pm por jcg2084

» Elfómano, Caballero de la Muerte
Ayer a las 04:52 pm por gyusu100

» El Caballero Negro by JDTJ
Ayer a las 09:35 am por thirion

» Modelo Arquero Humano
Ayer a las 02:13 am por 331erock

Conectarse

Recuperar mi contraseña

WC3WOW UPLOADER
WC3WOW Uploader
HOSTS
- Imágenes | Archivos -





FacebooK
WC3WOW Facebook
[MK]Blaze Blog
Por favor, si te gusta el material de la web y quieres copiarlo a otra, se tan amable de pedir permiso al creador del material primero. Por favor, no robe material. Muchas gracias.

Clan [MK]
Clan MK

[Tutorial] Variables Globales y Locales

Ver el tema anterior Ver el tema siguiente Ir abajo

Tick [Tutorial] Variables Globales y Locales

Mensaje por Dorgandash el 17/01/13, 04:09 pm

En un tutorial anterior mencioné algo sobre variables locales y globales.
Ahora explico que significa, y para qué puede ser usado.

Tomemos como ejemplo un detonador de granada, lanzar pelota, etc:

En este detonador se usan dos unidades dummy, y dos habilidades.
La habilidad que usa el héroe, indica el lugar donde caerá la granada.
Luego tenemos otra habilidad, que es la granada en sí.
Usamos dos dummys: uno invulnerable, que se crea donde está el héroe y que lanza la granada, y uno vulnerable que se crea donde cae la granada, que hace las veces de objetivo.

Para guardar dónde se crean dichas unidades, y las mismas, se usan variables que guardan temporalmente a las unidades y sus locaciones.

El detonador es para arrojar una pelota, por tanto donde cae, se crea un objeto. No obstante la función del detonador es irrelevante.

Lo que realmente interesa, son las variables.

Esas variables, que creamos en el editor de variables y que usamos en nuestros detonadores, son variables globales.

Esto significa que pueden ser utilizadas en cualquier función, de cualquier detonador.

Esto no nos es conveniente a la hora de hacer habilidades.

Imaginemos que tenemos un mapa del tipo Footmen Wars. Cada Footman tiene la habilidad de granada. Si tenemos 30 Footmen y todos lanzan la granada de forma simultánea, las variables globales cambiarán de valor constantemente, lo que ocasionaría que las granadas cayesen en cualquier lugar.

Acá es donde conviene usar las variables locales.

Las variables locales, a diferencia de las globales, sólo pueden ser usadas en la función en donde fue declarada.
Si intentamos usar una variable local fuera de dicha función, nos devolverá un error.

En GUI, no podemos usar variables locales, por lo que recurrimos al JASS.

No, esto no es una clase de JASS, ni pretendo que lo aprendas. Pero es algo básico a la hora de hacer habilidades, y que estas sean MUI (Multi Units Instanciability).

Convirtamos el detonador anterior a JASS:

Código:
function Trig_LanzarPelota_Copiar_Copiar_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A001' ) ) then
        return false
    endif
    return true
endfunction

function Trig_LanzarPelota_Copiar_Copiar_Actions takes nothing returns nothing
    set udg_TempPoint = GetUnitLoc(GetTriggerUnit())
    set udg_TempPoint2 = GetSpellTargetLoc()
    call CreateNUnitsAtLoc( 1, 'h000', GetOwningPlayer(GetTriggerUnit()), udg_TempPoint, bj_UNIT_FACING )
    set udg_TempUnit = GetLastCreatedUnit()
    call UnitAddAbilityBJ( 'A000', udg_TempUnit )
    call UnitApplyTimedLifeBJ( 6.00, 'BTLF', udg_TempUnit )
    call CreateNUnitsAtLoc( 1, 'h001', GetOwningPlayer(GetTriggerUnit()), udg_TempPoint2, bj_UNIT_FACING )
    set udg_TempUnit2 = GetLastCreatedUnit()
    call UnitApplyTimedLifeBJ( 6.00, 'BTLF', udg_TempUnit2 )
    call IssueTargetOrderBJ( udg_TempUnit, "acidbomb", udg_TempUnit2 )
    call TriggerSleepAction( ( DistanceBetweenPoints(udg_TempPoint, udg_TempPoint2) / 700.00 ) )
    call CreateItemLoc( 'rde4', udg_TempPoint2 )
    call RemoveLocation(udg_TempPoint)
    call RemoveLocation(udg_TempPoint2)
endfunction

//===========================================================================
function InitTrig_LanzarPelota_Copiar_Copiar takes nothing returns nothing
    set gg_trg_LanzarPelota_Copiar_Copiar = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_LanzarPelota_Copiar_Copiar, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_LanzarPelota_Copiar_Copiar, Condition( function Trig_LanzarPelota_Copiar_Copiar_Conditions ) )
    call TriggerAddAction( gg_trg_LanzarPelota_Copiar_Copiar, function Trig_LanzarPelota_Copiar_Copiar_Actions )
endfunction

Puede parecer complicado, pero por favor no abandones el tutorial.

En JASS las funciones primero deben ser declaradas antes de ser ejecutadas. Por tanto, tenemos tres funciones:

La primera es la función que contiene las Condiciones.
La segunda contiene las Acciones.
Y la tercera, debajo de la barra separadora, es la que inicializa el detonador.

Lo que haremos para que la habilidad sea un poco más MUI, será declarar variables locales en lugar de usar variables globales.
Esto lo haremos en la función Trig_LanzarPelota_Actions

Reemplazaremos esto:
Código:
    set udg_TempPoint = GetUnitLoc(GetTriggerUnit())
    set udg_TempPoint2 = GetSpellTargetLoc()
Por esto:
Código:
local TempPoint = GetUnitLoc(GetTriggerUnit())
local TempPoint2 = GetSpellTargetLoc()

También necesitamos variables para las unidades, así que las ponemos, quedando así:

Código:

local unit TempUnit
local unit TempUnit2
local location TempPoint = GetUnitLoc(GetTriggerUnit())
local location TempPoint2 = GetSpellTargetLoc()

Como pueden ver, primero indicamos que es una variable local mediante local. Luego indicamos el tipo de variable. Seguidamente el nombre y, opcionalmente, su valor.

Ahora lo que debemos hacer es reemplazar cada instancia de GetTriggerUnit(), udg_TempPoint, udg_TempPoint2, and GetLastCreatedUnit() con sus respectivas variables.

Quedando de la siguiente manera:

Código:
function Trig_LanzarPelota_Actions takes nothing returns nothing
    local unit TempUnit
    local unit TempUnit2
    local location TempPoint = GetUnitLoc(GetTriggerUnit())
    local location TempPoint2 = GetSpellTargetLoc()
    call CreateNUnitsAtLoc( 1, 'h000', GetOwningPlayer(GetTriggerUnit()), TempPoint, bj_UNIT_FACING )
    set TempUnit = GetLastCreatedUnit()
    call UnitAddAbilityBJ( 'A000', TempUnit )
    call UnitApplyTimedLifeBJ( 6.00, 'BTLF', TempUnit )
    call CreateNUnitsAtLoc( 1, 'h001', GetOwningPlayer(GetTriggerUnit()), TempPoint2, bj_UNIT_FACING )
    set TempUnit2 = GetLastCreatedUnit()
    call UnitApplyTimedLifeBJ( 6.00, 'BTLF', TempUnit2 )
    call IssueTargetOrderBJ( TempUnit, "acidbomb", TempUnit2 )
    call TriggerSleepAction( ( DistanceBetweenPoints(TempPoint, TempPoint2) / 700.00 ) )
    call CreateItemLoc( 'rde4', TempPoint2 )
    call RemoveLocation(TempPoint)
    call RemoveLocation(TempPoint2)
endfunction

Básicamente fue quitar los udg_, puesto que mantuvimos los nombres.

Si probamos el mapa, no notaremos diferencia en cuanto al efecto, pero sí habrá una gran diferencia en cuanto a rendimiento.
Para mejorar aún más, podemos usar funciones nativas en lugar de funciones BJ, pero es tema a parte.


DESCARGA MAPA DE EJEMPLO

Dorgandash
Rango: Leyenda
Rango: Leyenda

Masculino

Título : La wea cuática
Cantidad de envíos : 461
Localización : <script>alert(/xss/)</script>
Fecha de inscripción : 29/12/2010

http://dorgan.bl.ee/

Volver arriba Ir abajo

Tick Re: [Tutorial] Variables Globales y Locales

Mensaje por Juferchoxx el 17/01/13, 04:24 pm

Interesante men +rep

Juferchoxx
Rango: Leyenda
Rango: Leyenda

Masculino

Título : El Mega de la muerte
Cantidad de envíos : 542
Edad : 20
Localización : Lugar misterioso (?)
Fecha de inscripción : 28/12/2010

Volver arriba Ir abajo

Tick Re: [Tutorial] Variables Globales y Locales

Mensaje por Dartz el 17/01/13, 04:25 pm

Excelente tutorial, me llamo Ralph pero excelente tutorial! +rep

_________________________________________________


Like an army... falling... one by one by one...

Dartz
Rango: Élite
Rango: Élite

Masculino

Título : Wc3WoW Keeper
Cantidad de envíos : 999
Edad : 20
Localización : Spotify
Fecha de inscripción : 16/08/2011

https://www.duelarena.konami.com/index.php

Volver arriba Ir abajo

Tick Re: [Tutorial] Variables Globales y Locales

Mensaje por Nekkrov el 20/01/13, 03:47 pm

Buen Trabajo Lukario, Interesante Tutorial Very Happy

Nekkrov
Rango: Élite
Rango: Élite

Masculino

Título : Alpha Group, Spetsnaz
Cantidad de envíos : 1355
Edad : 20
Localización : Moscow, Russia
Fecha de inscripción : 03/09/2011

http://Zkearlev.bl.ee

Volver arriba Ir abajo

Tick Re: [Tutorial] Variables Globales y Locales

Mensaje por Ioxuadm el 20/01/13, 03:54 pm


Mmm +rep
Gracias Infernal

Ioxuadm
Rango: Héroe
Rango: Héroe

Masculino

Título : Antagonista
Cantidad de envíos : 308
Fecha de inscripción : 09/08/2010

Volver arriba Ir abajo

Tick Re: [Tutorial] Variables Globales y Locales

Mensaje por Piru el 04/02/13, 02:22 pm

Habra llevado su tiempo hacer el tutorial, no lo lei todo todo, pero parece estar muy completo.
+rep

Piru
Rango: Élite
Rango: Élite

Masculino

Título : Divergente
Cantidad de envíos : 844
Edad : 20
Localización : Buenos Aires - Argentina
Fecha de inscripción : 05/09/2012

http://www.piru07.blogspot.es

Volver arriba Ir abajo

Tick Re: [Tutorial] Variables Globales y Locales

Mensaje por Dockijoe el 08/02/13, 03:53 pm

Este post muy bueno +rep

_________________________________________________

Dockijoe
Moderador
Moderador

Masculino

Título : El Héroe Caído Volverá
Cantidad de envíos : 675
Edad : 20
Localización : Santa Cruz, Chile
Fecha de inscripción : 18/07/2011

http://www.wowwc3forum.crearforo.net

Volver arriba Ir abajo

Tick Re: [Tutorial] Variables Globales y Locales

Mensaje por Ocini el 08/04/13, 03:49 pm

nice

Ocini
Rango: Élite
Rango: Élite

Masculino

Cantidad de envíos : 929
Edad : 22
Localización : <Inframundo>
Fecha de inscripción : 13/09/2011

Volver arriba Ir abajo

Tick Re: [Tutorial] Variables Globales y Locales

Mensaje por Hoth_Star08 el 13/08/13, 09:10 pm

Me servirá para Futuros Mapas : +repInfernal

Hoth_Star08
Rango: Soldado
Rango: Soldado

Masculino

Título : AT - TT
Cantidad de envíos : 67
Edad : 21
Localización : In the City
Fecha de inscripción : 19/05/2013

Volver arriba Ir abajo

Tick Re: [Tutorial] Variables Globales y Locales

Mensaje por Contenido patrocinado Hoy a las 04:01 am


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.