Anterior | Índice | Siguiente
Capítulo 8: Partículas - Gravedad y Seguimiento del Mouse
Lenguaje: C#
Para: VS2005 / VS2008 / SharpDevelop 2.2
Por Dark-N: hernaldog@gmail.com
Visita mi Blog


http://darknromhacking.com

Ir a Parte 1 | Ir a Parte 2


Objetivo: En este capítulo, se harán 2 partículas con gravedad que siguen al mouse, si este se les acerca.

Nota: Para todo el tópico de partículas use el código libre hecho por uno de los programadores de SDL.Net Rob Loach.

La partícula más pequeña que podemos tener, es un simple pixel, que se trabaja como una partícula. Para esto SDL tiene la clase ParticlePixel. Esta se defime así:
ParticlePixel miParticula = new ParticlePixel(color de la particula, pocicion X, pocicion Y, velocidad, duracion (si es -1 es infinita));
Ejemplo:
ParticlePixel pixelParticula = new ParticlePixel(Color.White, 100, 200, new Vector(0, 0, 0), -1);
La partícula más grande que se puede tener es la de cualquier Surface que se trabaja como una partícula. Para esto se tiene la clase ParticleSprite. Se define así:
ParticleSprite miParticula = new ParticleSprite(Objeto Sprite,  pocicion X, pocicion Y, velocidad, duracion (si es -1 es infinita));
Ejemplo:
Sprite spr = new Sprite();
ParticleSprite second = new ParticleSprite(spr, 200, 200, new Vector(-7, -9, 0), 500);
La clase que nos sirve para darle "peso" o gravedad a los objetos es ParticleGravity y para manejar las fricciones entre partículas tenemos ParticleFriction, que se sefine así:
ParticleGravity miGravedad = new ParticleGravity(cuanta gravedad);
Ejemplo:
ParticleGravity grav = new ParticleGravity(0.5f);

ParticleFriction miFriccion = new ParticleFriction(cuanta friccion aplicar a la particula);
Ejemplo:
ParticleFriction fric = new ParticleFriction(0.1f);
Si se quiere que las partículas sigan al mouse solo si se les aserca, se usa la clase ParticleVortex, que se define así:
ParticleVortex miVortice = new ParticleVortex(fuerza, radio afectado);
Ejemplo:
ParticleVortex vort = new ParticleVortex(1f, 200f);
A más Fuerza, a penas muevas el mouse, las partículas lo seguiran con rapidez y con la trayectoria que tiene el movimiento del mouse, sobre todo si haces movimientos bruscos. El Radio permite regular cuan cerca tienes que acercar el mouse para que las partículas detecten el mouse para seguirlo.


Código fuente de está sección (VS2005/V2008):

#region LICENSE
/*
 * $RCSfile: ParticlesExample.cs,v $
 * Copyright (C) 2005 Rob Loach (http://www.robloach.net)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
#endregion LICENSE

using System;
using System.IO;
using System.Drawing;

using SdlDotNet.Particles;
using SdlDotNet.Particles.Emitters;
using SdlDotNet.Particles.Manipulators;
using SdlDotNet.Graphics.Sprites;
using SdlDotNet.Core;
using SdlDotNet.Input;
using SdlDotNet.Graphics;

namespace EjemploParticulas
{
	
	public class Ejemplo3 : IDisposable
	{
		ParticleSystem particles = new ParticleSystem();
		ParticleVortex vort = new ParticleVortex(1f, 200f);

		public Ejemplo3()
		{
			Video.WindowIcon();
			Video.WindowCaption = "SDL.NET - Particula Pixel y Particula Sprite";
			Video.SetVideoMode(400, 300);
			Events.KeyboardDown += new EventHandler(this.KeyboardDown);			
			Events.MouseMotion += new EventHandler(this.MouseMotion);
			Events.Fps = 30;
			Events.Tick += new EventHandler(this.Tick);
			Events.Quit += new EventHandler(this.Quit);
		}
		
		public void Go()
		{	

			//creamos una particula que es un pixel
			ParticlePixel first = new ParticlePixel(Color.White, 100, 200, new Vector(0, 0, 0), -1);
			particles.Add(first); // la agregamos al sistema
			
			//hacemos otra particula que es sprite animado
			AnimationCollection anim = new AnimationCollection();
			SurfaceCollection surfaces = new SurfaceCollection();
			surfaces.Add("BALL2.png", new Size(50, 50));
			anim.Add(surfaces, 1);
			AnimatedSprite marble = new AnimatedSprite(anim);
			marble.Animate = true;
			ParticleSprite second = new ParticleSprite(marble, 200, 200, new Vector(-7, -9, 0), 500);
			second.Life = -1;
			particles.Add(second); // la agregamos al sistema

			// agregamos manipuladores 
			ParticleGravity grav = new ParticleGravity(0.5f);
			particles.Manipulators.Add(grav); // Gravedad de 0.5f
			particles.Manipulators.Add(new ParticleFriction(0.3f)); // Slow down particles
			particles.Manipulators.Add(vort); // se agrega el efecto de vórtice si el mouse se acerca a la partícula
			particles.Manipulators.Add(new ParticleBoundary(SdlDotNet.Graphics.Video.Screen.Size)); // fix particles on screen.

			Events.Run();
		}


		[STAThread]
		public static void Main()
		{
			Ejemplo3 particula = new Ejemplo3();
			particula.Go();
		}

		
		private void Tick(object sender, TickEventArgs e)
		{
			particles.Update();
			Video.Screen.Fill(Color.Black);
			particles.Render(Video.Screen);
			Video.Screen.Update();
		}

		private void KeyboardDown(object sender, KeyboardEventArgs e)
		{
			if (e.Key == Key.Escape)
			{
				Events.QuitApplication();
			}			
		}

		private void Quit(object sender, QuitEventArgs e)
		{
			Events.QuitApplication();
		}		
		
		private void MouseMotion(object sender, MouseMotionEventArgs e)
		{
			vort.X = e.X;
			vort.Y = e.Y;
		}		

		#region IDisposable Members

		private bool disposed;

		/// 
		/// Destroy object
		/// 
		public void Dispose()
		{
			this.Dispose(true);
			GC.SuppressFinalize(this);
		}

		/// 
		/// Destroy object
		/// 
		public void Close()
		{
			Dispose();
		}

		/// 
		/// Destroy object
		/// 
		~Ejemplo3()
		{
			Dispose(false);
		}
		/// 
		/// 
		/// 
		/// 
		protected virtual void Dispose(bool disposing)
		{
			if (!this.disposed)
			{
				this.disposed = true;
			}
		}

		#endregion
	}
}

Una vez codificado, si al compilar no arroja errores, debe aparecerte algo como esto al hacer clic en la pantalla:



Bajar proyecto para SharpDevelop 2.2 (lo siento, esta vez no lo hice en VS.NET ;) aquí.
(En el Proyecto ZIP están los fuentes de las parte 1, 2 y 3. Además hay un 4to código de ejemplo, ejemplo4.cs, que sería como un "todo en uno" de las partes 1, 2 y 3. .php

Ir a Parte 1 | Ir a Parte 2


Anterior | Índice | Siguiente
Volver a Página Principal

blog comments powered by Disqus
2003 - 2018    La Web de Dark-N