Foro especializado en Warcraft III y su editor
 
BuscarEntrar al ChatboxPortal del foroÍndiceSpellsRegistrarseConectarse
Eventos Actuales
¡ Bienvenido Invitado !

Editar Perfil

Tus temas
Tus Mensajes ()

Enlaces rápidos








Comparte
 

 Sistema de Camaras (WWCAM) 1.0

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
WonderWoman
Capitán
WonderWoman


Barra de Salud : Su salud está al 100% - Este usuario no ha recibido infracciones

Mensajes Mensajes : 129
Reputación Reputación : 28
Monedas de oro : 830
Monedas de Platino : 0 Sistema de Camaras (WWCAM) 1.0 Empty

Inventario :
Sistema de Camaras (WWCAM) 1.0 Empysl10 Sistema de Camaras (WWCAM) 1.0 Empysl10 Sistema de Camaras (WWCAM) 1.0 Empysl10
Sistema de Camaras (WWCAM) 1.0 Empysl10 Sistema de Camaras (WWCAM) 1.0 Empysl10 Sistema de Camaras (WWCAM) 1.0 Empysl10

Sistema de Camaras (WWCAM) 1.0 Empty
Mensaje(#) Tema: Sistema de Camaras (WWCAM) 1.0 Sistema de Camaras (WWCAM) 1.0 Clock10Dom Mar 02, 2014 6:36 pm

WWCAM
Version 1.0
WonderWoman



Este sistema permite crear un campo de cámaras que se funden con transiciones suaves. Las transiciones están determinadas por la posición actual del objetivo de la cámara para cada jugador.
De esta forma se crean areas dominadas por ciertas camaras sin usar regiones ni cambios bruscos en la cámara. Tan solo vean el mapa de prueba para entender de que estoy hablando.
El sistema soporta una cantidad ilimitada de cámaras y el uso de recursos no depende de la cantidad de cámaras agregadas al sistema, sin embargo utilizar muchas cámaras aumenta el tiempo en el que carga el sistema al costo de mantener la performance constante.



[jass]library WWCAM
//WWCAM 1.0 por WonderWoman
//-------------------------
//
//Funciones Publicas:
/*
function WWCAM_Iniciar takes real Frecuencia, real Smoth returns nothing

function WWCAM_AgregarCamara takes camerasetup Camara, real Potencia, real Rango returns nothing

function WWCAM_Activar takes nothing returns nothing

function WWCAM_Desactivar takes nothing returns nothing

function WWCAM_AplicarCamara takes nothing returns nothing

function WWCAM_CamaraJugador takes player Jugador, boolean CamaraActiva returns nothing

function WWCAM_ActivarTodosLosJugadores takes nothing returns nothing

function WWCAM_DeterminarLimites takes rect r returns nothing

function WWCAM_DetonadorCargaFinalizada takes trigger t returns nothing

*/

globals
   //Constantes
   private constant integer CAM_FIELD_ZOFFSET = 6
   private constant integer CAM_FIELD_ROTATION = 5
   private constant integer CAM_FIELD_ANGLE_OF_ATTACK = 2
   private constant integer CAM_FIELD_TARGET_DISTANCE = 0
   private constant integer CAM_FIELD_ROLL = 4
   private constant integer CAM_FIELD_FIELD_OF_VIEW = 3
   private constant integer CAM_FIELD_FARZ = 1
   private constant integer PODER = 7
   private constant integer CAM_FIELD_ROTATION_Pow = 8
   private constant integer CAM_FIELD_ANGLE_OF_ATTACK_Pow = 9
   private constant integer CAM_FIELD_ROLL_Pow = 10
   private constant real DELTA = 64.0
   private constant real FACTOR_PODER = 100.0
   private constant real PODERMINIMO = 5.0
   private constant real POTENCIAMINIMA = 1.0
   private constant real POTENCIAMAXIMA = 100.0
   private constant real FRECUENCIAMAXIMA = 60.0
   private constant real RANGOMINIMOCUADRADO = 200.0*200.0
   private constant real MAXIMAEXCURSION = 3.0
   private constant real MAXIMOSMOTH = 3.0
   private constant real MINIMOSMOTH = 0.25
   private constant integer JUGADORMARRON = 11
   private constant integer NOTIMEOUT = 500
   
   //Variables
   private hashtable array CamH
   private real XMax
   private real YMax
   private real XMin
   private real YMin
   private timer CamaraTimer
   private boolean SistemaIniciado = false
   private real Periodo = 0.0
   private real SmothFactor = 1.0
   private real RET_PoderAngular
   private camerasetup array LocalCam
   private boolean array CamaraPlayer
   private camerasetup PAR_Camara
   private real PAR_Potencia
   private real PAR_Rango
   private trigger InstanciaAC = CreateTrigger()
   private integer CamarasCargando = 0
   private trigger TriggerCargaFinalizada = null
   
endglobals

private function wwModuloCuadrado takes real r1, real r2 returns real
   return r1*r1+r2*r2
endfunction

private function AjusteACuadricula takes real r returns real
   return r-ModuloReal(r, DELTA)
endfunction

private function SumaAngular takes real Angulo1, real Poder1, real Angulo2, real Poder2 returns real
   local real X = Poder1*Cos(Angulo1)+Poder2*Cos(Angulo2)
   local real Y = Poder1*Sin(Angulo1)+Poder2*Sin(Angulo2)
   set RET_PoderAngular = SquareRoot(wwModuloCuadrado(X, Y))
   return Atan2(Y, X)
endfunction

function WWCAM_AgregarCamara takes camerasetup Camara, real Potencia, real Rango returns nothing
   set PAR_Camara = Camara
   set PAR_Potencia = Potencia
   set PAR_Rango = Rango
   set CamarasCargando = CamarasCargando + 1
   call TriggerExecute(InstanciaAC)
endfunction

function AgregarCamara takes nothing returns nothing
   local real Potencia = PAR_Potencia
   local real Rango = PAR_Rango
   local integer x
   local integer y
   local real Distancia2
   local real Poder
   local real PoderAnterior
   local real PoderTotal
   local real PoderF
   local real PoderAnteriorF
   local real CamXT = CameraSetupGetDestPositionX(PAR_Camara)
   local real CamYT = CameraSetupGetDestPositionY(PAR_Camara)
   local real MinX = RMaxBJ(AjusteACuadricula(CamXT-MAXIMAEXCURSION*Rango), XMin)
   local real MinY = RMaxBJ(AjusteACuadricula(CamYT-MAXIMAEXCURSION*Rango), YMin)
   local real MaxX = RMinBJ(AjusteACuadricula(CamXT+MAXIMAEXCURSION*Rango), XMax)
   local real MaxY = RMinBJ(AjusteACuadricula(CamYT+MAXIMAEXCURSION*Rango), YMax)
   local real X = MinX
   local real Y = MinY
   local real VarianzaX2 = RMaxBJ(Rango*Rango, RANGOMINIMOCUADRADO)
   local integer Cuenta = 0
   //-------------------------
   local real DesplazamientoZ = CameraSetupGetField(PAR_Camara, CAMERA_FIELD_ZOFFSET)
   local real Rotacion = Deg2Rad(CameraSetupGetField(PAR_Camara, CAMERA_FIELD_ROTATION))
   local real AngulodeAtaque = Deg2Rad(CameraSetupGetField(PAR_Camara, CAMERA_FIELD_ANGLE_OF_ATTACK))
   local real Distancia = CameraSetupGetField(PAR_Camara, CAMERA_FIELD_TARGET_DISTANCE)
   local real Rodar = Deg2Rad(CameraSetupGetField(PAR_Camara, CAMERA_FIELD_ROLL))
   local real CampodeVision = CameraSetupGetField(PAR_Camara, CAMERA_FIELD_FIELD_OF_VIEW)
   local real RecorteLejano = CameraSetupGetField(PAR_Camara, CAMERA_FIELD_FARZ)
   //-------------------------
   set Potencia = RMaxBJ(RMinBJ(Potencia, POTENCIAMAXIMA), POTENCIAMINIMA)*FACTOR_PODER
   loop
   exitwhen Y > MaxY
       loop
       exitwhen X > MaxX
           set x = R2I(X/DELTA)
           set y = R2I(Y/DELTA)
           set Distancia2 = wwModuloCuadrado(X-CamXT, Y-CamYT)
           set Poder = Potencia*Pow(bj_E, -(Distancia2/VarianzaX2))
           if Poder >= PODERMINIMO then
               set PoderAnterior = LoadReal(CamH[PODER], x, y)
               set PoderTotal = Poder+PoderAnterior
               set PoderF = Poder/PoderTotal                    //Evita multiples divisiones
               set PoderAnteriorF = PoderAnterior/PoderTotal    //Evita multiples divisiones
               call SaveReal(CamH[CAM_FIELD_ZOFFSET], x, y, (PoderAnteriorF*LoadReal(CamH[CAM_FIELD_ZOFFSET], x, y) + PoderF*DesplazamientoZ))
               call SaveReal(CamH[CAM_FIELD_ROTATION], x, y, SumaAngular(LoadReal(CamH[CAM_FIELD_ROTATION], x, y), LoadReal(CamH[CAM_FIELD_ROTATION_Pow], x, y), Rotacion, Poder))
               call SaveReal(CamH[CAM_FIELD_ROTATION_Pow], x, y, RET_PoderAngular)
               call SaveReal(CamH[CAM_FIELD_ANGLE_OF_ATTACK], x, y, SumaAngular(LoadReal(CamH[CAM_FIELD_ANGLE_OF_ATTACK], x, y), LoadReal(CamH[CAM_FIELD_ANGLE_OF_ATTACK_Pow], x, y), AngulodeAtaque, Poder))
               call SaveReal(CamH[CAM_FIELD_ANGLE_OF_ATTACK_Pow], x, y, RET_PoderAngular)
               call SaveReal(CamH[CAM_FIELD_TARGET_DISTANCE], x, y, (PoderAnteriorF*LoadReal(CamH[CAM_FIELD_TARGET_DISTANCE], x, y) + PoderF*Distancia))
               call SaveReal(CamH[CAM_FIELD_ROLL], x, y, SumaAngular(LoadReal(CamH[CAM_FIELD_ROLL], x, y), LoadReal(CamH[CAM_FIELD_ROLL_Pow], x, y), Rodar, Poder))
               call SaveReal(CamH[CAM_FIELD_ROLL_Pow], x, y, RET_PoderAngular)
               call SaveReal(CamH[CAM_FIELD_FIELD_OF_VIEW], x, y, (PoderAnteriorF*LoadReal(CamH[CAM_FIELD_FIELD_OF_VIEW], x, y) + PoderF*CampodeVision))
               call SaveReal(CamH[CAM_FIELD_FARZ], x, y, (PoderAnteriorF*LoadReal(CamH[CAM_FIELD_FARZ], x, y) + PoderF*RecorteLejano))
               call SaveReal(CamH[PODER], x, y, PoderTotal)
           endif
           set X = X + DELTA
           set Cuenta = Cuenta + 1
           if Cuenta >= NOTIMEOUT then
               set Cuenta = 0
               call TriggerSleepAction(0.0)    //Anti Time-Out
           endif
       endloop
       set X = MinX
       set Y = Y + DELTA
   endloop
   call TriggerSleepAction(0.0)
   set CamarasCargando = CamarasCargando - 1
   if CamarasCargando <= 0 and TriggerCargaFinalizada != null then
       call TriggerExecute(TriggerCargaFinalizada)
   endif
endfunction

private function Promedio takes integer Campo, integer x, integer y, real PLB, real PRB, real PLT, real PRT returns real
   local real PoderTotal = PLB+PRB+PLT+PRT
   local real Retorno
   local real X
   local real Y
   if Campo != CAM_FIELD_ROTATION and Campo != CAM_FIELD_ANGLE_OF_ATTACK and Campo != CAM_FIELD_ROLL then
       set Retorno = PLB*LoadReal(CamH[Campo], x, y)+PRB*LoadReal(CamH[Campo], x+1, y)+PLT*LoadReal(CamH[Campo], x, y+1)+PRT*LoadReal(CamH[Campo], x+1, y+1)
       set Retorno = Retorno/PoderTotal
   else
       set X = PLB*Cos(LoadReal(CamH[Campo], x, y))
       set Y = PLB*Sin(LoadReal(CamH[Campo], x, y))
       set X = X + PRB*Cos(LoadReal(CamH[Campo], x+1, y))
       set Y = Y + PRB*Sin(LoadReal(CamH[Campo], x+1, y))
       set X = X + PLT*Cos(LoadReal(CamH[Campo], x, y+1))
       set Y = Y + PLT*Sin(LoadReal(CamH[Campo], x, y+1))
       set X = X + PRT*Cos(LoadReal(CamH[Campo], x+1, y+1))
       set Y = Y + PRT*Sin(LoadReal(CamH[Campo], x+1, y+1))
       if wwModuloCuadrado(X, Y) > 0.0 then
           set Retorno = ModuloReal(Atan2BJ(Y, X), 360.0)
       else
           set Retorno = 0.0
       endif
   endif
   return Retorno
endfunction

function WWCAM_AplicarCamara takes nothing returns nothing
   local real XCam
   local real YCam
   local real PLB
   local real PRB
   local real PLT
   local real PRT
   local real dx
   local real dy
   local integer x
   local integer y
   local real PoderAcumulado
   //
   local player p
   local integer i = 0
   loop
   exitwhen i > JUGADORMARRON
       set p = Player(i)
       if CamaraPlayer[i] and GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(p) == MAP_CONTROL_USER then
           if GetLocalPlayer() == p then
               set XCam = GetCameraTargetPositionX()
               set YCam = GetCameraTargetPositionY()
               set dx = ModuloReal(XCam, DELTA)
               set dy = ModuloReal(YCam, DELTA)
               set x = R2I((XCam-dx)/DELTA)
               set y = R2I((YCam-dy)/DELTA)
               set PLB = LoadReal(CamH[PODER],   x,   y) * (dx*dy)
               set PRB = LoadReal(CamH[PODER], x+1,   y) * ((DELTA-dx)*dy)
               set PLT = LoadReal(CamH[PODER],   x, y+1) * (dx*(DELTA-dy))
               set PRT = LoadReal(CamH[PODER], x+1, y+1) * ((DELTA-dx)*(DELTA-dy))
               set PoderAcumulado = PLB+PRB+PLT+PRT
               if PoderAcumulado > 0.0 then
                   call CameraSetupSetField(LocalCam[i], CAMERA_FIELD_ZOFFSET, Promedio(CAM_FIELD_ZOFFSET, x, y, PLB, PRB, PLT, PRT), SmothFactor)
                   call CameraSetupSetField(LocalCam[i], CAMERA_FIELD_ROTATION, Promedio(CAM_FIELD_ROTATION, x, y, PLB, PRB, PLT, PRT), SmothFactor)
                   call CameraSetupSetField(LocalCam[i], CAMERA_FIELD_ANGLE_OF_ATTACK, Promedio(CAM_FIELD_ANGLE_OF_ATTACK, x, y, PLB, PRB, PLT, PRT), SmothFactor)
                   call CameraSetupSetField(LocalCam[i], CAMERA_FIELD_TARGET_DISTANCE, Promedio(CAM_FIELD_TARGET_DISTANCE, x, y, PLB, PRB, PLT, PRT), SmothFactor)
                   call CameraSetupSetField(LocalCam[i], CAMERA_FIELD_ROLL, Promedio(CAM_FIELD_ROLL, x, y, PLB, PRB, PLT, PRT), SmothFactor)
                   call CameraSetupSetField(LocalCam[i], CAMERA_FIELD_FIELD_OF_VIEW, Promedio(CAM_FIELD_FIELD_OF_VIEW, x, y, PLB, PRB, PLT, PRT), SmothFactor)
                   call CameraSetupSetField(LocalCam[i], CAMERA_FIELD_FARZ, Promedio(CAM_FIELD_FARZ, x, y, PLB, PRB, PLT, PRT), SmothFactor)
                   call CameraSetupApply(LocalCam[i], false, false)
               endif
           endif
       endif
       set i = i + 1
   endloop
   set p = null
endfunction

function WWCAM_CamaraJugador takes player Jugador, boolean CamaraActiva returns nothing
   local integer Jug = GetPlayerId(Jugador)
   if Jug >= 0 and Jug <= 11 then
       set CamaraPlayer[Jug] = CamaraActiva
   endif
endfunction

function WWCAM_ActivarTodosLosJugadores takes nothing returns nothing
   local integer i = 0
   local player p
   loop
   exitwhen i > JUGADORMARRON
       set p = Player(i)
       if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(p) == MAP_CONTROL_USER then
           set CamaraPlayer[i] = true
       endif
       set i = i + 1
   endloop
endfunction

function WWCAM_Activar takes nothing returns nothing
   if Periodo != 0.0 then
       call TimerStart(CamaraTimer, Periodo, true, function WWCAM_AplicarCamara)
   endif
endfunction

function WWCAM_Desactivar takes nothing returns nothing
   call PauseTimer(CamaraTimer)
endfunction

function WWCAM_DeterminarLimites takes rect r returns nothing
   set XMax = GetRectMaxX(r) - ModuloReal(GetRectMaxX(r), DELTA)
   set YMax = GetRectMaxY(r) - ModuloReal(GetRectMaxY(r), DELTA)
   set XMin = GetRectMinX(r) - ModuloReal(GetRectMinX(r), DELTA)
   set YMin = GetRectMinY(r) - ModuloReal(GetRectMinY(r), DELTA)
endfunction

function WWCAM_DetonadorCargaFinalizada takes trigger t returns nothing
   set TriggerCargaFinalizada = t
endfunction

function WWCAM_Iniciar takes real Frecuencia, real Smoth returns nothing
   local rect r
   local integer i = 0
   if SistemaIniciado == false then
       set SistemaIniciado = true
       set CamH[CAM_FIELD_ZOFFSET] = InitHashtable()
       set CamH[CAM_FIELD_ROTATION] = InitHashtable()
       set CamH[CAM_FIELD_ROTATION_Pow] = InitHashtable()
       set CamH[CAM_FIELD_ANGLE_OF_ATTACK] = InitHashtable()
       set CamH[CAM_FIELD_ANGLE_OF_ATTACK_Pow] = InitHashtable()
       set CamH[CAM_FIELD_TARGET_DISTANCE] = InitHashtable()
       set CamH[CAM_FIELD_ROLL] = InitHashtable()
       set CamH[CAM_FIELD_ROLL_Pow] = InitHashtable()
       set CamH[CAM_FIELD_FIELD_OF_VIEW] = InitHashtable()
       set CamH[CAM_FIELD_FARZ] = InitHashtable()
       set CamH[PODER] = InitHashtable()
       set r = GetWorldBounds()
       call WWCAM_DeterminarLimites(r)
       call RemoveRect(r)
       loop
       exitwhen i > JUGADORMARRON
           set LocalCam[i] = CreateCameraSetup()
           set i = i + 1
       endloop
       set SmothFactor = RMaxBJ(MINIMOSMOTH, RMinBJ(MAXIMOSMOTH, Smoth))
       if Frecuencia > 0.0 then
           set Periodo = 1.0/RMinBJ(Frecuencia, FRECUENCIAMAXIMA)
           set CamaraTimer = CreateTimer()
       endif
       call TriggerAddAction(InstanciaAC, function AgregarCamara)
   endif
   set r = null
endfunction

endlibrary
[/jass]

CLICK PARA VER EL EJEMPLO


and it makes me wonder...
Volver arriba Ir abajo
 

Sistema de Camaras (WWCAM) 1.0

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 1.

 Temas similares

-
» Silhouette Core - Sistema de rol con d6
» Sobre la educación moderna & Sistema educativo español
» Filosofía de la Política: El Sistema Político Ideal
» Nuevo sistema de crianza
» Planeswalker Points

Permisos de este foro:No puedes responder a temas en este foro.
Warcraft III - WorldEditor :: Aportes :: Librerías-