Exemplo n.º 1
0
        private bool BoundingBoxesOverlap(CobaltEntity e1, CobaltEntity e2)
        {
            var p1 = e1.Get <PositionComponent>();
            var s1 = e1.Get <SpriteComponent>();

            var p2 = e2.Get <PositionComponent>();
            var s2 = e2.Get <SpriteComponent>();


            var r1Left   = p1.X;
            var r1Right  = p1.X + s1.Rectangle.Width;
            var r1Top    = p1.Y;
            var r1Bottom = p1.Y + s1.Rectangle.Height;

            var r2Left   = p2.X;
            var r2Right  = p2.X + s2.Rectangle.Width;
            var r2Top    = p2.Y;
            var r2Bottom = p2.Y + s2.Rectangle.Height;

            // AABB. Adapted from: https://gamedev.stackexchange.com/a/913
            return(!(r2Left > r1Right ||
                     r2Right < r1Left ||
                     r2Top > r1Bottom ||
                     r2Bottom < r1Top));
        }
Exemplo n.º 2
0
        public void MoveToKeyboardOverridesExistingKeyboardComponent()
        {
            // The only way to test this is to change the velocity and see if the new velocity number is used
            // Set velocity to 100, press D, wait one second; we should move 100px to the right.
            var expectedVelocity = 100;

            var entity = new CobaltEntity();

            entity.MoveToKeyboard(1);
            entity.MoveToKeyboard(expectedVelocity);

            KeyboardSystem.GenerateKeysCallback(() =>
            {
                // Press D to move X positively
                return(new Keys[] { Keys.D });
            });

            // Simulate keypress
            var keyboardSystem = new KeyboardSystem();

            keyboardSystem.Add(entity);
            keyboardSystem.Update(1);

            var velocitySystem = new VelocitySystem();

            velocitySystem.Add(entity);
            velocitySystem.Update(1);

            Assert.That(entity.Get <PositionComponent>().X, Is.EqualTo(expectedVelocity));
        }
        public void GetGetsSetComponent()
        {
            var entity   = new CobaltEntity();
            var expected = new PositionComponent(1, 2);

            entity.Set(expected);

            Assert.That(entity.Get <PositionComponent>(), Is.EqualTo(expected));
        }
        public void Add(CobaltEntity entity)
        {
            this.entities.Add(entity);

            foreach (var system in this.systems)
            {
                system.Add(entity);
            }
        }
        public void HasReturnsTrueForSetComponents()
        {
            var entity = new CobaltEntity();

            Assert.That(entity.Has <PositionComponent>(), Is.True);
            Assert.That(entity.Has <StringComponent>(), Is.False);

            Assert.That(entity.Has(typeof(PositionComponent)), Is.True);
            Assert.That(entity.Has(typeof(StringComponent)), Is.False);
        }
Exemplo n.º 6
0
        public void MoveToKeyboardSetsKeyboardComponent()
        {
            var entity = new CobaltEntity();

            entity.MoveToKeyboard(100);

            var actual = entity.Get <KeyboardComponent>();

            Assert.That(actual, Is.Not.Null);
        }
        public void SetOverwritesPreviousComponentOfThatType()
        {
            var entity   = new CobaltEntity();
            var expected = new PositionComponent(1, 2);

            entity.Set(new PositionComponent(9, 9));
            entity.Set(expected);

            Assert.That(entity.Get <PositionComponent>(), Is.EqualTo(expected));
        }
        public void ConstructorAddsZeroValuePositionComponent()
        {
            var entity = new CobaltEntity();

            Assert.IsTrue(entity.Has <PositionComponent>());

            var actual = entity.Get <PositionComponent>();

            Assert.That(actual.X, Is.EqualTo(0));
            Assert.That(actual.Y, Is.EqualTo(0));
        }
Exemplo n.º 9
0
        protected override void OnAdd(CobaltEntity entity)
        {
            base.OnAdd(entity);

            var collisionComponent = entity.Get <CollisionComponent>();

            if (collisionComponent.OnCollide != null)
            {
                this.collisionComponentsWithCallbacks.Add(collisionComponent);
            }
        }
Exemplo n.º 10
0
        public void AddAddsEntitiesWithRequiredComponents()
        {
            var system   = new TestableSystem(new Type[] { typeof(VelocityComponent) });
            var expected = new CobaltEntity().Velocity(1, -1);

            system.Add(new CobaltEntity());
            system.Add(expected);

            Assert.That(system.Entities.Count, Is.EqualTo(1));
            Assert.That(system.Entities.Single(), Is.EqualTo(expected));
        }
Exemplo n.º 11
0
        public void MoveToKeyboardAddsVelocityComponentWithWASDCallbacksIfOneDoesntExist()
        {
            var entity = new CobaltEntity();

            entity.MoveToKeyboard(10);

            Assert.That(entity.Has <VelocityComponent>());
            var actual = entity.Get <VelocityComponent>();

            Assert.That(actual.X, Is.EqualTo(0));
            Assert.That(actual.Y, Is.EqualTo(0));
        }
Exemplo n.º 12
0
        public void VelocityAddsVelocityComponent()
        {
            var entity   = new CobaltEntity();
            var expected = new VelocityComponent(11, 22);

            entity.Velocity(expected.X, expected.Y);

            var actual = entity.Get <VelocityComponent>();

            Assert.That(actual.X, Is.EqualTo(expected.X));
            Assert.That(actual.Y, Is.EqualTo(expected.Y));
        }
        public void Add(CobaltEntity entity)
        {
            foreach (var type in this.requiredComponents)
            {
                if (!entity.Has(type))
                {
                    return;
                }
            }

            this.Entities.Add(entity);
            this.OnAdd(entity);
        }
Exemplo n.º 14
0
        public void MoveToKeyboardAddsPositionComponentIfOneDoesntExist()
        {
            var entity = new CobaltEntity();

            entity.MoveToKeyboard(10);

            Assert.That(entity.Has <PositionComponent>());

            var actual = entity.Get <PositionComponent>();

            Assert.That(actual.X, Is.EqualTo(0));
            Assert.That(actual.Y, Is.EqualTo(0));
        }
Exemplo n.º 15
0
        public void MoveSetsPositionComponent()
        {
            var entity   = new CobaltEntity();
            var expected = new PositionComponent(171, 201);

            entity.Move(expected.X, expected.Y);

            var actual = entity.Get <PositionComponent>();

            // They're value types, they're two separate instances.
            Assert.That(actual.X, Is.EqualTo(expected.X));
            Assert.That(actual.Y, Is.EqualTo(expected.Y));
        }
Exemplo n.º 16
0
        public void MoveToKeyboardDoesntOverrideExistingPositionComponent()
        {
            var expectedX = 100;
            var expectedY = 200;

            var entity = new CobaltEntity().Move(expectedX, expectedY);

            entity.MoveToKeyboard(10);

            var actual = entity.Get <PositionComponent>();

            Assert.That(actual.X, Is.EqualTo(expectedX));
            Assert.That(actual.Y, Is.EqualTo(expectedY));
        }
        public LocationMapState() : base()
        {
            this.currentMap = new StaticMap(TmxMapDeserializer.Deserialize("Content/Maps/town.tmx"));

            // Create one entity per tile
            for (var i = 0; i < this.currentMap.Tiles.Length; i++)
            {
                var sourceTile = this.currentMap.Tiles[i];

                this.Add(new CobaltEntity()
                         .Tile(this.currentMap.Tileset,
                               sourceTile.SourceTileX, sourceTile.SourceTileY, this.currentMap.TileWidth, this.currentMap.TileHeight)
                         .Move(sourceTile.X, sourceTile.Y));
            }

            this.player = new CobaltEntity().Sprite("Content/Images/Player.png")
                          .MoveToKeyboard(100)
                          .Move( // Locate just two tiles above the exit.
                this.currentMap.ExitLocationX, this.currentMap.ExitLocationY - 2 * this.currentMap.TileHeight);

            this.Add(this.player);
        }
Exemplo n.º 18
0
        public void EntitiesRequirePositionSpriteAndCollisionComponents()
        {
            var e = new CobaltEntity();

            var system = new CollisionSystem();

            system.Add(e);
            Assert.That(!system.Entities.Any());

            // Position component is there by default
            e.Set(new SpriteComponent(32, 16));
            system.Add(e);
            Assert.That(!system.Entities.Any());

            e.Set(new CollisionComponent("Player"));
            system.Add(e);
            Assert.That(system.Entities.Single(), Is.EqualTo(e));

            system = new CollisionSystem();
            e.Set(new CollisionComponent("Player", "Wall", (p, w) => { }));
            system.Add(e);
            Assert.That(system.Entities.Single(), Is.EqualTo(e));
        }
        public void UpdateUpdatesPositionRelativeToElapsedTime()
        {
            var vX       = 17;
            var vY       = -19;
            var velocity = new VelocityComponent(vX, vY);

            var pX       = 400;
            var pY       = 128;
            var position = new PositionComponent(pX, pY);

            var elapsed = 0.7f;
            var e       = new CobaltEntity();

            e.Set(velocity);
            e.Set(position);

            var system = new VelocitySystem();

            system.Add(e);
            system.Update(elapsed);

            Assert.That(position.X, Is.EqualTo(pX + (elapsed * vX)));
            Assert.That(position.Y, Is.EqualTo(pY + (elapsed * vY)));
        }
        public WorldMapState() : base()
        {
            this.world = World.Instance;
            var worldMap = world.WorldMap;

            // Create one entity per tile
            for (var i = 0; i < worldMap.Tiles.Length; i++)
            {
                var sourceTile = worldMap.Tiles[i];

                this.Add(new CobaltEntity()
                         .Tile(worldMap.Tileset,
                               sourceTile.SourceTileX, sourceTile.SourceTileY, WorldMap.TileWidth, WorldMap.TileHeight)
                         .Move(sourceTile.X, sourceTile.Y));
            }

            var player = new CobaltEntity("remove me").Sprite("Content/Images/Player.png")
                         .MoveToKeyboard(100)
                         .Move(world.WorldMap.StartingPosition.Item1, world.WorldMap.StartingPosition.Item2);

            this.Add(player);

            Console.WriteLine($"Moved player to {player.Get<PositionComponent>().AsVector2}");
        }
Exemplo n.º 21
0
        public void UpdateCallsOnCollideWhenCollisionComponentIsSetAndBoundingBoxesOverlap()
        {
            // Move them so that they overlap, and test.
            var wall = new CobaltEntity();

            wall.Move(0, 0);
            wall.Set(new CollisionComponent("Wall"));
            wall.Set(new SpriteComponent(100, 16));

            var player = new CobaltEntity();

            player.Move(50, 10); // X/Y overlaps wall
            player.Set(new SpriteComponent(32, 32));

            var wasCallbackCalled = false;

            player.Set(new CollisionComponent("Player", "Wall", (p, w) => wasCallbackCalled = true));

            var system = new CollisionSystem();

            system.Add(wall);
            system.Add(player);
            Assert.That(system.Entities.Count == 2, "System doesn't have the player and wall entities.");

            system.Update(0.1f);

            Assert.That(wasCallbackCalled, Is.True);

            // Move them so that they don't overlap, and re-test that it didn't trigger the collision resolution action

            wasCallbackCalled = false;
            player.Move(999, 888);
            system.Update(0.1f);

            Assert.That(wasCallbackCalled, Is.False);
        }
 /// <summary>
 /// Callback that you can override if you need a system to know when an entity was added.
 /// By default, doesn't do anything. For a use-case, see the collision system.
 /// </summary>
 protected virtual void OnAdd(CobaltEntity entity)
 {
 }
Exemplo n.º 23
0
 public void Add(CobaltEntity entity)
 {
 }