示例#1
0
        public void Draw(SpriteBatch spriteBatch, bool inWater, bool?inSub, ParticleBlendState blendState)
        {
            ParticlePrefab.DrawTargetType drawTarget = inWater ? ParticlePrefab.DrawTargetType.Water : ParticlePrefab.DrawTargetType.Air;

            for (int i = 0; i < particleCount; i++)
            {
                var particle = particles[i];
                if (particle.BlendState != blendState)
                {
                    continue;
                }
                //equivalent to !particles[i].DrawTarget.HasFlag(drawTarget) but garbage free and faster
                if ((particle.DrawTarget & drawTarget) == 0)
                {
                    continue;
                }
                if (inSub.HasValue)
                {
                    bool isOutside = particle.CurrentHull == null;
                    if (!particle.DrawOnTop && isOutside == inSub.Value)
                    {
                        continue;
                    }
                }

                particles[i].Draw(spriteBatch);
            }
        }
示例#2
0
        public void Draw(SpriteBatch spriteBatch, bool inWater, ParticleBlendState blendState)
        {
            ParticlePrefab.DrawTargetType drawTarget = inWater ? ParticlePrefab.DrawTargetType.Water : ParticlePrefab.DrawTargetType.Air;

            for (int i = 0; i < particleCount; i++)
            {
                if (particles[i].BlendState != blendState)
                {
                    continue;
                }
                if (!particles[i].DrawTarget.HasFlag(drawTarget))
                {
                    continue;
                }

                particles[i].Draw(spriteBatch);
            }
        }
示例#3
0
        public ParticlePrefab(XElement element)
        {
            Name = element.Name.ToString();

            Sprites = new List <Sprite>();

            foreach (XElement subElement in element.Elements())
            {
                switch (subElement.Name.ToString().ToLowerInvariant())
                {
                case "sprite":
                    Sprites.Add(new Sprite(subElement));
                    break;

                case "spritesheet":
                case "animatedsprite":
                    Sprites.Add(new SpriteSheet(subElement));
                    break;
                }
            }

            AnimDuration = element.GetAttributeFloat("animduration", 1.0f);
            LoopAnim     = element.GetAttributeBool("loopanim", true);

            if (element.Attribute("angularvelocity") == null)
            {
                AngularVelocityMin = element.GetAttributeFloat("angularvelocitymin", 0.0f);
                AngularVelocityMax = element.GetAttributeFloat("angularvelocitymax", 0.0f);
            }
            else
            {
                AngularVelocityMin = element.GetAttributeFloat("angularvelocity", 0.0f);
                AngularVelocityMax = AngularVelocityMin;
            }

            AngularVelocityMin = MathHelper.ToRadians(AngularVelocityMin);
            AngularVelocityMax = MathHelper.ToRadians(AngularVelocityMax);

            if (element.Attribute("startsize") == null)
            {
                StartSizeMin = element.GetAttributeVector2("startsizemin", Vector2.One);
                StartSizeMax = element.GetAttributeVector2("startsizemax", Vector2.One);
            }
            else
            {
                StartSizeMin = element.GetAttributeVector2("startsize", Vector2.One);
                StartSizeMax = StartSizeMin;
            }

            if (element.Attribute("sizechange") == null)
            {
                SizeChangeMin = element.GetAttributeVector2("sizechangemin", Vector2.Zero);
                SizeChangeMax = element.GetAttributeVector2("sizechangemax", Vector2.Zero);
            }
            else
            {
                SizeChangeMin = element.GetAttributeVector2("sizechange", Vector2.Zero);
                SizeChangeMax = SizeChangeMin;
            }

            Drag      = element.GetAttributeFloat("drag", 0.0f);
            WaterDrag = element.GetAttributeFloat("waterdrag", 0.0f);

            Friction    = element.GetAttributeFloat("friction", 0.5f);
            Restitution = element.GetAttributeFloat("restitution", 0.5f);

            switch (element.GetAttributeString("blendstate", "alphablend"))
            {
            case "alpha":
            case "alphablend":
                BlendState = ParticleBlendState.AlphaBlend;
                break;

            case "add":
            case "additive":
                BlendState = ParticleBlendState.Additive;
                break;

            case "distort":
            case "distortion":
                BlendState = ParticleBlendState.Distortion;
                break;
            }

            GrowTime = element.GetAttributeFloat("growtime", 0.0f);

            if (element.Attribute("startrotation") == null)
            {
                StartRotationMin = element.GetAttributeFloat("startrotationmin", 0.0f);
                StartRotationMax = element.GetAttributeFloat("startrotationmax", 0.0f);
            }
            else
            {
                StartRotationMin = element.GetAttributeFloat("startrotation", 0.0f);
                StartRotationMax = StartRotationMin;
            }

            StartRotationMin = MathHelper.ToRadians(StartRotationMin);
            StartRotationMax = MathHelper.ToRadians(StartRotationMax);

            StartColor = new Color(element.GetAttributeVector4("startcolor", Vector4.One));
            StartAlpha = element.GetAttributeFloat("startalpha", 1.0f);

            DeleteOnCollision = element.GetAttributeBool("deleteoncollision", false);
            CollidesWithWalls = element.GetAttributeBool("collideswithwalls", false);

            CollisionRadius = element.GetAttributeFloat("collisionradius",
                                                        Sprites.Count > 0 ? 1 : Sprites[0].SourceRect.Width / 2.0f);

            ColorChange = element.GetAttributeVector4("colorchange", Vector4.Zero);

            LifeTime = element.GetAttributeFloat("lifetime", 5.0f);

            VelocityChange = element.GetAttributeVector2("velocitychange", Vector2.Zero);
            VelocityChange = ConvertUnits.ToDisplayUnits(VelocityChange);

            RotateToDirection = element.GetAttributeBool("rotatetodirection", false);

            switch (element.GetAttributeString("drawtarget", "air").ToLowerInvariant())
            {
            case "air":
            default:
                DrawTarget = DrawTargetType.Air;
                break;

            case "water":
                DrawTarget = DrawTargetType.Water;
                break;

            case "both":
                DrawTarget = DrawTargetType.Both;
                break;
            }
        }