public Flag(Vector3 position) : base("Flag", PlayState.ComponentManager.RootComponent, Matrix.CreateTranslation(position), new Vector3(1.0f, 1.0f, 1.0f), Vector3.Zero) { SpriteSheet spriteSheet = new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture); List<Point> frames = new List<Point> { new Point(0, 2), new Point(1, 2), new Point(2, 2) }; Animation lampAnimation = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture), "Flag", 32, 32, frames, true, Color.White, 5.0f + MathFunctions.Rand(), 1f, 1.0f, false); Sprite sprite = new Sprite(PlayState.ComponentManager, "sprite", this, Matrix.Identity, spriteSheet, false) { OrientationType = Sprite.OrientMode.YAxis }; sprite.AddAnimation(lampAnimation); Voxel voxelUnder = new Voxel(); if (PlayState.ChunkManager.ChunkData.GetFirstVoxelUnder(position, ref voxelUnder)) { VoxelListener listener = new VoxelListener(PlayState.ComponentManager, this, PlayState.ChunkManager, voxelUnder); } lampAnimation.Play(); Tags.Add("Flag"); CollisionType = CollisionManager.CollisionType.Static; }
public Animation(Animation other, SpriteSheet spriteSheet, GraphicsDevice device) : this(device, spriteSheet, other.Name, other.FrameWidth, other.FrameHeight, other.Frames, other.Loops, other.Tint, other.FrameHZ, other.WorldWidth, other.WorldHeight, other.Flipped) { Speeds = new List<float>(); Speeds.AddRange(other.Speeds); SpeedMultiplier = 1.0f; }
public Table(Vector3 position, SpriteSheet fixtureAsset, Point fixtureFrame) : base("Table", PlayState.ComponentManager.RootComponent, Matrix.Identity, new Vector3(1.0f, 1.0f, 1.0f), Vector3.Zero) { ComponentManager componentManager = PlayState.ComponentManager; Matrix matrix = Matrix.CreateRotationY((float)Math.PI * 0.5f); matrix.Translation = position; LocalTransform = matrix; SpriteSheet spriteSheet = new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture); Point topFrame = new Point(0, 6); Point sideFrame = new Point(1, 6); List<Point> frames = new List<Point> { topFrame }; List<Point> sideframes = new List<Point> { sideFrame }; Animation tableTop = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture), "tableTop", 32, 32, frames, false, Color.White, 0.01f, 1.0f, 1.0f, false); Animation tableAnimation = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture), "tableTop", 32, 32, sideframes, false, Color.White, 0.01f, 1.0f, 1.0f, false); Sprite tabletopSprite = new Sprite(componentManager, "sprite1", this, Matrix.CreateRotationX((float)Math.PI * 0.5f), spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; tabletopSprite.AddAnimation(tableTop); Sprite sprite = new Sprite(componentManager, "sprite", this, Matrix.CreateTranslation(0.0f, -0.05f, -0.0f) * Matrix.Identity, spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; sprite.AddAnimation(tableAnimation); Sprite sprite2 = new Sprite(componentManager, "sprite2", this, Matrix.CreateTranslation(0.0f, -0.05f, -0.0f) * Matrix.CreateRotationY((float)Math.PI * 0.5f), spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; sprite2.AddAnimation(tableAnimation); Voxel voxelUnder = new Voxel(); if (PlayState.ChunkManager.ChunkData.GetFirstVoxelUnder(position, ref voxelUnder)) { VoxelListener listener = new VoxelListener(componentManager, this, PlayState.ChunkManager, voxelUnder); } tableAnimation.Play(); Tags.Add("Table"); CollisionType = CollisionManager.CollisionType.Static; if (fixtureAsset != null) { new Fixture(new Vector3(0, 0.3f, 0), fixtureAsset, fixtureFrame, this); } }
public Fixture(Vector3 position, SpriteSheet asset, Point frame, GameComponent parent) : base("Fixture", parent, Matrix.CreateTranslation(position), Vector3.One * 0.45f, Vector3.Zero, true) { Sprite = new Sprite(Manager, "Sprite", this, Matrix.Identity, asset, false); Sprite.AddAnimation(new Animation(asset.GenerateFrame(frame))); AddToCollisionManager = false; CollisionType = CollisionManager.CollisionType.Static; }
public Sprite(ComponentManager manager, string name, GameComponent parent, Matrix localTransform, SpriteSheet spriteSheet, bool addToCollisionManager) : base(name, parent, localTransform, Vector3.Zero, Vector3.Zero, addToCollisionManager) { SpriteSheet = spriteSheet; Animations = new Dictionary<string, Animation>(); OrientationType = OrientMode.Spherical; BillboardRotation = 0.0f; }
public Wheat(Vector3 position) : base("Wheat", PlayState.ComponentManager.RootComponent, Matrix.Identity, new Vector3(1.0f, 1.0f, 1.0f), Vector3.Zero) { Matrix matrix = Matrix.CreateRotationY(MathFunctions.Rand(-0.1f, 0.1f)); matrix.Translation = position + new Vector3(0.5f, -0.25f, 0.5f); LocalTransform = matrix; SpriteSheet spriteSheet = new SpriteSheet(ContentPaths.Entities.Plants.wheat); List<Point> frames = new List<Point> { new Point(0, 0) }; Animation tableAnimation = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(ContentPaths.Entities.Plants.wheat), "Wheat", 32, 32, frames, false, Color.White, 0.01f, 1.0f, 1.0f, false); Sprite sprite = new Sprite(PlayState.ComponentManager, "sprite", this, Matrix.Identity, spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; sprite.AddAnimation(tableAnimation); Sprite sprite2 = new Sprite(PlayState.ComponentManager, "sprite2", this, Matrix.CreateRotationY((float)Math.PI * 0.5f), spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; sprite2.AddAnimation(tableAnimation); Voxel voxelUnder = new Voxel(); bool success = PlayState.ChunkManager.ChunkData.GetFirstVoxelUnder(position, ref voxelUnder); if (success) { VoxelListener listener = new VoxelListener(PlayState.ComponentManager, this, PlayState.ChunkManager, voxelUnder); } Inventory inventory = new Inventory("Inventory", this) { Resources = new ResourceContainer() { MaxResources = 1, Resources = new Dictionary<ResourceLibrary.ResourceType, ResourceAmount>() { { ResourceLibrary.ResourceType.Grain, new ResourceAmount(ResourceLibrary.ResourceType.Grain) } } } }; Health health = new Health(PlayState.ComponentManager, "HP", this, 30, 0.0f, 30); new Flammable(PlayState.ComponentManager, "Flames", this, health); tableAnimation.Play(); Tags.Add("Wheat"); Tags.Add("Vegetation"); CollisionType = CollisionManager.CollisionType.Static; }
public Shadow(ComponentManager manager, string name, GameComponent parent, Matrix localTransform, SpriteSheet spriteSheet) : base(manager, name, parent, localTransform, spriteSheet, false) { OrientationType = OrientMode.Fixed; GlobalScale = LocalTransform.Left.Length(); LightsWithVoxels = false; UpdateTimer = new Timer(0.5f, false); Tint = Color.Black; OriginalTransform = LocalTransform; }
public Animation(GraphicsDevice device, SpriteSheet sheet, string name, int frameWidth, int frameHeight, List<Point> frames, bool loops, Color tint, float frameHZ, float worldWidth, float worldHeight, bool flipped) { Name = name; FrameWidth = frameWidth; FrameHeight = frameHeight; Frames = frames; CurrentFrame = 0; IsPlaying = false; Loops = loops; Tint = tint; Speeds = new List<float>() {frameHZ + MathFunctions.Rand()}; FrameHZ = frameHZ; FrameTimer = 0.0f; WorldWidth = worldWidth; WorldHeight = worldHeight; SpriteSheet = sheet; Primitives = new List<BillboardPrimitive>(); Flipped = flipped; SpeedMultiplier = 1.0f; CreatePrimitives(device); }
public ResourceEntity(ResourceLibrary.ResourceType resourceType, Vector3 position) : base(ResourceLibrary.ResourceNames[resourceType], PlayState.ComponentManager.RootComponent, Matrix.CreateTranslation(position), new Vector3(0.25f, 0.25f, 0.25f), Vector3.Zero, 0.5f, 0.5f, 0.999f, 0.999f, new Vector3(0, -10, 0)) { Restitution = 0.1f; Friction = 0.1f; Resource type = ResourceLibrary.Resources[resourceType]; SpriteSheet spriteSheet = new SpriteSheet(type.Image.AssetName); int frameX = type.Image.SourceRect.X / 32; int frameY = type.Image.SourceRect.Y / 32; List<Point> frames = new List<Point> { new Point(frameX, frameY) }; Animation animation = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(type.Image.AssetName), "Animation", 32, 32, frames, false, Color.White, 0.01f, 0.75f, 0.75f, false); Sprite sprite = new Sprite(PlayState.ComponentManager, "Sprite", this, Matrix.CreateTranslation(Vector3.UnitY * 0.25f), spriteSheet, false) { OrientationType = Sprite.OrientMode.Spherical, LightsWithVoxels = !type.SelfIlluminating }; sprite.AddAnimation(animation); animation.Play(); Tags.Add(type.ResourceName); Tags.Add("Resource"); Bobber bobber = new Bobber(0.05f, 2.0f, MathFunctions.Rand() * 3.0f, sprite); if (type.IsFlammable) { Health health = new Health(PlayState.ComponentManager, "health", this, 10.0f, 0.0f, 10.0f); new Flammable(PlayState.ComponentManager, "Flames", this, health); } }
public Forge(Vector3 position) : base("Forge", PlayState.ComponentManager.RootComponent, Matrix.CreateTranslation(position), new Vector3(1.0f, 1.0f, 1.0f), Vector3.Zero) { SpriteSheet spriteSheet = new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture); List<Point> frames = new List<Point> { new Point(1, 3), new Point(3, 3), new Point(2, 3), new Point(3, 3) }; Animation lampAnimation = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture), "Forge", 32, 32, frames, true, Color.White, 3.0f, 1f, 1.0f, false); Sprite sprite = new Sprite(PlayState.ComponentManager, "sprite", this, Matrix.Identity, spriteSheet, false) { LightsWithVoxels = false }; sprite.AddAnimation(lampAnimation); lampAnimation.Play(); Tags.Add("Forge"); Voxel voxelUnder = new Voxel(); if (PlayState.ChunkManager.ChunkData.GetFirstVoxelUnder(position, ref voxelUnder)) { new VoxelListener(PlayState.ComponentManager, this, PlayState.ChunkManager, voxelUnder); } new LightEmitter("light", this, Matrix.Identity, new Vector3(0.1f, 0.1f, 0.1f), Vector3.Zero, 50, 4) { HasMoved = true }; CollisionType = CollisionManager.CollisionType.Static; }
public void Initialize(SpriteSheet spriteSheet) { Physics.Orientation = Physics.OrientMode.Fixed; const int frameWidth = 32; const int frameHeight = 32; Sprite = new CharacterSprite (Graphics, Manager, "snake Sprite", Physics, Matrix.Identity ); // Add the idle animation Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Forward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Left, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Right, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Backward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 0); for (int i = 0; i < 5; ++i) { CharacterSprite TailSprite = new CharacterSprite (Graphics, Manager, "snake Sprite", Tail[i], Matrix.Identity ); TailSprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Forward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 1); TailSprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Left, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 1); TailSprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Right, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 1); TailSprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Backward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 1); TailSprite.SetCurrentAnimation(CharacterMode.Idle.ToString()); } // Add sensor Sensors = new EnemySensor(Manager, "EnemySensor", Physics, Matrix.Identity, new Vector3(20, 5, 20), Vector3.Zero); // Add AI AI = new SnakeAI(this, "snake AI", Sensors, PlanService); Attacks = new List<Attack>() {new Attack("None", 0.0f, 0.0f, 0.0f, ContentPaths.Audio.pick, ContentPaths.Effects.rings)}; Physics.Tags.Add("Snake"); Physics.Tags.Add("Animal"); }
protected bool Equals(SpriteSheet other) { return(FrameWidth == other.FrameWidth && FrameHeight == other.FrameHeight && string.Equals(AssetName, other.AssetName)); }
public override void PreRender() { SpriteSheet = new SpriteSheet((Texture2D)Composite.Target); base.PreRender(); }
public void Initialize() { Physics.Orientation = Physics.OrientMode.RotateY; Sprite = new CharacterSprite(Graphics, Manager, "Elf Sprite", Physics, Matrix.CreateTranslation(new Vector3(0, 0.35f, 0))); foreach (Animation animation in Stats.CurrentClass.Animations) { Sprite.AddAnimation(animation.Clone()); } Hands = new Grabber("hands", Physics, Matrix.Identity, new Vector3(0.1f, 0.1f, 0.1f), Vector3.Zero); Sensors = new EnemySensor(Manager, "EnemySensor", Physics, Matrix.Identity, new Vector3(20, 5, 20), Vector3.Zero); AI = new CreatureAI(this, "Elf AI", Sensors, PlanService); Attacks = new List<Attack>() { new Attack(Stats.CurrentClass.Attacks[0]) }; Inventory = new Inventory("Inventory", Physics) { Resources = new ResourceContainer { MaxResources = 16 } }; Matrix shadowTransform = Matrix.CreateRotationX((float)Math.PI * 0.5f); shadowTransform.Translation = new Vector3(0.0f, -0.5f, 0.0f); SpriteSheet shadowTexture = new SpriteSheet(ContentPaths.Effects.shadowcircle); Shadow = new Shadow(Manager, "Shadow", Physics, shadowTransform, shadowTexture); List<Point> shP = new List<Point> { new Point(0, 0) }; Animation shadowAnimation = new Animation(Graphics, new SpriteSheet(ContentPaths.Effects.shadowcircle), "sh", 32, 32, shP, false, Color.Black, 1, 0.7f, 0.7f, false); Shadow.AddAnimation(shadowAnimation); shadowAnimation.Play(); Shadow.SetCurrentAnimation("sh"); Physics.Tags.Add("Goblin"); DeathParticleTrigger = new ParticleTrigger("blood_particle", Manager, "Death Gibs", Physics, Matrix.Identity, Vector3.One, Vector3.Zero) { TriggerOnDeath = true, TriggerAmount = 5, SoundToPlay = ContentPaths.Entities.Goblin.Audio.goblinhurt1 }; Flames = new Flammable(Manager, "Flames", Physics, this); NoiseMaker.Noises["Hurt"] = new List<string> { ContentPaths.Entities.Goblin.Audio.goblinhurt1, ContentPaths.Entities.Goblin.Audio.goblinhurt2, ContentPaths.Entities.Goblin.Audio.goblinhurt3, ContentPaths.Entities.Goblin.Audio.goblinhurt4, }; MinimapIcon minimapIcon = new MinimapIcon(Physics, new ImageFrame(TextureManager.GetTexture(ContentPaths.GUI.map_icons), 16, 3, 0)); NoiseMaker.Noises["Chew"] = new List<string> { ContentPaths.Audio.chew }; NoiseMaker.Noises["Jump"] = new List<string> { ContentPaths.Audio.jump }; Stats.FullName = TextGenerator.GenerateRandom("$elfname"); //Stats.LastName = TextGenerator.GenerateRandom("$elffamily"); Stats.Size = 4; }
public static EmitterData CreateExplosionLike(string name, SpriteSheet sheet, Point frame, BlendState state) { Texture2D tex = TextureManager.GetTexture(sheet.AssetName); EmitterData data = new EmitterData { Animation = new Animation(GameState.Game.GraphicsDevice, sheet, name, sheet.FrameWidth, sheet.FrameHeight, new List<Point>() { frame }, true, Color.White, 1.0f, 1.0f, 1.0f, false), ConstantAccel = new Vector3(0, -10, 0), LinearDamping = 0.9999f, AngularDamping = 0.9f, EmissionFrequency = 50.0f, EmissionRadius = 1.0f, EmissionSpeed = 5.0f, GrowthSpeed = -0.0f, MaxAngle = 3.14159f, MinAngle = 0.0f, MaxParticles = 1000, MaxScale = 0.2f, MinScale = 0.1f, MinAngular = -5.0f, MaxAngular = 5.0f, ParticleDecay = 0.5f, ParticlesPerFrame = 0, ReleaseOnce = true, Texture = tex, CollidesWorld = true, Sleeps = true, Damping = 0.1f }; return data; }
public void AddAnimation(Creature.CharacterMode mode, Orientation orient, SpriteSheet texture, float frameHz, int frameWidth, int frameHeight, int row, params int[] cols) { List<int> ints = new List<int>(); ints.AddRange(cols); Animation animation = CreateAnimation(mode, orient, texture, frameHz, frameWidth, frameHeight, row, ints); Animations[mode.ToString() + OrientationStrings[(int) orient]] = animation; animation.Play(); }
void InitializeAnimations() { const int frameWidth = 32; const int frameHeight = 40; SpriteSheet sprites = new SpriteSheet(ContentPaths.Entities.Skeleton.Sprites.necro); Animations = new List<Animation>() { CharacterSprite.CreateAnimation(Creature.CharacterMode.Walking, OrientedAnimation.Orientation.Forward, sprites, 15.0f, frameWidth, frameHeight, 0, 1, 0, 1, 2), CharacterSprite.CreateAnimation(Creature.CharacterMode.Walking, OrientedAnimation.Orientation.Right, sprites, 15.0f, frameWidth, frameHeight, 2, 1, 0, 1, 2), CharacterSprite.CreateAnimation(Creature.CharacterMode.Walking, OrientedAnimation.Orientation.Left, sprites, 15.0f, frameWidth, frameHeight, 1, 1, 0, 1, 2), CharacterSprite.CreateAnimation(Creature.CharacterMode.Walking, OrientedAnimation.Orientation.Backward, sprites, 15.0f, frameWidth, frameHeight, 3, 1, 0, 1, 2), CharacterSprite.CreateAnimation(Creature.CharacterMode.Idle, OrientedAnimation.Orientation.Forward, sprites, 0.8f, frameWidth, frameHeight, 0, 1), CharacterSprite.CreateAnimation(Creature.CharacterMode.Idle, OrientedAnimation.Orientation.Right, sprites, 0.8f, frameWidth, frameHeight, 2, 1), CharacterSprite.CreateAnimation(Creature.CharacterMode.Idle, OrientedAnimation.Orientation.Left, sprites, 0.8f, frameWidth, frameHeight, 1, 1), CharacterSprite.CreateAnimation(Creature.CharacterMode.Idle, OrientedAnimation.Orientation.Backward, sprites, 0.8f, frameWidth, frameHeight, 3, 1), //CharacterSprite.CreateAnimation(Creature.CharacterMode.Attacking, OrientedAnimation.Orientation.Forward, sprites, 8.0f, frameWidth, frameHeight, 8, 0, 1, 2, 3), //CharacterSprite.CreateAnimation(Creature.CharacterMode.Attacking, OrientedAnimation.Orientation.Right, sprites, 8.0f, frameWidth, frameHeight, 10, 0, 1, 2, 3), //CharacterSprite.CreateAnimation(Creature.CharacterMode.Attacking, OrientedAnimation.Orientation.Left, sprites, 8.0f, frameWidth, frameHeight, 9, 0, 1, 2, 3), //CharacterSprite.CreateAnimation(Creature.CharacterMode.Attacking, OrientedAnimation.Orientation.Backward, sprites, 8.0f, frameWidth, frameHeight, 11, 0, 1, 2, 3), CharacterSprite.CreateAnimation(Creature.CharacterMode.Falling, OrientedAnimation.Orientation.Forward, sprites, 15.0f, frameWidth, frameHeight, 4, 1), CharacterSprite.CreateAnimation(Creature.CharacterMode.Falling, OrientedAnimation.Orientation.Right, sprites, 15.0f, frameWidth, frameHeight, 6, 1), CharacterSprite.CreateAnimation(Creature.CharacterMode.Falling, OrientedAnimation.Orientation.Left, sprites, 15.0f, frameWidth, frameHeight, 5, 1), CharacterSprite.CreateAnimation(Creature.CharacterMode.Falling, OrientedAnimation.Orientation.Backward, sprites, 15.0f, frameWidth, frameHeight, 7, 1), CharacterSprite.CreateAnimation(Creature.CharacterMode.Jumping, OrientedAnimation.Orientation.Forward, sprites, 15.0f, frameWidth, frameHeight, 4, 0), CharacterSprite.CreateAnimation(Creature.CharacterMode.Jumping, OrientedAnimation.Orientation.Right, sprites, 15.0f, frameWidth, frameHeight, 6, 0), CharacterSprite.CreateAnimation(Creature.CharacterMode.Jumping, OrientedAnimation.Orientation.Left, sprites, 15.0f, frameWidth, frameHeight, 5, 0), CharacterSprite.CreateAnimation(Creature.CharacterMode.Jumping, OrientedAnimation.Orientation.Backward, sprites, 15.0f, frameWidth, frameHeight, 7, 0), }; }
public void Initialize(SpriteSheet spriteSheet) { Physics.Orientation = Physics.OrientMode.RotateY; const int frameWidth = 48; const int frameHeight = 40; Sprite = new CharacterSprite (Graphics, Manager, "Deer Sprite", Physics, Matrix.CreateTranslation(Vector3.Up * 0.6f) ); // Add the idle animation Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Forward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Left, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 1, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Right, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 2, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Backward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 3, 0); // Add the running animation Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Forward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 4, 0, 1, 2, 3); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Left, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 5, 0, 1, 2, 3); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Right, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 6, 0, 1, 2, 3); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Backward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 7, 0, 1, 2, 3); // Add the jumping animation Sprite.AddAnimation(CharacterMode.Jumping, OrientedAnimation.Orientation.Forward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 8, 0, 1); Sprite.AddAnimation(CharacterMode.Jumping, OrientedAnimation.Orientation.Left, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 9, 0, 1); Sprite.AddAnimation(CharacterMode.Jumping, OrientedAnimation.Orientation.Right, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 10, 0, 1); Sprite.AddAnimation(CharacterMode.Jumping, OrientedAnimation.Orientation.Backward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 11, 0, 1); // Add hands Hands = new Grabber("hands", Physics, Matrix.Identity, new Vector3(0.1f, 0.1f, 0.1f), Vector3.Zero); // Add sensor Sensors = new EnemySensor(Manager, "EnemySensor", Physics, Matrix.Identity, new Vector3(20, 5, 20), Vector3.Zero); // Add AI AI = new DeerAI(this, "Deer AI", Sensors, PlanService); Attacks = new List<Attack>{new Attack("None", 0.0f, 0.0f, 0.0f, ContentPaths.Audio.pick, ContentPaths.Effects.flash)}; Inventory = new Inventory("Inventory", Physics) { Resources = new ResourceContainer { MaxResources = 1 } }; // Shadow Matrix shadowTransform = Matrix.CreateRotationX((float)Math.PI * 0.5f); shadowTransform.Translation = new Vector3(0.0f, -.25f, 0.0f); SpriteSheet shadowTexture = new SpriteSheet(ContentPaths.Effects.shadowcircle); Shadow = new Shadow(Manager, "Shadow", Physics, shadowTransform, shadowTexture); List<Point> shP = new List<Point> { new Point(0,0) }; Animation shadowAnimation = new Animation(Graphics, new SpriteSheet(ContentPaths.Effects.shadowcircle), "sh", 32, 32, shP, false, Color.Black, 1, 0.7f, 0.7f, false); Shadow.AddAnimation(shadowAnimation); shadowAnimation.Play(); Shadow.SetCurrentAnimation("sh"); // The bird will emit a shower of blood when it dies DeathParticleTrigger = new ParticleTrigger("blood_particle", Manager, "Death Gibs", Physics, Matrix.Identity, Vector3.One, Vector3.Zero) { TriggerOnDeath = true, TriggerAmount = 1, BoxTriggerTimes = 10 }; // The bird is flammable, and can die when exposed to fire. Flames = new Flammable(Manager, "Flames", Physics, this); // Tag the physics component with some information // that can be used later Physics.Tags.Add("Deer"); Physics.Tags.Add("Animal"); Stats.FullName = TextGenerator.GenerateRandom("$firstname"); Stats.CurrentClass = new EmployeeClass() { Name = "Deer", Levels = new List<EmployeeClass.Level>() { new EmployeeClass.Level() { Index = 0, Name = "Deer"} } }; }
public void Initialize(SpriteSheet spriteSheet) { Physics.Orientation = Physics.OrientMode.RotateY; const int frameWidth = 48; const int frameHeight = 40; Sprite = new CharacterSprite (Graphics, Manager, "Deer Sprite", Physics, Matrix.CreateTranslation(Vector3.Up * 0.6f) ); // Add the idle animation Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Forward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 0, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Left, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 1, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Right, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 2, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Backward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 3, 0); // Add the running animation Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Forward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 4, 0, 1, 2, 3); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Left, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 5, 0, 1, 2, 3); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Right, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 6, 0, 1, 2, 3); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Backward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 7, 0, 1, 2, 3); // Add the jumping animation Sprite.AddAnimation(CharacterMode.Jumping, OrientedAnimation.Orientation.Forward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 8, 0, 1); Sprite.AddAnimation(CharacterMode.Jumping, OrientedAnimation.Orientation.Left, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 9, 0, 1); Sprite.AddAnimation(CharacterMode.Jumping, OrientedAnimation.Orientation.Right, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 10, 0, 1); Sprite.AddAnimation(CharacterMode.Jumping, OrientedAnimation.Orientation.Backward, spriteSheet, ANIM_SPEED, frameWidth, frameHeight, 11, 0, 1); // Add hands Hands = new Grabber("hands", Physics, Matrix.Identity, new Vector3(0.1f, 0.1f, 0.1f), Vector3.Zero); // Add sensor Sensors = new EnemySensor(Manager, "EnemySensor", Physics, Matrix.Identity, new Vector3(20, 5, 20), Vector3.Zero); // Add AI AI = new PacingCreatureAI(this, "Deer AI", Sensors, PlanService); Attacks = new List <Attack> { new Attack("None", 0.0f, 0.0f, 0.0f, ContentPaths.Audio.pick, ContentPaths.Effects.hit) }; Inventory = new Inventory("Inventory", Physics) { Resources = new ResourceContainer { MaxResources = 1 } }; // Shadow Matrix shadowTransform = Matrix.CreateRotationX((float)Math.PI * 0.5f); shadowTransform.Translation = new Vector3(0.0f, -.25f, 0.0f); SpriteSheet shadowTexture = new SpriteSheet(ContentPaths.Effects.shadowcircle); Shadow = new Shadow(Manager, "Shadow", Physics, shadowTransform, shadowTexture); List <Point> shP = new List <Point> { new Point(0, 0) }; Animation shadowAnimation = new Animation(Graphics, new SpriteSheet(ContentPaths.Effects.shadowcircle), "sh", 32, 32, shP, false, Color.Black, 1, 0.7f, 0.7f, false); Shadow.AddAnimation(shadowAnimation); shadowAnimation.Play(); Shadow.SetCurrentAnimation("sh"); // The bird will emit a shower of blood when it dies DeathParticleTrigger = new ParticleTrigger("blood_particle", Manager, "Death Gibs", Physics, Matrix.Identity, Vector3.One, Vector3.Zero) { TriggerOnDeath = true, TriggerAmount = 1, BoxTriggerTimes = 10 }; // The bird is flammable, and can die when exposed to fire. Flames = new Flammable(Manager, "Flames", Physics, this); // Tag the physics component with some information // that can be used later Physics.Tags.Add("Deer"); Physics.Tags.Add("Animal"); Stats.FullName = TextGenerator.GenerateRandom("$firstname"); Stats.CurrentClass = new EmployeeClass() { Name = "Deer", Levels = new List <EmployeeClass.Level>() { new EmployeeClass.Level() { Index = 0, Name = "Deer" } } }; }
public Mushroom(Vector3 position) : base("Mushroom", PlayState.ComponentManager.RootComponent, Matrix.Identity, new Vector3(1.0f, 1.0f, 1.0f), Vector3.Zero) { Matrix matrix = Matrix.CreateRotationY(MathFunctions.Rand(-0.1f, 0.1f)); matrix.Translation = position + new Vector3(0.5f, -0.25f, 0.5f); LocalTransform = matrix; SpriteSheet spriteSheet = new SpriteSheet(ContentPaths.Entities.Plants.mushroom); List <Point> frames = new List <Point> { new Point(0, 0) }; Animation tableAnimation = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(ContentPaths.Entities.Plants.mushroom), "Mushroom", 32, 32, frames, false, Color.White, 0.01f, 1.0f, 1.0f, false); Sprite sprite = new Sprite(PlayState.ComponentManager, "sprite", this, Matrix.Identity, spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; sprite.AddAnimation(tableAnimation); Sprite sprite2 = new Sprite(PlayState.ComponentManager, "sprite2", this, Matrix.CreateRotationY((float)Math.PI * 0.5f), spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; sprite2.AddAnimation(tableAnimation); Voxel voxelUnder = new Voxel(); bool success = PlayState.ChunkManager.ChunkData.GetFirstVoxelUnder(position, ref voxelUnder); if (success) { VoxelListener listener = new VoxelListener(PlayState.ComponentManager, this, PlayState.ChunkManager, voxelUnder); } Inventory inventory = new Inventory("Inventory", this) { Resources = new ResourceContainer() { MaxResources = 1, Resources = new Dictionary <ResourceLibrary.ResourceType, ResourceAmount>() { { ResourceLibrary.ResourceType.Mushroom, new ResourceAmount(ResourceLibrary.ResourceType.Mushroom) } } } }; Health health = new Health(PlayState.ComponentManager, "HP", this, 30, 0.0f, 30); new Flammable(PlayState.ComponentManager, "Flames", this, health); tableAnimation.Play(); Tags.Add("Mushroom"); Tags.Add("Vegetation"); CollisionType = CollisionManager.CollisionType.Static; }
/// <summary> /// Initialize function creates all the required components for the bird. /// </summary> /// <param name="sprites">The sprite sheet to use for the bird</param> public void Initialize(string sprites) { HasBones = false; // When true, causes the bird to face the direction its moving in Physics.Orientation = Physics.OrientMode.RotateY; // Create the sprite component for the bird. Sprite = new CharacterSprite (Graphics, Manager, "Scorpion Sprite", Physics, Matrix.CreateTranslation(0, 0.5f, 0) ); CompositeAnimation.Descriptor descriptor = FileUtils.LoadJsonFromString <CompositeAnimation.Descriptor>( ContentPaths.GetFileAsString(sprites)); List <CompositeAnimation> animations = descriptor.GenerateAnimations("Scorpion"); foreach (CompositeAnimation animation in animations) { Sprite.AddAnimation(animation); } // Used to grab other components Hands = new Grabber("hands", Physics, Matrix.Identity, new Vector3(0.2f, 0.2f, 0.2f), Vector3.Zero); // Used to sense hostile creatures Sensors = new EnemySensor(Manager, "EnemySensor", Physics, Matrix.Identity, new Vector3(20, 5, 20), Vector3.Zero); // Controls the behavior of the creature AI = new PacingCreatureAI(this, "Scorpion AI", Sensors, PlanService); // The bird can peck at its enemies (0.1 damage) Attacks = new List <Attack> { new Attack("Sting", 4.0f, 2.0f, 1.0f, ContentPaths.Audio.hiss, ContentPaths.Effects.pierce) }; // The bird can hold one item at a time in its inventory Inventory = new Inventory("Inventory", Physics) { Resources = new ResourceContainer { MaxResources = 1 } }; // The shadow is rotated 90 degrees along X, and is 0.25 blocks beneath the creature Matrix shadowTransform = Matrix.CreateRotationX((float)Math.PI * 0.5f); shadowTransform.Translation = new Vector3(0.0f, -0.25f, 0.0f); shadowTransform *= Matrix.CreateScale(0.75f); SpriteSheet shadowTexture = new SpriteSheet(ContentPaths.Effects.shadowcircle); Shadow = new Shadow(Manager, "Shadow", Physics, shadowTransform, shadowTexture); // We set up the shadow's animation so that it's just a static black circle // TODO: Make the shadow set this up automatically List <Point> shP = new List <Point> { new Point(0, 0) }; Animation shadowAnimation = new Animation(Graphics, new SpriteSheet(ContentPaths.Effects.shadowcircle), "sh", 32, 32, shP, false, Color.Black, 1, 0.7f, 0.7f, false); Shadow.AddAnimation(shadowAnimation); shadowAnimation.Play(); Shadow.SetCurrentAnimation("sh"); // The bird will emit a shower of blood when it dies DeathParticleTrigger = new ParticleTrigger("blood_particle", Manager, "Death Gibs", Physics, Matrix.Identity, Vector3.One, Vector3.Zero) { TriggerOnDeath = true, TriggerAmount = 1 }; // The bird is flammable, and can die when exposed to fire. Flames = new Flammable(Manager, "Flames", Physics, this); // Tag the physics component with some information // that can be used later Physics.Tags.Add("Scorpion"); Physics.Tags.Add("Animal"); Stats.FullName = TextGenerator.GenerateRandom("$firstname") + " the Scorpion"; Stats.CurrentClass = new EmployeeClass() { Name = "Scorpion", Levels = new List <EmployeeClass.Level>() { new EmployeeClass.Level() { Index = 0, Name = "Scorpion" } } }; NoiseMaker.Noises.Add("Hurt", new List <string>() { ContentPaths.Audio.hiss }); AI.Movement.CanClimbWalls = true; AI.Movement.CanSwim = false; }
/// <summary> /// Initialize function creates all the required components for the bird. /// </summary> /// <param name="spriteSheet">The sprite sheet to use for the bird</param> public void Initialize(SpriteSheet spriteSheet) { // When true, causes the bird to face the direction its moving in Physics.Orientation = Physics.OrientMode.RotateY; // The dimensions of each frame in the sprite sheet (in pixels), as given by the readme const int frameWidth = 24; const int frameHeight = 16; // Create the sprite component for the bird. Sprite = new CharacterSprite (Graphics, Manager, "Bird Sprite", Physics, Matrix.CreateTranslation(0, 0.25f, 0) ); // Flying animation (rows 4 5 6 and 7) Sprite.AddAnimation(CharacterMode.Flying, OrientedAnimation.Orientation.Forward, spriteSheet, // animation will play at 15 FPS 15.0f, frameWidth, frameHeight, // animation begins at row 4 4, // It consists of columns 0, 1 and 2 looped forever 0, 1, 2); Sprite.AddAnimation(CharacterMode.Flying, OrientedAnimation.Orientation.Left, spriteSheet, 15.0f, frameWidth, frameHeight, 5, 0, 1, 2); Sprite.AddAnimation(CharacterMode.Flying, OrientedAnimation.Orientation.Right, spriteSheet, 15.0f, frameWidth, frameHeight, 6, 0, 1, 2); Sprite.AddAnimation(CharacterMode.Flying, OrientedAnimation.Orientation.Backward, spriteSheet, 15.0f, frameWidth, frameHeight, 7, 0, 1, 2); // Hopping animation (rows 0 1 2 and 3) Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Forward, spriteSheet, 5.0f, frameWidth, frameHeight, 0, 0, 1); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Left, spriteSheet, 5.0f, frameWidth, frameHeight, 1, 0, 1); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Right, spriteSheet, 5.0f, frameWidth, frameHeight, 2, 0, 1); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Backward, spriteSheet, 5.0f, frameWidth, frameHeight, 3, 0, 1); // Idle animation (rows 0 1 2 and 3) Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Forward, spriteSheet, 5.0f, frameWidth, frameHeight, 0, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Left, spriteSheet, 5.0f, frameWidth, frameHeight, 1, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Right, spriteSheet, 5.0f, frameWidth, frameHeight, 2, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Backward, spriteSheet, 5.0f, frameWidth, frameHeight, 3, 0); // Used to grab other components Hands = new Grabber("hands", Physics, Matrix.Identity, new Vector3(0.2f, 0.2f, 0.2f), Vector3.Zero); // Used to sense hostile creatures Sensors = new EnemySensor(Manager, "EnemySensor", Physics, Matrix.Identity, new Vector3(20, 5, 20), Vector3.Zero); // Controls the behavior of the creature AI = new BirdAI(this, "Bird AI", Sensors, PlanService); // The bird can peck at its enemies (0.1 damage) Attacks = new List <Attack> { new Attack("Peck", 0.1f, 2.0f, 1.0f, ContentPaths.Audio.bird, ContentPaths.Effects.pierce) { Mode = Attack.AttackMode.Dogfight } }; // The bird can hold one item at a time in its inventory Inventory = new Inventory("Inventory", Physics) { Resources = new ResourceContainer { MaxResources = 1 } }; // The shadow is rotated 90 degrees along X, and is 0.25 blocks beneath the creature Matrix shadowTransform = Matrix.CreateRotationX((float)Math.PI * 0.5f); shadowTransform.Translation = new Vector3(0.0f, -0.25f, 0.0f); shadowTransform *= Matrix.CreateScale(0.75f); SpriteSheet shadowTexture = new SpriteSheet(ContentPaths.Effects.shadowcircle); Shadow = new Shadow(Manager, "Shadow", Physics, shadowTransform, shadowTexture); // We set up the shadow's animation so that it's just a static black circle // TODO: Make the shadow set this up automatically List <Point> shP = new List <Point> { new Point(0, 0) }; Animation shadowAnimation = new Animation(Graphics, new SpriteSheet(ContentPaths.Effects.shadowcircle), "sh", 32, 32, shP, false, Color.Black, 1, 0.7f, 0.7f, false); Shadow.AddAnimation(shadowAnimation); shadowAnimation.Play(); Shadow.SetCurrentAnimation("sh"); // The bird will emit a shower of blood when it dies DeathParticleTrigger = new ParticleTrigger("blood_particle", Manager, "Death Gibs", Physics, Matrix.Identity, Vector3.One, Vector3.Zero) { TriggerOnDeath = true, TriggerAmount = 1 }; // The bird is flammable, and can die when exposed to fire. Flames = new Flammable(Manager, "Flames", Physics, this); // Tag the physics component with some information // that can be used later Physics.Tags.Add("Bird"); Physics.Tags.Add("Animal"); NoiseMaker.Noises.Add("chirp", new List <string>() { ContentPaths.Audio.bird }); Stats.FullName = TextGenerator.GenerateRandom("$firstname") + " the bird"; Stats.CurrentClass = new EmployeeClass() { Name = "Bird", Levels = new List <EmployeeClass.Level>() { new EmployeeClass.Level() { Index = 0, Name = "Bird" } } }; AI.Movement.CanFly = true; AI.Movement.CanWalk = false; AI.Movement.CanClimb = false; }
public Sprite(ComponentManager manager, string name, GameComponent parent, Matrix localTransform, SpriteSheet spriteSheet, bool addToCollisionManager) : base(name, parent, localTransform, Vector3.Zero, Vector3.Zero, addToCollisionManager) { SpriteSheet = spriteSheet; Animations = new Dictionary <string, Animation>(); OrientationType = OrientMode.Spherical; BillboardRotation = 0.0f; DistortPosition = true; DrawSilhouette = false; SilhouetteColor = new Color(0.0f, 1.0f, 1.0f, 0.5f); }
public void Render(DwarfTime gameTime, ChunkManager chunks, Camera camera, SpriteBatch spriteBatch, GraphicsDevice graphicsDevice, Shader effect, bool renderingForWater) { ApplyTintingToEffect(effect); if (!IsVisible) { return; } if (CurrentAnimation != null && CurrentAnimation.CurrentFrame >= 0 && CurrentAnimation.CurrentFrame < CurrentAnimation.Primitives.Count) { CurrentAnimation.PreRender(); SpriteSheet = CurrentAnimation.SpriteSheet; if (OrientationType != OrientMode.Fixed) { if (camera.Projection == Camera.ProjectionMode.Perspective) { if (OrientationType == OrientMode.Spherical) { float xscale = GlobalTransform.Left.Length(); float yscale = GlobalTransform.Up.Length(); float zscale = GlobalTransform.Forward.Length(); Matrix rot = Matrix.CreateRotationZ(BillboardRotation); Matrix bill = Matrix.CreateBillboard(GlobalTransform.Translation, camera.Position, camera.UpVector, null); Matrix noTransBill = bill; noTransBill.Translation = Vector3.Zero; Matrix worldRot = Matrix.CreateScale(new Vector3(xscale, yscale, zscale)) * rot * noTransBill; worldRot.Translation = DistortPosition ? bill.Translation + VertexNoise.GetNoiseVectorFromRepeatingTexture(bill.Translation) : bill.Translation; effect.World = worldRot; } else { Vector3 axis = Vector3.Zero; switch (OrientationType) { case OrientMode.XAxis: axis = Vector3.UnitX; break; case OrientMode.YAxis: axis = Vector3.UnitY; break; case OrientMode.ZAxis: axis = Vector3.UnitZ; break; } Matrix worldRot = Matrix.CreateConstrainedBillboard(GlobalTransform.Translation, camera.Position, axis, null, null); worldRot.Translation = DistortPosition ? worldRot.Translation + VertexNoise.GetNoiseVectorFromRepeatingTexture(worldRot.Translation) : worldRot.Translation; effect.World = worldRot; } } else { Matrix rotation = Matrix.CreateRotationY(-(float)Math.PI * 0.25f) * Matrix.CreateTranslation(GlobalTransform.Translation); rotation.Translation = DistortPosition ? rotation.Translation + VertexNoise.GetNoiseVectorFromRepeatingTexture(rotation.Translation) : rotation.Translation; effect.World = rotation; } } else { Matrix rotation = GlobalTransform; rotation.Translation = DistortPosition ? rotation.Translation + VertexNoise.GetNoiseVectorFromRepeatingTexture(rotation.Translation) : rotation.Translation; effect.World = rotation; } effect.MainTexture = SpriteSheet.GetTexture(); if (DrawSilhouette) { Color oldTint = effect.VertexColorTint; effect.VertexColorTint = SilhouetteColor; graphicsDevice.DepthStencilState = DepthStencilState.None; var oldTechnique = effect.CurrentTechnique; effect.CurrentTechnique = effect.Techniques[Shader.Technique.Silhouette]; foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); CurrentAnimation.Primitives[CurrentAnimation.CurrentFrame].Render(graphicsDevice); } graphicsDevice.DepthStencilState = DepthStencilState.Default; effect.VertexColorTint = oldTint; effect.CurrentTechnique = oldTechnique; } foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); CurrentAnimation.Primitives[CurrentAnimation.CurrentFrame].Render(graphicsDevice); } } }
public void SetFrame(SpriteSheet Sheet, Rectangle Rect, float Width, float Height, Color Color, Color VertColor, bool Flipped) { var texture = Sheet.GetTexture(); if (texture == null) { return; } var tileBounds = new Vector4( ((float)Rect.X / texture.Width) + 0.001f, ((float)Rect.Y / texture.Height) + 0.001f, ((float)Rect.Right / texture.Width) - 0.001f, ((float)Rect.Bottom / texture.Height) - 0.001f); Vertices[0] = new ExtendedVertex( new Vector3(-0.5f * Width, 0.5f * Height, 0.0f), Color, VertColor, new Vector2((float)Rect.Right / texture.Width, (float)Rect.Y / texture.Height), tileBounds); Vertices[1] = new ExtendedVertex( new Vector3(-0.5f * Width, -0.5f * Height, 0.0f), Color, VertColor, new Vector2((float)Rect.Right / texture.Width, (float)Rect.Bottom / texture.Height), tileBounds); Vertices[2] = new ExtendedVertex( new Vector3(0.5f * Width, 0.5f * Height, 0.0f), Color, VertColor, new Vector2((float)Rect.X / texture.Width, (float)Rect.Y / texture.Height), tileBounds); Vertices[3] = new ExtendedVertex( new Vector3(0.5f * Width, -0.5f * Height, 0.0f), Color, VertColor, new Vector2((float)Rect.X / texture.Width, (float)Rect.Bottom / texture.Height), tileBounds); //GameState.Game.GraphicsDevice.SetVertexBuffer(null); if (VertexBuffer == null || VertexBuffer.IsDisposed || VertexBuffer.IsContentLost || VertexBuffer.GraphicsDevice == null || VertexBuffer.GraphicsDevice.IsDisposed) { ResetBuffer(GameState.Game.GraphicsDevice); } else { #if !GEMMONO var buffers = GameState.Game.GraphicsDevice.GetVertexBuffers(); if (buffers.Any(buffer => buffer.VertexBuffer == VertexBuffer)) { GameState.Game.GraphicsDevice.SetVertexBuffer(null); } #endif VertexBuffer.SetData(Vertices); } }
public Table(Vector3 position, SpriteSheet fixtureAsset, Point fixtureFrame) : base("Table", PlayState.ComponentManager.RootComponent, Matrix.Identity, new Vector3(1.0f, 1.0f, 1.0f), Vector3.Zero) { ComponentManager componentManager = PlayState.ComponentManager; Matrix matrix = Matrix.CreateRotationY((float)Math.PI * 0.5f); matrix.Translation = position; LocalTransform = matrix; SpriteSheet spriteSheet = new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture); Point topFrame = new Point(0, 6); Point sideFrame = new Point(1, 6); List <Point> frames = new List <Point> { topFrame }; List <Point> sideframes = new List <Point> { sideFrame }; Animation tableTop = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture), "tableTop", 32, 32, frames, false, Color.White, 0.01f, 1.0f, 1.0f, false); Animation tableAnimation = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(ContentPaths.Entities.Furniture.interior_furniture), "tableTop", 32, 32, sideframes, false, Color.White, 0.01f, 1.0f, 1.0f, false); Sprite tabletopSprite = new Sprite(componentManager, "sprite1", this, Matrix.CreateRotationX((float)Math.PI * 0.5f), spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; tabletopSprite.AddAnimation(tableTop); Sprite sprite = new Sprite(componentManager, "sprite", this, Matrix.CreateTranslation(0.0f, -0.05f, -0.0f) * Matrix.Identity, spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; sprite.AddAnimation(tableAnimation); Sprite sprite2 = new Sprite(componentManager, "sprite2", this, Matrix.CreateTranslation(0.0f, -0.05f, -0.0f) * Matrix.CreateRotationY((float)Math.PI * 0.5f), spriteSheet, false) { OrientationType = Sprite.OrientMode.Fixed }; sprite2.AddAnimation(tableAnimation); Voxel voxelUnder = new Voxel(); if (PlayState.ChunkManager.ChunkData.GetFirstVoxelUnder(position, ref voxelUnder)) { VoxelListener listener = new VoxelListener(componentManager, this, PlayState.ChunkManager, voxelUnder); } tableAnimation.Play(); Tags.Add("Table"); CollisionType = CollisionManager.CollisionType.Static; if (fixtureAsset != null) { new Fixture(new Vector3(0, 0.3f, 0), fixtureAsset, fixtureFrame, this); } }
protected bool Equals(SpriteSheet other) { return FrameWidth == other.FrameWidth && FrameHeight == other.FrameHeight && string.Equals(AssetName, other.AssetName); }
public static Animation CreateAnimation(Creature.CharacterMode mode, Orientation orient, SpriteSheet texture, float frameHz, int frameWidth, int frameHeight, int row, List<int> cols) { List<Point> frames = new List<Point>(); int numCols = texture.Width / frameWidth; if (cols.Count == 0) { for (int i = 0; i < numCols; i++) { frames.Add(new Point(i, row)); } } else { frames.AddRange(cols.Select(c => new Point(c, row))); } return new Animation(GameState.Game.GraphicsDevice, texture, mode.ToString() + OrientationStrings[(int)orient], frameWidth, frameHeight, frames, true, Color.White, frameHz, (float)frameWidth / 35.0f, (float)frameHeight / 35.0f, false); }
public Tree(ComponentManager manager, Vector3 position, string asset, ResourceLibrary.ResourceType seed, float treeSize) : base("Tree", manager.World.ComponentManager.RootComponent, Matrix.Identity, new Vector3(treeSize * 2, treeSize * 3, treeSize * 2), new Vector3(treeSize * 0.5f, treeSize * 0.25f, treeSize * 0.5f)) { Seedlingsheet = new SpriteSheet(ContentPaths.Entities.Plants.vine, 32, 32); SeedlingFrame = new Point(0, 0); HurtTimer = new Timer(1.0f, false); ComponentManager componentManager = Manager.World.ComponentManager; Matrix matrix = Matrix.Identity; matrix.Translation = position; LocalTransform = matrix; new Mesh("Model", this, Matrix.CreateRotationY((float)(MathFunctions.Random.NextDouble() * Math.PI)) * Matrix.CreateScale(treeSize, treeSize, treeSize) * Matrix.CreateTranslation(new Vector3(0.7f, 0.0f, 0.7f)), asset, false); Health health = new Health(componentManager, "HP", this, 100.0f * treeSize, 0.0f, 100.0f * treeSize); new Flammable(componentManager, "Flames", this, health); Tags.Add("Vegetation"); Tags.Add("EmitsWood"); //new MinimapIcon(this, new ImageFrame(TextureManager.GetTexture(ContentPaths.GUI.map_icons), 16, 1, 0)); Voxel voxelUnder = new Voxel(); if (Manager.World.ChunkManager.ChunkData.GetFirstVoxelUnder(position, ref voxelUnder)) { new VoxelListener(componentManager, this, componentManager.World.ChunkManager, voxelUnder); } Inventory inventory = new Inventory("Inventory", this) { Resources = new ResourceContainer { MaxResources = 500 } }; inventory.Resources.AddResource(new ResourceAmount() { NumResources = (int)(treeSize * 10), ResourceType = ResourceLibrary.ResourceType.Wood }); inventory.Resources.AddResource(new ResourceAmount() { NumResources = (int)(treeSize * 2), ResourceType = seed }); Particles = new ParticleTrigger("Leaves", componentManager, "LeafEmitter", this, Matrix.Identity, new Vector3(treeSize * 2, treeSize * 3, treeSize * 2), new Vector3(treeSize * 0.5f, treeSize * 0.25f, treeSize * 0.5f)) { SoundToPlay = ContentPaths.Audio.vegetation_break }; AddToCollisionManager = true; CollisionType = CollisionManager.CollisionType.Static; }
public static Animation CreateAnimation(Creature.CharacterMode mode, Orientation orient, SpriteSheet texture, float frameHz, int frameWidth, int frameHeight, int row, params int[] cols) { return CreateAnimation(mode, orient, texture, frameHz, frameWidth, frameHeight, row, cols.ToList()); }
/// <summary> /// Initialize function creates all the required components for the bird. /// </summary> /// <param name="spriteSheet">The sprite sheet to use for the bird</param> public void Initialize(SpriteSheet spriteSheet) { // When true, causes the bird to face the direction its moving in Physics.Orientation = Physics.OrientMode.RotateY; // The dimensions of each frame in the sprite sheet (in pixels), as given by the readme const int frameWidth = 24; const int frameHeight = 16; // Create the sprite component for the bird. Sprite = new CharacterSprite (Graphics, Manager, "Bird Sprite", Physics, Matrix.CreateTranslation(0, 0.25f, 0) ); // Flying animation (rows 4 5 6 and 7) Sprite.AddAnimation(CharacterMode.Flying, OrientedAnimation.Orientation.Forward, spriteSheet, // animation will play at 15 FPS 15.0f, frameWidth, frameHeight, // animation begins at row 4 4, // It consists of columns 0, 1 and 2 looped forever 0, 1, 2); Sprite.AddAnimation(CharacterMode.Flying, OrientedAnimation.Orientation.Left, spriteSheet, 15.0f, frameWidth, frameHeight, 5, 0, 1, 2); Sprite.AddAnimation(CharacterMode.Flying, OrientedAnimation.Orientation.Right, spriteSheet, 15.0f, frameWidth, frameHeight, 6, 0, 1, 2); Sprite.AddAnimation(CharacterMode.Flying, OrientedAnimation.Orientation.Backward, spriteSheet, 15.0f, frameWidth, frameHeight, 7, 0, 1, 2); // Hopping animation (rows 0 1 2 and 3) Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Forward, spriteSheet, 5.0f, frameWidth, frameHeight, 0, 0, 1); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Left, spriteSheet, 5.0f, frameWidth, frameHeight, 1, 0, 1); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Right, spriteSheet, 5.0f, frameWidth, frameHeight, 2, 0, 1); Sprite.AddAnimation(CharacterMode.Walking, OrientedAnimation.Orientation.Backward, spriteSheet, 5.0f, frameWidth, frameHeight, 3, 0, 1); // Idle animation (rows 0 1 2 and 3) Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Forward, spriteSheet, 5.0f, frameWidth, frameHeight, 0, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Left, spriteSheet, 5.0f, frameWidth, frameHeight, 1, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Right, spriteSheet, 5.0f, frameWidth, frameHeight, 2, 0); Sprite.AddAnimation(CharacterMode.Idle, OrientedAnimation.Orientation.Backward, spriteSheet, 5.0f, frameWidth, frameHeight, 3, 0); // Used to grab other components Hands = new Grabber("hands", Physics, Matrix.Identity, new Vector3(0.1f, 0.1f, 0.1f), Vector3.Zero); // Used to sense hostile creatures Sensors = new EnemySensor(Manager, "EnemySensor", Physics, Matrix.Identity, new Vector3(20, 5, 20), Vector3.Zero); // Controls the behavior of the creature AI = new BirdAI(this, "Bird AI", Sensors, PlanService); // The bird can peck at its enemies (0.1 damage) Attacks = new List<Attack>{new Attack("Peck", 0.1f, 2.0f, 1.0f, ContentPaths.Audio.pick, ContentPaths.Effects.flash)}; // The bird can hold one item at a time in its inventory Inventory = new Inventory("Inventory", Physics) { Resources = new ResourceContainer { MaxResources = 1 } }; // The shadow is rotated 90 degrees along X, and is 0.25 blocks beneath the creature Matrix shadowTransform = Matrix.CreateRotationX((float)Math.PI * 0.5f); shadowTransform.Translation = new Vector3(0.0f, -0.25f, 0.0f); shadowTransform *= Matrix.CreateScale(0.75f); SpriteSheet shadowTexture = new SpriteSheet(ContentPaths.Effects.shadowcircle); Shadow = new Shadow(Manager, "Shadow", Physics, shadowTransform, shadowTexture); // We set up the shadow's animation so that it's just a static black circle // TODO: Make the shadow set this up automatically List<Point> shP = new List<Point> { new Point(0, 0) }; Animation shadowAnimation = new Animation(Graphics, new SpriteSheet(ContentPaths.Effects.shadowcircle), "sh", 32, 32, shP, false, Color.Black, 1, 0.7f, 0.7f, false); Shadow.AddAnimation(shadowAnimation); shadowAnimation.Play(); Shadow.SetCurrentAnimation("sh"); // The bird will emit a shower of blood when it dies DeathParticleTrigger = new ParticleTrigger("blood_particle", Manager, "Death Gibs", Physics, Matrix.Identity, Vector3.One, Vector3.Zero) { TriggerOnDeath = true, TriggerAmount = 1 }; // The bird is flammable, and can die when exposed to fire. Flames = new Flammable(Manager, "Flames", Physics, this); // Tag the physics component with some information // that can be used later Physics.Tags.Add("Bird"); Physics.Tags.Add("Animal"); NoiseMaker.Noises.Add("chirp", new List<string>(){ContentPaths.Audio.bird}); Stats.FullName = TextGenerator.GenerateRandom("$firstname") + " the bird"; Stats.CurrentClass = new EmployeeClass() { Name = "Bird", Levels = new List<EmployeeClass.Level>() { new EmployeeClass.Level() { Index = 0, Name = "Bird" } } }; }
public Animation(GraphicsDevice device, SpriteSheet sheet, string name, List<Point> frames, bool loops, Color tint, float frameHZ, bool flipped) : this(device, sheet, name, sheet.Width, sheet.Height, frames, loops, tint, frameHZ, sheet.Width / 32.0f, sheet.Height / 32.0f, flipped) { Speeds = new List<float>(); SpeedMultiplier = 1.0f; }
public override void Render(DwarfTime gameTime, ChunkManager chunks, Camera camera, SpriteBatch spriteBatch, GraphicsDevice graphicsDevice, Effect effect, bool renderingForWater) { base.Render(gameTime, chunks, camera, spriteBatch, graphicsDevice, effect, renderingForWater); if(!IsVisible) { return; } if (CurrentAnimation != null && CurrentAnimation.CurrentFrame >= 0 && CurrentAnimation.CurrentFrame < CurrentAnimation.Primitives.Count) { CurrentAnimation.PreRender(); SpriteSheet = CurrentAnimation.SpriteSheet; effect.Parameters["xTexture"].SetValue(SpriteSheet.GetTexture()); if(OrientationType != OrientMode.Fixed) { if(camera.Projection == Camera.ProjectionMode.Perspective) { if(OrientationType == OrientMode.Spherical) { float xscale = GlobalTransform.Left.Length(); float yscale = GlobalTransform.Up.Length(); float zscale = GlobalTransform.Forward.Length(); Matrix rot = Matrix.CreateRotationZ(BillboardRotation); Matrix bill = Matrix.CreateBillboard(GlobalTransform.Translation, camera.Position, camera.UpVector, null); Matrix noTransBill = bill; noTransBill.Translation = Vector3.Zero; Matrix worldRot = Matrix.CreateScale(new Vector3(xscale, yscale, zscale)) * rot * noTransBill; worldRot.Translation = bill.Translation; effect.Parameters["xWorld"].SetValue(worldRot); } else { Vector3 axis = Vector3.Zero; switch(OrientationType) { case OrientMode.XAxis: axis = Vector3.UnitX; break; case OrientMode.YAxis: axis = Vector3.UnitY; break; case OrientMode.ZAxis: axis = Vector3.UnitZ; break; } Matrix worldRot = Matrix.CreateConstrainedBillboard(GlobalTransform.Translation, camera.Position, axis, null, null); effect.Parameters["xWorld"].SetValue(worldRot); } } else { Matrix rotation = Matrix.CreateRotationY(-(float) Math.PI * 0.25f) * Matrix.CreateTranslation(GlobalTransform.Translation); effect.Parameters["xWorld"].SetValue(rotation); } } else { effect.Parameters["xWorld"].SetValue(GlobalTransform); } foreach(EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); CurrentAnimation.Primitives[CurrentAnimation.CurrentFrame].Render(graphicsDevice); } } }
public static Texture2D RenderPatternIcons(GraphicsDevice device, Microsoft.Xna.Framework.Content.ContentManager Content, Gui.TileSheetDefinition Sheet) { InitializeRailLibrary(); var shader = new Shader(Content.Load <Effect>(ContentPaths.Shaders.TexturedShaders), true); var sqrt = (int)(Math.Ceiling(Math.Sqrt(RailPatterns.Count))); var width = MathFunctions.NearestPowerOf2(sqrt * Sheet.TileWidth); var fitHorizontal = width / Sheet.TileWidth; var rowCount = (int)Math.Ceiling((float)RailPatterns.Count / (float)fitHorizontal); var height = MathFunctions.NearestPowerOf2(rowCount * Sheet.TileHeight); RenderTarget2D toReturn = new RenderTarget2D(device, width, height, false, SurfaceFormat.Color, DepthFormat.Depth16, 0, RenderTargetUsage.PreserveContents); var tileSheet = new SpriteSheet(ContentPaths.rail_tiles, 32); device.SetRenderTarget(toReturn); device.Clear(Color.Transparent); shader.SetTexturedTechnique(); shader.MainTexture = AssetManager.GetContentTexture(ContentPaths.rail_tiles); shader.SelfIlluminationEnabled = true; shader.SelfIlluminationTexture = AssetManager.GetContentTexture(ContentPaths.Terrain.terrain_illumination); shader.EnableShadows = false; shader.EnableLighting = false; shader.ClippingEnabled = false; shader.CameraPosition = new Vector3(-0.5f, 0.5f, 0.5f); shader.VertexColorTint = Color.White; shader.LightRamp = Color.White; shader.SunlightGradient = AssetManager.GetContentTexture(ContentPaths.Gradients.sungradient); shader.AmbientOcclusionGradient = AssetManager.GetContentTexture(ContentPaths.Gradients.ambientgradient); shader.TorchlightGradient = AssetManager.GetContentTexture(ContentPaths.Gradients.torchgradient); Viewport oldview = device.Viewport; int rows = height / Sheet.TileWidth; int cols = width / Sheet.TileWidth; device.ScissorRectangle = new Rectangle(0, 0, Sheet.TileWidth, Sheet.TileHeight); device.RasterizerState = RasterizerState.CullNone; device.DepthStencilState = DepthStencilState.Default; Vector3 half = Vector3.One * 0.5f; half = new Vector3(half.X, half.Y, half.Z); foreach (EffectPass pass in shader.CurrentTechnique.Passes) { int ID = 0; foreach (var type in RailPatterns) { int row = ID / cols; int col = ID % cols; var xboundsMin = 0; var xboundsMax = 0; var yboundsMin = 0; var yboundsMax = 0; var primitive = new RawPrimitive(); foreach (var piece in type.Pieces) { var rawPiece = Library.GetRailPiece(piece.RailPiece); var bounds = Vector4.Zero; var uvs = tileSheet.GenerateTileUVs(rawPiece.HasValue(out var raw) ? raw.Tile : Point.Zero, out bounds); primitive.AddQuad( Matrix.CreateRotationY((float)Math.PI * 0.5f * (float)piece.Orientation) * Matrix.CreateTranslation(new Vector3(piece.Offset.X, 0.0f, piece.Offset.Y)), Color.White, Color.White, uvs, bounds); xboundsMin = Math.Min(xboundsMin, piece.Offset.X); xboundsMax = Math.Max(xboundsMax, piece.Offset.X); yboundsMin = Math.Min(yboundsMin, piece.Offset.Y); yboundsMax = Math.Max(yboundsMax, piece.Offset.Y); } float xSize = xboundsMax - xboundsMin + 1; float ySize = yboundsMax - yboundsMin + 1; var cameraPos = new Vector3(xboundsMin + (xSize / 2), 2.0f, yboundsMax + 1.0f); device.Viewport = new Viewport(col * Sheet.TileWidth, row * Sheet.TileHeight, Sheet.TileWidth, Sheet.TileHeight); shader.View = Matrix.CreateLookAt(cameraPos, new Vector3((xboundsMin + (xSize / 2)), 0.0f, yboundsMin), Vector3.UnitY); shader.Projection = Matrix.CreatePerspectiveFieldOfView(1.0f, 1.0f, 0.1f, 10); shader.World = Matrix.Identity; shader.CameraPosition = cameraPos; pass.Apply(); primitive.Render(device); ++ID; } } device.Viewport = oldview; device.SetRenderTarget(null); return((Texture2D)toReturn); }
public void Initialize() { Physics.Orientation = Physics.OrientMode.RotateY; Sprite = new CharacterSprite(Graphics, Manager, "Moleman Sprite", Physics, Matrix.CreateTranslation(new Vector3(0, 0.1f, 0))); foreach (Animation animation in Stats.CurrentClass.Animations) { Sprite.AddAnimation(animation.Clone()); } Hands = new Grabber("hands", Physics, Matrix.Identity, new Vector3(0.1f, 0.1f, 0.1f), Vector3.Zero); Sensors = new EnemySensor(Manager, "EnemySensor", Physics, Matrix.Identity, new Vector3(20, 5, 20), Vector3.Zero); AI = new CreatureAI(this, "Moleman AI", Sensors, PlanService); Attacks = new List <Attack>() { new Attack(Stats.CurrentClass.Attacks[0]) }; Inventory = new Inventory("Inventory", Physics) { Resources = new ResourceContainer { MaxResources = 16 } }; Matrix shadowTransform = Matrix.CreateRotationX((float)Math.PI * 0.5f); shadowTransform.Translation = new Vector3(0.0f, -0.5f, 0.0f); SpriteSheet shadowTexture = new SpriteSheet(ContentPaths.Effects.shadowcircle); Shadow = new Shadow(Manager, "Shadow", Physics, shadowTransform, shadowTexture); List <Point> shP = new List <Point> { new Point(0, 0) }; Animation shadowAnimation = new Animation(Graphics, shadowTexture, "sh", 32, 32, shP, false, Color.Black, 1, 0.7f, 0.7f, false); Shadow.AddAnimation(shadowAnimation); shadowAnimation.Play(); Shadow.SetCurrentAnimation("sh"); Physics.Tags.Add("Necromancer"); DeathParticleTrigger = new ParticleTrigger("blood_particle", Manager, "Death Gibs", Physics, Matrix.Identity, Vector3.One, Vector3.Zero) { TriggerOnDeath = true, TriggerAmount = 5, SoundToPlay = ContentPaths.Audio.gravel }; Flames = new Flammable(Manager, "Flames", Physics, this); NoiseMaker.Noises["Hurt"] = new List <string> { ContentPaths.Entities.Goblin.Audio.goblinhurt1, ContentPaths.Entities.Goblin.Audio.goblinhurt2, ContentPaths.Entities.Goblin.Audio.goblinhurt3, ContentPaths.Entities.Goblin.Audio.goblinhurt4, }; MinimapIcon minimapIcon = new MinimapIcon(Physics, new ImageFrame(TextureManager.GetTexture(ContentPaths.GUI.map_icons), 16, 3, 0)); NoiseMaker.Noises["Chew"] = new List <string> { ContentPaths.Audio.chew }; NoiseMaker.Noises["Jump"] = new List <string> { ContentPaths.Audio.jump }; Stats.FullName = TextGenerator.GenerateRandom("$goblinname"); //Stats.LastName = TextGenerator.GenerateRandom("$goblinfamily"); Stats.Size = 4; Stats.CanSleep = false; Stats.CanEat = false; }
public EmitterData Clone(SpriteSheet sheet, Point frame) { EmitterData toReturn = Clone() as EmitterData; if (toReturn == null) return null; if (toReturn.Animation != null) { toReturn.Animation = new Animation(GameState.Game.GraphicsDevice, new SpriteSheet(sheet.AssetName), sheet.AssetName, sheet.FrameWidth, sheet.FrameHeight, new List<Point>() {frame}, true, Color.White, 1.0f, 1.0f, 1.0f, false); } return toReturn; }
public Animation(GraphicsDevice device, SpriteSheet sheet, string name, List <Point> frames, bool loops, Color tint, float frameHZ, bool flipped) : this(device, sheet, name, sheet.Width, sheet.Height, frames, loops, tint, frameHZ, sheet.Width / 32.0f, sheet.Height / 32.0f, flipped) { Speeds = new List <float>(); SpeedMultiplier = 1.0f; }
public override void CreateCosmeticChildren(ComponentManager manager) { base.CreateCosmeticChildren(manager); if (Resource.Gui_NewStyle) { var sheetName = String.Format("{0}&{1}-{2}&{3}", Resource.Gui_Graphic.AssetPath, Resource.Gui_Graphic.Frame.X, Resource.Gui_Graphic.Frame.Y, Resource.Gui_Palette); var tiledInstanceGroup = Manager.World.Renderer.InstanceRenderer.GetCombinedTiledInstance(); Texture2D fixedTex = null; if (!tiledInstanceGroup.DoesInstanceSheetExist(sheetName)) { if (DwarfSprites.LayerLibrary.FindPalette(Resource.Gui_Palette).HasValue(out var palette)) { fixedTex = TextureTool.CropAndColorSprite(manager.World.Renderer.GraphicsDevice, AssetManager.GetContentTexture(Resource.Gui_Graphic.AssetPath), Resource.Gui_Graphic.FrameSize, Resource.Gui_Graphic.Frame, DwarfSprites.LayerLibrary.BasePalette.CachedPalette, palette.CachedPalette); } } var sheet = new SpriteSheet(fixedTex) { FrameWidth = Resource.Gui_Graphic.FrameSize.X, FrameHeight = Resource.Gui_Graphic.FrameSize.Y, AssetName = sheetName }; var sprite = AddChild(new SimpleBobber(Manager, "Sprite", Matrix.CreateTranslation(Vector3.UnitY * 0.25f), sheet, Point.Zero, 0.15f, MathFunctions.Rand() + 2.0f, MathFunctions.Rand() * 3.0f)) as Tinter; sprite.LocalTransform = Matrix.CreateTranslation(Vector3.UnitY * 0.25f + MathFunctions.RandVector3Cube() * 0.1f); sprite.LightRamp = Resource.Tint; sprite.SetFlag(Flag.ShouldSerialize, false); } else { var compositeLayers = Resource.CompositeLayers; var tint = Resource.Tint; Tinter sprite = null; // Minor optimization for single layer resources. if (compositeLayers.Count == 1) { var layer = compositeLayers[0]; sprite = AddChild(new SimpleBobber(Manager, "Sprite", Matrix.CreateTranslation(Vector3.UnitY * 0.25f), new SpriteSheet(layer.Asset, layer.FrameSize.X, layer.FrameSize.Y), layer.Frame, 0.15f, MathFunctions.Rand() + 2.0f, MathFunctions.Rand() * 3.0f) { OrientationType = SimpleSprite.OrientMode.Spherical, WorldHeight = 0.75f, WorldWidth = 0.75f, }) as Tinter; sprite.LocalTransform = Matrix.CreateTranslation(Vector3.UnitY * 0.25f + MathFunctions.RandVector3Cube() * 0.1f); } else { var layers = new List <LayeredSimpleSprite.Layer>(); foreach (var layer in compositeLayers) { layers.Add(new LayeredSimpleSprite.Layer { Sheet = new SpriteSheet(layer.Asset, layer.FrameSize.X, layer.FrameSize.Y), Frame = layer.Frame }); } sprite = AddChild(new LayeredBobber(Manager, "Sprite", Matrix.CreateTranslation(Vector3.UnitY * 0.25f + MathFunctions.RandVector3Cube() * 0.1f), layers, 0.15f, MathFunctions.Rand() + 2.0f, MathFunctions.Rand() * 3.0f) { OrientationType = LayeredSimpleSprite.OrientMode.Spherical, WorldHeight = 0.75f, WorldWidth = 0.75f, }) as Tinter; } sprite.LightRamp = tint; sprite.SetFlag(Flag.ShouldSerialize, false); } }