public CircularParticleSystem(FAtlasElement element, float innerRadius, float lifetime, float speed, float particlesPerSecond, int maxParticleCount) : base(maxParticleCount) { this.element = element; this.innerRadius = innerRadius; this.lifetime = lifetime; this.speed = speed; this.timePerParticle = 1.0f / particlesPerSecond; timeUntilNextParticle = timePerParticle; particleDef = new FParticleDefinition (element); particleDef.endColor = Color.white.CloneWithNewAlpha (0.0f); ListenForAfterUpdate (HandleUpdate); }
public void DestroyEffect() { pd1 = new FParticleDefinition("bubble"); pd1.startScale = 2f; pd1.startColor = new Color(47, 44, 44, 0.8f); pd1.endColor = new Color(255, 255, 255, 0.1f); int part = RXRandom.Range(120, 150); for (int x = 0; x < part; x++) { pd1.x = Position.x; pd1.y = Position.y; Vector2 speed = RXRandom.Vector2Normalized() * RXRandom.Range(20.0f, 40.0f); pd1.speedX = speed.x; pd1.speedY = speed.y; pd1.lifetime = RXRandom.Range(0.8f, 1f); InGamePage.CurrentInGamePage.projectilesParticles.AddParticle(pd1); } }
public override void Update() { if (currentStep < forwardStep) { currentStep += forwardStep * 0.5f * Time.deltaTime; } if (velocity.x > 0) { rotation = -getRotationalAngle(); sprite.scaleX = 1f; } else { rotation = getRotationalAngle(); sprite.scaleX = -1f; } rotation = getRotationalAngle(); velocity.y += Mathf.Cos(getRotationalAngle() * Mathf.Deg2Rad) * Time.deltaTime * currentStep * direction; velocity.x += Mathf.Sin(getRotationalAngle() * Mathf.Deg2Rad) * Time.deltaTime * currentStep; Position += velocity; SetPosition(Position); ttl -= currentStep * Time.deltaTime; pd = new FParticleDefinition("bubble"); pd.startScale = 1.5f; pd.startColor = new Color(255, 255, 255, 0.8f); pd.endColor = new Color(255, 255, 255, 0.1f); int part = RXRandom.Range(1, 10); for (int x = 0; x < part; x++) { pd.x = Position.x; pd.y = Position.y; Vector2 speed = RXRandom.Vector2Normalized() * RXRandom.Range(20.0f, 80.0f); pd.speedX = speed.x; pd.speedY = speed.y; pd.lifetime = RXRandom.Range(0.2f, 0.5f); InGamePage.CurrentInGamePage.projectilesParticles.AddParticle(pd); } }
public override void Init() { GamePage._gameObjects.AddChild(Holder = new FContainer()); gameObject.transform.position = new Vector3(Position.x * FPhysics.POINTS_TO_METERS,Position.y * FPhysics.POINTS_TO_METERS,32); gameObject.transform.parent = GamePage.root.transform; bodyLink = gameObject.AddComponent<FPNodeLink>(); bodyLink.Init(Holder, false); Holder.AddChild(sprite); AngularDrag=5f; Mass=1f; Bounciness=0.5f; FrictionDyn=0.3f; FrictionSta=0.2f; InitPhysics(); pd = new FParticleDefinition("Futile_White"); pd.endScale = 0.2f; pd.startColor = new Color(0,250,0,1f); pd.endColor = new Color (0, 90,0,0.01f); }
public override void Update() { float forwardStep = 20f; float hInput = Input.GetAxis("Horizontal"); float angle = Input.GetAxis("Vertical"); if (hInput > 0) { sprite.scaleX = 1f; FacingRight = 1; } else if (hInput < 0) { sprite.scaleX = -1f; FacingRight = -1; } if (hInput != 0) { FSoundManager.PlaySound("thrust",0.1f); } setRotationalAngle(getRotationalAngle() + angle); if (getRotationalAngle() > 45) { setRotationalAngle(45); }else if(getRotationalAngle() < -45){ setRotationalAngle(-45); } if (FacingRight > 0) { rotation = -getRotationalAngle(); } else { rotation = getRotationalAngle(); } velocity.x += Mathf.Cos(getRotationalAngle()*Mathf.Deg2Rad) * Time.deltaTime * forwardStep * hInput; velocity.y += Mathf.Sin(getRotationalAngle()*Mathf.Deg2Rad) * Time.deltaTime * forwardStep; velocity.x *= 0.8f; velocity.y *= 0.8f; Position += velocity; SetPosition(Position); if(Position.y< -Futile.screen.halfHeight){ Position.y = -Futile.screen.halfHeight + sprite.height; InGamePage.CurrentInGamePage.ScreenShake(2, 5); setRotationalAngle(getRotationalAngle() * -1); setEnergy(getEnergy()-5); } if (Position.y > Futile.screen.halfHeight) { Position.y = Futile.screen.halfHeight - sprite.height; InGamePage.CurrentInGamePage.ScreenShake(2, 5); setRotationalAngle(getRotationalAngle() *-1); setEnergy(getEnergy() - 5); } if (Position.x > Futile.screen.width / 2) { Position.x = -Futile.screen.width / 2 + sprite.width / 2; } if (Position.x < -Futile.screen.width / 2) { Position.x = Futile.screen.width / 2 + sprite.width / 2; } if (Input.GetKey(KeyCode.X)) { Shoot(); } if (Mathf.Abs(velocity.x) > 1) { pd = new FParticleDefinition("bubble"); pd.startScale = 1.5f; pd.startColor = new Color(255, 255, 255, 0.8f); pd.endColor = new Color(255, 255, 255, 0.1f); pd.x = Position.x; pd.y = Position.y; Vector2 speed = RXRandom.Vector2Normalized() * RXRandom.Range(20.0f, 80.0f); pd.speedX = speed.x; pd.speedY = speed.y; pd.lifetime = RXRandom.Range(0.2f, 0.5f); InGamePage.CurrentInGamePage.projectilesParticles.AddParticle(pd); } curretTimer += 5f*Time.deltaTime; }
public void Init(Team team, Vector2 startPos) { this.team = team; world.orbHolder.AddChild(holder = new FContainer()); gameObject.transform.position = new Vector3(startPos.x * FPhysics.POINTS_TO_METERS,startPos.y * FPhysics.POINTS_TO_METERS,0); gameObject.transform.parent = world.root.transform; link = gameObject.AddComponent<FPNodeLink>(); link.Init(holder, true); frames = new FAtlasElement[11]; for (int f = 0; f<frames.Length; f++) { frames[f] = Futile.atlasManager.GetElementWithName("orb"+f.ToString("00")); } sprite = new FSprite(frames[0].name); holder.AddChild(sprite); sprite.color = team.color; sprite.scale = scale; InitPhysics(); holder.ListenForUpdate(HandleUpdate); holder.ListenForFixedUpdate(HandleFixedUpdate); FSoundManager.PlaySound("orbAppears"); pd = new FParticleDefinition("Particles/Flame"); pd.startColor = team.color.CloneWithNewAlpha(0.2f); pd.endColor = Color.clear; }
void HandleFixedUpdate() { //if (world.isGameOver) return; //you can't play if you lose! rigidbody.drag = BeastConfig.DRAG; Vector2 movementVector = player.controller.movementVector; movementVector *= 1.5f; if (movementVector.magnitude > 1.0f) { movementVector.Normalize(); } movementVector *= BeastConfig.MOVE_SPEED * Time.smoothDeltaTime * rigidbody.mass; if (movementVector.magnitude > 0.1f) { targetAngle = movementVector.GetAngle() + 90.0f; } angle += RXMath.GetDegreeDelta(angle,targetAngle) / 10.0f; holder.rotation = angle; movementVector *= 2.0f; // if (gamepad.GetButton(PS3ButtonType.X)) // { // movementVector *= 2.0f; // } bodyVelocity += movementVector; rigidbody.AddForce(new Vector3(bodyVelocity.x, bodyVelocity.y, 0.0f), ForceMode.Impulse); bodyVelocity *= BeastConfig.MOVE_FRICTION; if (RXRandom.Float() < 0.99f) { Vector2 pos = this.transform.position.ToVector2InPoints(); FParticleDefinition pd = new FParticleDefinition(RXRandom.Bool() ? "Particles/SplotchA" : "Particles/SplotchB"); pd.x = pos.x + RXRandom.Range(-10.0f, 10.0f); pd.y = pos.y + RXRandom.Range(-10.0f, 10.0f); pd.startColor = player.color.CloneWithNewAlpha(0.35f); pd.endColor = player.color.CloneWithNewAlpha(-2.5f); pd.startRotation = RXRandom.Range(0.0f,360.0f); pd.lifetime = 3.0f; world.backParticles.AddParticle(pd); } }
public void AddParticle(FParticleDefinition particleDefinition) { FAtlasElement element = particleDefinition.element; if(_hasInited) { if(element.atlas != _atlas) { throw new FutileException("All elements added to a particle system must be from the same atlas"); } } else { _hasInited = true; Init(FFacetType.Quad, element.atlas, _maxParticleCount); if(stage != null) stage.HandleFacetsChanged(); } FParticle particle; if(_availableParticleCount == 0) { if(shouldNewParticlesOverwriteExistingParticles) { //get one of the currently running particles and overwrite it //but make sure we don't keep overwriting the same particle! particle = _availableParticles[_unavailableParticleIndex--]; if(_unavailableParticleIndex < 0) { _unavailableParticleIndex = _maxParticleCount-1; } } else { return; //there are no particles available, so don't create a new one } } else { _availableParticleCount--; particle = _availableParticles[_availableParticleCount]; } float lifetime = particleDefinition.lifetime; particle.timeRemaining = lifetime; particle.delayRemaining = particleDefinition.delay; particle.x = particleDefinition.x; particle.y = particleDefinition.y; particle.speedX = particleDefinition.speedX; particle.speedY = particleDefinition.speedY; particle.startScale = particleDefinition.startScale; particle.scale = particleDefinition.startScale; float lifetimeInverse = 1.0f / lifetime; //we'll use this a few times, so invert it because multiplication is faster particle.scaleDeltaPerSecond = (particleDefinition.endScale - particleDefinition.startScale) * lifetimeInverse; Color startColor = particleDefinition.startColor; Color endColor = particleDefinition.endColor; particle.color = startColor; particle.redDeltaPerSecond = (endColor.r - startColor.r) * lifetimeInverse; particle.greenDeltaPerSecond = (endColor.g - startColor.g) * lifetimeInverse; particle.blueDeltaPerSecond = (endColor.b - startColor.b) * lifetimeInverse; particle.alphaDeltaPerSecond = (endColor.a - startColor.a) * lifetimeInverse; particle.elementHalfWidth = element.sourceSize.x * 0.5f; particle.elementHalfHeight = element.sourceSize.y * 0.5f; particle.uvTopLeft = element.uvTopLeft; particle.uvTopRight = element.uvTopRight; particle.uvBottomRight = element.uvBottomRight; particle.uvBottomLeft = element.uvBottomLeft; particle.initialTopLeft = new Vector2(-particle.elementHalfWidth,particle.elementHalfHeight); particle.initialTopRight = new Vector2(particle.elementHalfWidth,particle.elementHalfHeight); particle.initialBottomRight = new Vector2(particle.elementHalfWidth,-particle.elementHalfHeight); particle.initialBottomLeft = new Vector2(-particle.elementHalfWidth,-particle.elementHalfHeight); //notice how these are both multiplied by -1, this is to account for the flipped vertical coordinates in unity/futile particle.rotation = particleDefinition.startRotation * RXMath.DTOR * -1.0f; particle.rotationDeltaPerSecond = (particleDefinition.endRotation - particleDefinition.startRotation) * lifetimeInverse * RXMath.DTOR * -1.0f; if(particle.rotationDeltaPerSecond == 0) //no rotation { particle.doesNeedRotationUpdates = false; if(particle.rotation == 0) { particle.resultTopLeftX = particle.initialTopLeft.x; particle.resultTopLeftY = particle.initialTopLeft.y; particle.resultTopRightX = particle.initialTopRight.x; particle.resultTopRightY = particle.initialTopRight.y; particle.resultBottomRightX = particle.initialBottomRight.x; particle.resultBottomRightY = particle.initialBottomRight.y; particle.resultBottomLeftX = particle.initialBottomLeft.x; particle.resultBottomLeftY = particle.initialBottomLeft.y; } else //bake the rotation once { float sin = (float)Math.Sin(particle.rotation); float cos = (float)Math.Cos(particle.rotation); float ix, iy; ix = particle.initialTopLeft.x; iy = particle.initialTopLeft.y; particle.resultTopLeftX = ix * cos - iy * sin; particle.resultTopLeftY = ix * sin + iy * cos; ix = particle.initialTopRight.x; iy = particle.initialTopRight.y; particle.resultTopRightX = ix * cos - iy * sin; particle.resultTopRightY = ix * sin + iy * cos; ix = particle.initialBottomRight.x; iy = particle.initialBottomRight.y; particle.resultBottomRightX = ix * cos - iy * sin; particle.resultBottomRightY = ix * sin + iy * cos; ix = particle.initialBottomLeft.x; iy = particle.initialBottomLeft.y; particle.resultBottomLeftX = ix * cos - iy * sin; particle.resultBottomLeftY = ix * sin + iy * cos; } } else { //the rotation will be updated on the update particle.doesNeedRotationUpdates = true; } }
public override void Update() { float forwardStep = 5f; float angle = 0; passedTime += 1; float dist = Vector2.Distance(InGamePage.CurrentInGamePage.getPlayer().GetPosition(), Position); if (dist < 500f) { Shoot(); } if (hInput > 0) { sprite.scaleX = 1f; FacingRight = 1; } else if (hInput < 0) { sprite.scaleX = -1f; FacingRight = -1; } setRotationalAngle(getRotationalAngle() + angle); if (getRotationalAngle() > 45) { setRotationalAngle(45); } else if (getRotationalAngle() < -45) { setRotationalAngle(-45); } if (FacingRight > 0) { rotation = -getRotationalAngle(); } else { rotation = getRotationalAngle(); } if (Position.x > Futile.screen.width/2) { Position.x = -Futile.screen.width / 2 + sprite.width / 2; } if (Position.x < -Futile.screen.width / 2) { Position.x = Futile.screen.width/2 + sprite.width / 2; } velocity.x += Mathf.Cos(getRotationalAngle() * Mathf.Deg2Rad) * Time.deltaTime * forwardStep * hInput; velocity.y += Mathf.Sin(getRotationalAngle() * Mathf.Deg2Rad) * Time.deltaTime * forwardStep; velocity.x *= 0.9f; velocity.y *= 0.8f; Position += velocity; SetPosition(Position); if (Mathf.Abs(velocity.x) > 1) { pd = new FParticleDefinition("bubble"); pd.startScale = 1.5f; pd.startColor = new Color(255, 255, 255, 0.8f); pd.endColor = new Color(255, 255, 255, 0.1f); pd.x = Position.x; pd.y = Position.y; Vector2 speed = RXRandom.Vector2Normalized() * RXRandom.Range(20.0f, 80.0f); pd.speedX = speed.x; pd.speedY = speed.y; pd.lifetime = RXRandom.Range(0.2f, 0.5f); InGamePage.CurrentInGamePage.projectilesParticles.AddParticle(pd); } curretTimer += 1f * Time.deltaTime; }
void kill() { pd = new FParticleDefinition("Futile_White"); pd.endScale = 0.2f; pd.startColor = new Color(250,0,0,0.8f); pd.endColor = new Color (250, 0, 0,0.1f); int part=RXRandom.Range(16, 32); for(int x=0;x<part;x++){ pd.x = gameObject.rigidbody.position.x*FPhysics.METERS_TO_POINTS + RXRandom.Range(-10.0f, 10.0f); pd.y = (gameObject.rigidbody.position.y)*FPhysics.METERS_TO_POINTS-+ RXRandom.Range(-10.0f, 10.0f); Vector2 speed = RXRandom.Vector2Normalized() * RXRandom.Range(20.0f,80.0f); pd.speedX = speed.x; pd.speedY = speed.y; pd.lifetime = RXRandom.Range(1f, 5f); this.GamePage.impactParticles.AddParticle(pd); } UnityEngine.Object.Destroy(gameObject); Holder.RemoveFromContainer(); GamePage.callGameOver(); FSoundManager.PlaySound("atari_boom5"); }
public override void Update() { float forwardStep = 5f; float angle = 0; passedTime += 1; float dist = Vector2.Distance(InGamePage.CurrentInGamePage.getPlayer().GetPosition(), Position); if (dist < 500f) { Shoot(); } if (hInput > 0) { sprite.scaleX = 1f; FacingRight = 1; } else if (hInput < 0) { sprite.scaleX = -1f; FacingRight = -1; } setRotationalAngle(getRotationalAngle() + angle); if (getRotationalAngle() > 45) { setRotationalAngle(45); } else if (getRotationalAngle() < -45) { setRotationalAngle(-45); } if (FacingRight > 0) { rotation = -getRotationalAngle(); } else { rotation = getRotationalAngle(); } if (Position.x > Futile.screen.width / 2) { Position.x = -Futile.screen.width / 2 + sprite.width / 2; } if (Position.x < -Futile.screen.width / 2) { Position.x = Futile.screen.width / 2 + sprite.width / 2; } velocity.x += Mathf.Cos(getRotationalAngle() * Mathf.Deg2Rad) * Time.deltaTime * forwardStep * hInput; velocity.y += Mathf.Sin(getRotationalAngle() * Mathf.Deg2Rad) * Time.deltaTime * forwardStep; velocity.x *= 0.9f; velocity.y *= 0.8f; Position += velocity; SetPosition(Position); if (Mathf.Abs(velocity.x) > 1) { pd = new FParticleDefinition("bubble"); pd.startScale = 1.5f; pd.startColor = new Color(255, 255, 255, 0.8f); pd.endColor = new Color(255, 255, 255, 0.1f); pd.x = Position.x; pd.y = Position.y; Vector2 speed = RXRandom.Vector2Normalized() * RXRandom.Range(20.0f, 80.0f); pd.speedX = speed.x; pd.speedY = speed.y; pd.lifetime = RXRandom.Range(0.2f, 0.5f); InGamePage.CurrentInGamePage.projectilesParticles.AddParticle(pd); } curretTimer += 1f * Time.deltaTime; }
public void AddParticle(FParticleDefinition particleDefinition) { FAtlasElement element = particleDefinition.element; if (_hasInited) { if (element.atlas != _atlas) { throw new FutileException("All elements added to a particle system must be from the same atlas"); } } else { _hasInited = true; Init(FFacetType.Quad, element.atlas, _maxParticleCount); if (stage != null) { stage.HandleFacetsChanged(); } } FParticle particle; if (_availableParticleCount == 0) { if (shouldNewParticlesOverwriteExistingParticles) { //get one of the currently running particles and overwrite it //but make sure we don't keep overwriting the same particle! particle = _availableParticles[_unavailableParticleIndex--]; if (_unavailableParticleIndex < 0) { _unavailableParticleIndex = _maxParticleCount - 1; } } else { return; //there are no particles available, so don't create a new one } } else { _availableParticleCount--; particle = _availableParticles[_availableParticleCount]; } float lifetime = particleDefinition.lifetime; particle.timeRemaining = lifetime; particle.delayRemaining = particleDefinition.delay; particle.x = particleDefinition.x; particle.y = particleDefinition.y; particle.speedX = particleDefinition.speedX; particle.speedY = particleDefinition.speedY; particle.startScale = particleDefinition.startScale; particle.scale = particleDefinition.startScale; float lifetimeInverse = 1.0f / lifetime; //we'll use this a few times, so invert it because multiplication is faster particle.scaleDeltaPerSecond = (particleDefinition.endScale - particleDefinition.startScale) * lifetimeInverse; Color startColor = particleDefinition.startColor; Color endColor = particleDefinition.endColor; particle.color = startColor; particle.redDeltaPerSecond = (endColor.r - startColor.r) * lifetimeInverse; particle.greenDeltaPerSecond = (endColor.g - startColor.g) * lifetimeInverse; particle.blueDeltaPerSecond = (endColor.b - startColor.b) * lifetimeInverse; particle.alphaDeltaPerSecond = (endColor.a - startColor.a) * lifetimeInverse; particle.elementHalfWidth = element.sourceSize.x * 0.5f; particle.elementHalfHeight = element.sourceSize.y * 0.5f; particle.uvTopLeft = element.uvTopLeft; particle.uvTopRight = element.uvTopRight; particle.uvBottomRight = element.uvBottomRight; particle.uvBottomLeft = element.uvBottomLeft; particle.initialTopLeft = new Vector2(-particle.elementHalfWidth, particle.elementHalfHeight); particle.initialTopRight = new Vector2(particle.elementHalfWidth, particle.elementHalfHeight); particle.initialBottomRight = new Vector2(particle.elementHalfWidth, -particle.elementHalfHeight); particle.initialBottomLeft = new Vector2(-particle.elementHalfWidth, -particle.elementHalfHeight); //notice how these are both multiplied by -1, this is to account for the flipped vertical coordinates in unity/futile particle.rotation = particleDefinition.startRotation * RXMath.DTOR * -1.0f; particle.rotationDeltaPerSecond = (particleDefinition.endRotation - particleDefinition.startRotation) * lifetimeInverse * RXMath.DTOR * -1.0f; if (particle.rotationDeltaPerSecond == 0) //no rotation { particle.doesNeedRotationUpdates = false; if (particle.rotation == 0) { particle.resultTopLeftX = particle.initialTopLeft.x; particle.resultTopLeftY = particle.initialTopLeft.y; particle.resultTopRightX = particle.initialTopRight.x; particle.resultTopRightY = particle.initialTopRight.y; particle.resultBottomRightX = particle.initialBottomRight.x; particle.resultBottomRightY = particle.initialBottomRight.y; particle.resultBottomLeftX = particle.initialBottomLeft.x; particle.resultBottomLeftY = particle.initialBottomLeft.y; } else //bake the rotation once { float sin = (float)Math.Sin(particle.rotation); float cos = (float)Math.Cos(particle.rotation); float ix, iy; ix = particle.initialTopLeft.x; iy = particle.initialTopLeft.y; particle.resultTopLeftX = ix * cos - iy * sin; particle.resultTopLeftY = ix * sin + iy * cos; ix = particle.initialTopRight.x; iy = particle.initialTopRight.y; particle.resultTopRightX = ix * cos - iy * sin; particle.resultTopRightY = ix * sin + iy * cos; ix = particle.initialBottomRight.x; iy = particle.initialBottomRight.y; particle.resultBottomRightX = ix * cos - iy * sin; particle.resultBottomRightY = ix * sin + iy * cos; ix = particle.initialBottomLeft.x; iy = particle.initialBottomLeft.y; particle.resultBottomLeftX = ix * cos - iy * sin; particle.resultBottomLeftY = ix * sin + iy * cos; } } else { //the rotation will be updated on the update particle.doesNeedRotationUpdates = true; } }
public void generateDustParticles(int ceil, Vector2 position, Color initial, Color final, Vector2 sp, float endScale = 0.5f) { dustParticles = new FParticleDefinition("Shoot_0"); dustParticles.endScale = endScale; dustParticles.startScale = 0.1f; dustParticles.startColor = initial; dustParticles.endColor = final; int part = UnityEngine.Random.Range(1, ceil); for (int x = 0; x < part; x++) { dustParticles.x = position.x; dustParticles.y = position.y; Vector2 speed = RXRandom.Vector2Normalized() * RXRandom.Range(sp.x, sp.y); dustParticles.speedX = speed.x; dustParticles.speedY = speed.y; dustParticles.lifetime = RXRandom.Range(0.5f, 0.8f); TileMap.CurrentMap.GetParticleSystem.AddParticle(dustParticles); } }
public void ShowParticleBox(FNode baseNode, Rect rect) { Vector2 offset = this.OtherToLocal (baseNode, Vector2.zero); float cx = offset.x + rect.x + rect.width / 2; float cy = offset.y + rect.y + rect.height / 2; ; // FSprite sprite = new FSprite("Box"); // sprite.SetPosition(cx,cy); // sprite.width = rect.width; // sprite.height = rect.height; // // AddChild(sprite); int count = 50; float halfWidth = rect.width / 2; float halfHeight = rect.height / 2; FParticleDefinition pd = new FParticleDefinition ("Extra/Particle_Noise"); pd.startScale = 0.3f; pd.endScale = 0.7f; float speed = 30.0f; for (int c = 0; c<count; c++) { pd.lifetime = RXRandom.Range (0.9f, 1.3f); //pd.delay = RXRandom.Range(0.0f,0.1f); pd.x = cx + RXRandom.Range (-halfWidth, halfWidth); pd.y = cy + RXRandom.Range (-halfHeight, halfHeight); pd.speedX = RXRandom.Range (-speed, speed); pd.speedY = RXRandom.Range (-speed, speed); pd.startColor = new Color (1, 1, 0.8f, 0.7f); pd.endColor = new Color (1, 1, 0.8f, 0.0f); pd.startRotation = RXRandom.Range (0, 360.0f); pd.endRotation = pd.startRotation + RXRandom.Range (-180.0f, 180.0f); particleSystem.AddParticle (pd); } }
public void ShowParticleBurst(float startX, float startY, int count, string elementName, float startScale, float endScale, params Color[] colors) { FParticleDefinition pd = new FParticleDefinition (elementName); pd.x = startX; pd.y = startY; pd.startScale = startScale; pd.endScale = endScale; //somewhat evenly spread the particles in a circle float radiansPerParticle = RXMath.DOUBLE_PI / (float)count; float nextAngle = 0.0f; for (int c = 0; c<count; c++) { pd.lifetime = RXRandom.Range (0.3f, 0.5f); float speed = RXRandom.Range (30.0f, 80.0f); float useAngle = nextAngle + RXRandom.Range (-0.01f, 0.01f); pd.speedX = Mathf.Cos (useAngle) * speed; pd.speedY = Mathf.Sin (useAngle) * speed; nextAngle += radiansPerParticle; pd.startColor = RXRandom.GetRandomItem (colors); pd.endColor = RXRandom.GetRandomItem (colors).CloneWithNewAlpha (0.0f); particleSystem.AddParticle (pd); } }
public void AddParticle(FParticleDefinition particleDefinition) { FAtlasElement element = particleDefinition.element; if(_hasInited) { if(element.atlas != _atlas) { throw new FutileException("All elements added to a particle system must be from the same atlas"); } } else { _hasInited = true; Init(FFacetType.Quad, element.atlas, _maxParticleCount); } FParticle particle; if(_availableParticleCount == 0) { //return; //there are no particles available, just don't create a new one! (later on we could just reuse an existing one) //get one of the currently running particles and overwrite it //but make sure we don't keep overwriting the same particle! particle = _availableParticles[_unavailableParticleIndex--]; if(_unavailableParticleIndex < 0) { _unavailableParticleIndex = _maxParticleCount-1; } } else { _availableParticleCount--; particle = _availableParticles[_availableParticleCount]; } float lifetime = particleDefinition.lifetime; particle.timeRemaining = lifetime; particle.x = particleDefinition.x; particle.y = particleDefinition.y; particle.speedX = particleDefinition.speedX; particle.speedY = particleDefinition.speedY; particle.scale = particleDefinition.startScale; particle.scaleDeltaPerSecond = (particleDefinition.endScale - particleDefinition.startScale) / lifetime; Color startColor = particleDefinition.startColor; Color endColor = particleDefinition.endColor; particle.color = startColor; particle.redDeltaPerSecond = (endColor.r - startColor.r) / lifetime; particle.greenDeltaPerSecond = (endColor.g - startColor.g) / lifetime; particle.blueDeltaPerSecond = (endColor.b - startColor.b) / lifetime; particle.alphaDeltaPerSecond = (endColor.a - startColor.a) / lifetime; particle.elementHalfWidth = element.sourceSize.x * 0.5f; particle.elementHalfHeight = element.sourceSize.y * 0.5f; particle.uvTopLeft = element.uvTopLeft; particle.uvTopRight = element.uvTopRight; particle.uvBottomRight = element.uvBottomRight; particle.uvBottomLeft = element.uvBottomLeft; }
void InitLava() { lavaPD = new FParticleDefinition("Particles/Flame"); lavaPD.startColor = new Color(1.0f,RXRandom.Range(0.0f,1.0f),0,0.3f); lavaPD.endColor = lavaPD.startColor.CloneWithNewAlpha(-0.6f); lavaPositions.Add(new Vector2(-623.9141f,278.9141f)); lavaPositions.Add(new Vector2(-604.9141f,299.9141f)); lavaPositions.Add(new Vector2(-574.9141f,321.9141f)); lavaPositions.Add(new Vector2(-535.9141f,335.9141f)); lavaPositions.Add(new Vector2(-540.9141f,342.9141f)); lavaPositions.Add(new Vector2(-599.9141f,339.9141f)); lavaPositions.Add(new Vector2(-608.9141f,339.9141f)); lavaPositions.Add(new Vector2(-623.9141f,311.9141f)); lavaPositions.Add(new Vector2(-630.9141f,342.9141f)); lavaPositions.Add(new Vector2(-639.9141f,303.9141f)); lavaPositions.Add(new Vector2(-450.9141f,342.9141f)); lavaPositions.Add(new Vector2(-439.9141f,313.9141f)); lavaPositions.Add(new Vector2(-422.9141f,300.9141f)); lavaPositions.Add(new Vector2(-380.9141f,290.9141f)); lavaPositions.Add(new Vector2(-346.9141f,292.9141f)); lavaPositions.Add(new Vector2(-339.9141f,301.9141f)); lavaPositions.Add(new Vector2(-353.9141f,339.9141f)); lavaPositions.Add(new Vector2(-368.9141f,349.9141f)); lavaPositions.Add(new Vector2(-394.9141f,354.9141f)); lavaPositions.Add(new Vector2(-291.9141f,316.9141f)); lavaPositions.Add(new Vector2(-266.7813f,309.8672f)); lavaPositions.Add(new Vector2(-321.7813f,291.8672f)); lavaPositions.Add(new Vector2(167.2188f,272.8672f)); lavaPositions.Add(new Vector2(167.2188f,298.8672f)); lavaPositions.Add(new Vector2(205.2188f,291.8672f)); lavaPositions.Add(new Vector2(166.2188f,317.8672f)); lavaPositions.Add(new Vector2(171.2188f,343.8672f)); lavaPositions.Add(new Vector2(56.21875f,292.8672f)); lavaPositions.Add(new Vector2(11.21875f,291.8672f)); lavaPositions.Add(new Vector2(250.2188f,351.8672f)); lavaPositions.Add(new Vector2(317.2188f,351.8672f)); lavaPositions.Add(new Vector2(372.2188f,347.8672f)); lavaPositions.Add(new Vector2(432.2188f,346.8672f)); lavaPositions.Add(new Vector2(480.2188f,345.8672f)); lavaPositions.Add(new Vector2(516.2188f,343.8672f)); lavaPositions.Add(new Vector2(530.2188f,329.8672f)); lavaPositions.Add(new Vector2(545.2188f,314.8672f)); lavaPositions.Add(new Vector2(563.2188f,299.8672f)); lavaPositions.Add(new Vector2(580.2188f,287.8672f)); lavaPositions.Add(new Vector2(611.2188f,271.8672f)); lavaPositions.Add(new Vector2(616.2188f,264.8672f)); lavaPositions.Add(new Vector2(617.2188f,292.8672f)); lavaPositions.Add(new Vector2(612.2188f,311.8672f)); lavaPositions.Add(new Vector2(587.2188f,332.8672f)); lavaPositions.Add(new Vector2(577.2188f,334.8672f)); lavaPositions.Add(new Vector2(606.2188f,338.8672f)); lavaPositions.Add(new Vector2(512.2188f,336.8672f)); lavaPositions.Add(new Vector2(627.2188f,39.86719f)); lavaPositions.Add(new Vector2(610.2188f,20.86719f)); lavaPositions.Add(new Vector2(585.2188f,-1.132813f)); lavaPositions.Add(new Vector2(568.2188f,-5.132813f)); lavaPositions.Add(new Vector2(542.2188f,-13.13281f)); lavaPositions.Add(new Vector2(542.2188f,-17.13281f)); lavaPositions.Add(new Vector2(-301.8711f,308.8242f)); lavaPositions.Add(new Vector2(-344.8711f,297.8242f)); lavaPositions.Add(new Vector2(-367.8711f,288.8242f)); lavaPositions.Add(new Vector2(-382.8711f,290.8242f)); lavaPositions.Add(new Vector2(-403.8711f,294.8242f)); lavaPositions.Add(new Vector2(-424.8711f,303.8242f)); lavaPositions.Add(new Vector2(572.1289f,-7.175781f)); lavaPositions.Add(new Vector2(548.1289f,-17.17578f)); lavaPositions.Add(new Vector2(573.1289f,-28.17578f)); lavaPositions.Add(new Vector2(601.1289f,-32.17578f)); lavaPositions.Add(new Vector2(600.1289f,-28.17578f)); lavaPositions.Add(new Vector2(581.1289f,-55.17578f)); lavaPositions.Add(new Vector2(584.1289f,-44.17578f)); lavaPositions.Add(new Vector2(557.1289f,-21.17578f)); lavaPositions.Add(new Vector2(537.1289f,-19.17578f)); lavaPositions.Add(new Vector2(605.1289f,-56.17578f)); lavaPositions.Add(new Vector2(627.1289f,-45.17578f)); lavaPositions.Add(new Vector2(627.1289f,-56.17578f)); lavaPositions.Add(new Vector2(621.1289f,-127.1758f)); lavaPositions.Add(new Vector2(614.1289f,-130.1758f)); lavaPositions.Add(new Vector2(612.1289f,-75.17578f)); lavaPositions.Add(new Vector2(606.1289f,-83.17578f)); lavaPositions.Add(new Vector2(598.1289f,-113.1758f)); lavaPositions.Add(new Vector2(577.1289f,-120.1758f)); lavaPositions.Add(new Vector2(567.1289f,-125.1758f)); lavaPositions.Add(new Vector2(608.1289f,-147.1758f)); lavaPositions.Add(new Vector2(615.1289f,-159.1758f)); lavaPositions.Add(new Vector2(617.1289f,-164.1758f)); lavaPositions.Add(new Vector2(629.1289f,-148.1758f)); lavaPositions.Add(new Vector2(630.1289f,-145.1758f)); lavaPositions.Add(new Vector2(630.1289f,-184.1758f)); lavaPositions.Add(new Vector2(630.1289f,-193.1758f)); lavaPositions.Add(new Vector2(630.1289f,-205.1758f)); lavaPositions.Add(new Vector2(629.1289f,-250.1758f)); lavaPositions.Add(new Vector2(629.1289f,-270.1758f)); lavaPositions.Add(new Vector2(625.1289f,-305.1758f)); lavaPositions.Add(new Vector2(622.1289f,-317.1758f)); lavaPositions.Add(new Vector2(612.1289f,-288.1758f)); lavaPositions.Add(new Vector2(605.1289f,-276.1758f)); lavaPositions.Add(new Vector2(598.1289f,-300.1758f)); lavaPositions.Add(new Vector2(593.1289f,-308.1758f)); lavaPositions.Add(new Vector2(565.1289f,-338.1758f)); lavaPositions.Add(new Vector2(560.1289f,-323.1758f)); lavaPositions.Add(new Vector2(560.1289f,-320.1758f)); lavaPositions.Add(new Vector2(555.1289f,-338.1758f)); lavaPositions.Add(new Vector2(540.1289f,-356.1758f)); lavaPositions.Add(new Vector2(529.1289f,-359.1758f)); lavaPositions.Add(new Vector2(520.1289f,-354.1758f)); lavaPositions.Add(new Vector2(488.1289f,-352.1758f)); lavaPositions.Add(new Vector2(488.1289f,-352.1758f)); lavaPositions.Add(new Vector2(-335.8711f,-344.1758f)); lavaPositions.Add(new Vector2(-373.9141f,-328.1328f)); lavaPositions.Add(new Vector2(-412.9141f,-318.1328f)); lavaPositions.Add(new Vector2(-418.9141f,-321.1328f)); lavaPositions.Add(new Vector2(-456.9141f,-331.1328f)); lavaPositions.Add(new Vector2(-471.9141f,-328.1328f)); lavaPositions.Add(new Vector2(-495.9141f,-321.1328f)); lavaPositions.Add(new Vector2(-515.9141f,-311.1328f)); lavaPositions.Add(new Vector2(-540.9141f,-287.1328f)); lavaPositions.Add(new Vector2(-555.9141f,-282.1328f)); lavaPositions.Add(new Vector2(-568.9141f,-265.1328f)); lavaPositions.Add(new Vector2(-577.9141f,-261.1328f)); lavaPositions.Add(new Vector2(-628.9141f,-255.1328f)); lavaPositions.Add(new Vector2(-616.9141f,-278.1328f)); lavaPositions.Add(new Vector2(-600.9141f,-298.1328f)); lavaPositions.Add(new Vector2(-580.9141f,-315.1328f)); lavaPositions.Add(new Vector2(-561.9141f,-327.1328f)); lavaPositions.Add(new Vector2(-549.9141f,-341.1328f)); lavaPositions.Add(new Vector2(-543.9141f,-350.1328f)); lavaPositions.Add(new Vector2(-561.9141f,-345.1328f)); lavaPositions.Add(new Vector2(-582.9141f,-343.1328f)); lavaPositions.Add(new Vector2(-594.9141f,-323.1328f)); lavaPositions.Add(new Vector2(-615.9141f,-306.1328f)); lavaPositions.Add(new Vector2(-625.9141f,-297.1328f)); lavaPositions.Add(new Vector2(-624.0938f,-318.1758f)); lavaPositions.Add(new Vector2(-609.0938f,-334.1758f)); lavaPositions.Add(new Vector2(-601.0938f,-350.1758f)); lavaPositions.Add(new Vector2(-601.0938f,-352.1758f)); lavaPositions.Add(new Vector2(-615.0938f,-352.1758f)); lavaPositions.Add(new Vector2(-625.0938f,-347.1758f)); lavaPositions.Add(new Vector2(-626.0938f,-347.1758f)); lavaPositions.Add(new Vector2(-628.0938f,-121.1758f)); lavaPositions.Add(new Vector2(-624.0938f,-112.1758f)); lavaPositions.Add(new Vector2(-625.0938f,-96.17578f)); lavaPositions.Add(new Vector2(-626.0938f,-87.17578f)); lavaPositions.Add(new Vector2(-588.0938f,12.82422f)); lavaPositions.Add(new Vector2(-601.0938f,20.82422f)); lavaPositions.Add(new Vector2(-614.0938f,31.82422f)); lavaPositions.Add(new Vector2(-618.0938f,38.82422f)); lavaPositions.Add(new Vector2(-625.0938f,47.82422f)); lavaPositions.Add(new Vector2(-627.0938f,52.82422f)); lavaPositions.Add(new Vector2(-626.0938f,74.82422f)); lavaPositions.Add(new Vector2(-615.0938f,84.82422f)); lavaPositions.Add(new Vector2(-608.0938f,89.82422f)); lavaPositions.Add(new Vector2(-589.0938f,97.82422f)); lavaPositions.Add(new Vector2(-593.0938f,107.8242f)); lavaPositions.Add(new Vector2(-624.0938f,121.8242f)); lavaPositions.Add(new Vector2(-627.0938f,134.8242f)); lavaPositions.Add(new Vector2(-627.0938f,138.8242f)); lavaPositions.Add(new Vector2(-605.0938f,301.8242f)); lavaPositions.Add(new Vector2(-588.0938f,317.8242f)); lavaPositions.Add(new Vector2(-364.0938f,295.8242f)); lavaPositions.Add(new Vector2(176.9063f,282.8242f)); lavaPositions.Add(new Vector2(574.9063f,-25.17578f)); lavaPositions.Add(new Vector2(-319.0938f,-345.1758f)); lavaPositions.Add(new Vector2(-411.0938f,-321.1758f)); }