Lluvia Efficiente Tutorial

Iniciado por Roack16, Febrero 12, 2009, 08:49:01 AM

Tema anterior - Siguiente tema

Roack16

Desde hace tiempo eh querido postear esto y alfin me decido.

Cuantos ah querido hacer un buen effecto de lluevia sin lag como el nuts?
aqui les tengo una sencilla solucion!

tan solo estos pequenos codigos ACS y decorate y uno que otro sprites...
#include "zcommon.acs"

script 1 OPEN
{
int i;
i=0;
while (i<#Gotas)
{
Spawn("rain",GetActorx(#PlayerId)+cos(random(0,360)*0.0175)*random(0,#Radio),GetActory(#PlayerId)-sin(random(0,360)*0.0175)*random(0,#Radio),#Altura,0,0);
i+=1;
}
delay(#Constancia);
restart;
}

deja les explico...
lo que hacemos esque aparesca las gotas de lluvia en un radio que nosotros queramos, este radio sigue al jugardor, les aclarare como personalizarlo para que les quede perfecto... (todo digito va sin el #)

la primera nota (#Gotas) es cuantos actores querramos que aparescan por cyclos, lo normal seria de 50-75, si queren lluvias mas pesadas o livianas, cambien este numero a mas alto o bajo,

El segundo (#PlayerID, hay dos de estos y deben valer lo mismo) normalmente siempre es 0 pero si ustedes le cambian el TAG del Player antes de que este script se ejecute, escriban el Tag que le dieron y si este sera permamente por el resto del mapa. para cosas mayores, les recomiendo usar una variable por si lo cambian constantemente el Tag del PLayer

El tercero (#Radio, tambien hay dos de estos) es que tan grande sera el circulo de donde estaran apareciendo, mas radio, gotas mas separadas, les recomiendo 2048.

El cuarto (#Altura) debe ser la altura del cielo menos 5 unidades, por ejemplo , si la altura del cielo es 512, quitenle 5 ( = 507)y tengan cuidado por que debe tener *.0 para que funcione, por ejemplo si le pondran 512 de altura escriban 507.0 (menos las 5 unidades), OJO... este debe ser un valor unico, todos los cielos deben tener la misma altura, y no deben tener sectore sque llegen a esta altura o veran la lluvia aparecer a mitad del sector!,
aunque si ustedes saben ACS sabran desactivar y activar el script o utilizar variables para la altura.

el ultimo (#Constancia) es cuando tarda cada cyclo, les recomiendo 1, pero si lo queren mas lento utilizen 2 o 3...

Listo el ACS...

Para el Decorate no necesitan mucho, solo el Codigo y los Sprites,
aqui esta el codigo

actor rain
{
 scale 0.25
 radius 1
 height 1
 speed 0
 PROJECTILE
 +NOBLOCKMAP
 +MISSILE
 +ACTIVATEPCROSS
 +ACTIVATEIMPACT
 -NOGRAVITY
 +SOLID
 +WINDTHRUST
 renderstyle Add
 states
 {
 Spawn:
   RAIN A -1
   stop
 Death:
   RAIN B 1
   RAIN C 1
   RAIN D 1
   RAIN E 1
   RAIN F 1
   RAIN G 1
   RAIN H 1
   RAIN I 1
   stop
 }
}


los sprites vienen en este ejemplo

http://www.badongo.com/file/13349005

espero que les sirva... y espero poder escribir otros minitutoriales...

doom man

Esta muy bueno tu tuto.Me servira tal vez para un mapa que nunca termine, de paso, no sabes como hacer que los enemigos no se maten entre si ?

Gracias  :D

Karnizero

El problema de hacer lluvia mediante ACS es: ¿qué ocurre si el jugador entra dentro de un edificio?

Esto mismo ya lo había propuesto yo en el foro de DoomWorld, pero algo más completo.

Tienes que añadir otros dos scripts para controlar cuándo el jugador entra y sale de los edificios, haciendo que la lluvia se "quede" en el exterior, y haciendo que siga al jugador de nuevo, cuando salga del edificio.

De todas formas, es muy limitado, ya que si la lluvia se queda en la parte exterior de la puerta de entrada, y una vez dentro, el jugador mira por una ventana, hacia el exterior, verá que no hay lluvia.

Esto se puede solucionar con otro script que mueva la lluvia hacia el exterior de la ventana por la que se está mirando.

Es mucho mejor hacer lluvia sólo mediante Decorate, sin ACS. Te ahorras mucho tiempo y trabajo.

Hay otra manera de hacer lluvia sin Decorate ni ACS, que incluso funciona con Boom, pero aún estoy experimentando, y si me sale bastante realista, quizás lo ponga en mi mapa del torneo de Boom.

Si al final no la pongo, explicaré cómo hacerlo (es más sencillo de lo que parece).

[Edit]

Se me olvidó enseñar una cosa:

Spoiler
[close]

Está hecho con Vavoom, y no son sprites, si no "partículas" (como las que se ven cuando explota un Barril, un misil, o el plasma contra la pared).
Son simples partículas blancas.

No sé si zDoom o GzDoom permite definir partículas.
En caso afirmativo, la cosa la tendríais mucho más fácil.
Además, lo bueno de las partículas es que no ralentizan tanto el juego como los sprites.

Roack16

ACS_Terminate
ACS_execute

asi de facil... solo es procurar que la entrada tenga el techo mas bajo que el cielo y cuando el jugador ya no vea  el exterior, en un linea ejecutar ACS_Terminate, y cuando SAlga ACS_Execute...
Peor si hay una manera de que este script sea perfecto... este script es solo un pedazo de otro que desarrolle... DOnde utiliza la FUncion GetActorCheckCeiling, pero esta funcion solo esta en la Subversion, si todos tuvieran esa version les pasaria el script y esta lluvia seria perfecta... sin decir cuanta altura o actibvarlo o desactivarlo...
Si alguno quiere el script original y tiene la SUbversion de ZDoom avisadme por MP...
el ZDoom no admite particulas... y es mas dificil definir lluvia asi... ya que le tienes que indicar en que partes apareceran... y el Emitter tinee que ser rectangular... y eso a veces da problemas... en internet hay un Addon para el Doomsday de lluvia...

Karnizero

Cita de: "Roack16"ACS_Terminate
ACS_execute

Con ACS_Terminate, dejaría de "spawnear" los actores "lluvia", así que si el jugador entra en el edificio, pero se da la vuelta para mirar hacia afuera de la puerta, verá que la lluvia desapareció.

Tienes que crear un script de forma que cuando pase por la puerta, las coordenadas de spawneo de la lluvia, se queden al lado de la puerta.

Cita de: "Roack16"asi de facil... solo es procurar que la entrada tenga el techo mas bajo que el cielo y cuando el jugador ya no vea  el exterior, en un linea ejecutar ACS_Terminate, y cuando SAlga ACS_Execute...
Peor si hay una manera de que este script sea perfecto... este script es solo un pedazo de otro que desarrolle... DOnde utiliza la FUncion GetActorCheckCeiling, pero esta funcion solo esta en la Subversion, si todos tuvieran esa version les pasaria el script y esta lluvia seria perfecta... sin decir cuanta altura o actibvarlo o desactivarlo...
Si alguno quiere el script original y tiene la SUbversion de ZDoom avisadme por MP...

¿Y para qué quieres saber la altura del sector? No hace falta para nada.

Puedes ver el código del "Hell Rod" (o como se llame) del Heretic. Me refiero al arma esa que cuando usas el tomo del poder, hace llover gotas de fuego. Fíjate que para esa "lluvia" no se ha usado ACS para nada.

Cita de: "Roack16"el ZDoom no admite particulas... y es mas dificil definir lluvia asi... ya que le tienes que indicar en que partes apareceran... y el Emitter tinee que ser rectangular... y eso a veces da problemas... en internet hay un Addon para el Doomsday de lluvia...

En Vavoom, puedes definir tus propios tipos de sector. Es decir, al igual que hay sectores que hacen daño, sectores que aplastan, o sectores en los que parpadea la luz, también puedes crear un tipo de sector en los que spawneen esas partículas.

Más fácil todavía es crear un objeto tipo "Map Spot", pero que haga que el sector en el que esté, produzca esas partículas blancas de nieve.

En Vavoom no tiene mucha dificultad hacerlo.

Roack16

Tienes toda la razon... no es tan efficiente la lluvia... pero para el ACS_terminate lo adecuado es usarlo en una parte donde aunque des vuelta no veas el exterior...
este codigo es simple y rapido... aparte... lo sustraje del original que hice... pero se necesitaria que ejecutaran el WAD en la version SVN (o SNV @.@).
...
Por cierto ya revise el de herectic... y si utiliza ACS!
algunas funciones puedes usar en el DEcorate... y es cuadrado el rango y eso lo notarias a simple vista si los hicieran grande, en mi caso... es redondo la figura en que aparecen los actores...
y lo repito de nuevo... el script original utiliza la version SVN de ZDoom...
lo del Vavoom... acepto tu idea...