예제 #1
0
        public static void GenerateFromCsv(string csv, SpriteMapping spriteMapping, GameLayer layer)
        {
            var spriteNames = CsvHelper.ReadCsv(csv);
            var tiles       = TransformNamesToVectors(spriteNames, spriteMapping.Width, spriteMapping.Height);

            foreach (var tile in tiles)
            {
                var tileNames  = tile.Value;
                var tileArray  = tileNames.Split(';');
                var tileName   = string.Format("Tile_{0}_{1}_{2}", tileNames, tile.Key.X, tile.Key.Y);
                var gameObject = new GameObject(tileName, tile.Key);

                var spriteName = tileArray[0];
                var sprite     = new SpriteMappingComponent(spriteMapping, spriteName);

                if (tileArray.Count() > 1)
                {
                    var blockingProperty = tileArray[1];
                    if (blockingProperty.ToUpperInvariant() == "B")
                    {
                        var boundary = new BoundaryComponent(spriteMapping.Width, spriteMapping.Height);
                        gameObject.AddComponent(boundary);
                    }
                }
                gameObject.AddComponent(sprite);
                layer.AddGameObject(gameObject);
            }
        }
예제 #2
0
        private void CreateBossOne(int enemyBulletDelay, int scale = 1)
        {
            var xPosition = GameHelper.GetRelativeScaleX(0.5f);
            var enemy     = new GameObject("Boss", new Vector2(xPosition, 0))
            {
                Scale = scale
            };

            var shipTexture            = SpaceGraphics.BossAAsset.First();
            var enemySprite            = new SpriteComponent(shipTexture);
            var enemyMovement          = new MovementComponent(0.1f, FaceDirection.Down, new Vector2(0, 1));
            var enemyBullet            = new BulletComponent(TopDown.EnemyBulletName, SpaceGraphics.BulletAsset[0], enemyMovement);
            var enemyBoundary          = new BoundaryComponent(SpaceGraphics.BoundaryAsset.First(), shipTexture.Width, shipTexture.Height);
            var enemyTimed             = new TimedActionComponent(ObjectEvent.Fire, enemyBulletDelay);
            var enemyOutOfBounds       = new OutOfBoundsComponent(ObjectEvent.RemoveEntity);
            var healthCounterComponent = new CounterIncrementComponent(ObjectEvent.CollisionEnter, ObjectEvent.HealthRemoved, ObjectEvent.HealthEmpty, ObjectEvent.HealthReset, 5, 0);
            var healthBarComponent     = new SpriteRepeaterComponent(SpaceGraphics.HealthBarAsset[1], new Vector2(0, 25), false, ObjectEvent.HealthRemoved, healthCounterComponent);
            var deathAction            = new ObjectEventComponent(ObjectEvent.HealthEmpty, BossDeath);

            enemy.AddComponent(enemySprite);
            enemy.AddComponent(enemyMovement);
            enemy.AddComponent(enemyBullet);
            enemy.AddComponent(enemyBoundary);
            enemy.AddComponent(enemyOutOfBounds);
            enemy.AddComponent(enemyTimed);
            enemy.AddComponent(healthCounterComponent);
            enemy.AddComponent(healthBarComponent);
            enemy.AddComponent(deathAction);

            ForegroundLayer.AddGameObject(enemy);
        }
예제 #3
0
        public void Fire()
        {
            var bulletTexture = _texture2D;
            var direction     = _movementComponent.FaceDirection.GetVector2();

            direction.Normalize();

            var startLocation = Owner.Centre;

            startLocation += (direction * new Vector2(Owner.Width, Owner.Height));
            startLocation += (direction * new Vector2(bulletTexture.Width + 1, bulletTexture.Height + 1));
            startLocation += _offset;

            var bullet = new GameObject(_bulletGameType, startLocation);

            if (_bulletSpeed > 0)
            {
                var movement = new MovementComponent(_bulletSpeed, _movementComponent.FaceDirection, direction);
                bullet.AddComponent(movement);
            }
            if (_bulletAcceleration > 0)
            {
                var acceleration = new AccelerateMovementComponent(new Vector2(0, -_bulletAcceleration));
                bullet.AddComponent(acceleration);
            }

            var bulletSprite   = new SpriteComponent(bulletTexture, color: _color);
            var bulletBoundary = new BoundaryComponent(SpaceGraphics.BoundaryAsset.First(), bulletTexture.Width, bulletTexture.Height, true, false, _ignoreCollisionTypes);

            if (_collisionAction != null)
            {
                var collisionAction = new ObjectEventComponent(ObjectEvent.CollisionEnter, _collisionAction);
                bullet.AddComponent(collisionAction);
            }
            else
            {
                var instanceComponent = new InstanceComponent();
                bullet.AddComponent(instanceComponent);
            }

            var bulletOutOfBounds = new OutOfBoundsComponent(ObjectEvent.RemoveEntity);

            bullet.AddComponent(bulletSprite);
            bullet.AddComponent(bulletBoundary);

            bullet.AddComponent(bulletOutOfBounds);

            Owner.GameLayer.AddGameObject(bullet);
        }
        // PUBLIC


        // PRIVATE

        // PRIVATE STATIC

        // PRIVATE COROUTINE

        // PRIVATE INVOKE

        //--------------------------------------
        //  Events
        //--------------------------------------
        /// <summary>
        /// _ons the user interface collision enter2 D signal.
        /// </summary>
        /// <param name="aTag_string">A tag_string.</param>
        private void _onUICollisionEnter2DSignal(GameObject aCollidedWith_gameobject)
        {
            //WHAT DID WE HIT?
            switch (aCollidedWith_gameobject.tag)
            {
            case CPUPaddleUI.TAG:
            case PlayerPaddleUI.TAG:
                //
                PaddleComponent paddleComponent = aCollidedWith_gameobject.GetComponent <PaddleComponent>();
                view.doHandleCollisionWithPaddle(paddleComponent.velocity);
                paddleComponent.doSpinOnce();
                //
                soundPlaySignal.Dispatch(new SoundPlayVO(SoundType.PADDLE_HIT));
                break;


            case BoundaryComponent.TAG:

                //WHICH TYPE OF BOUNDARY WAS HIT?
                BoundaryComponent boundaryComponent = aCollidedWith_gameobject.GetComponent <BoundaryComponent>();
                //
                switch (boundaryComponent.boundaryType)
                {
                case BoundaryType.LeftGoal:

                    //LEFT BOUND HIT? THEN REWARD RIGHT SCORE
                    rightPaddleScoreChangeSignal.Dispatch(1);
                    soundPlaySignal.Dispatch(new SoundPlayVO(SoundType.GOAL_LOSS));
                    break;

                case BoundaryType.RightGoal:
                    //RIGHT BOUND HIT? THEN REWARD LEFT SCORE
                    leftPaddleScoreChangeSignal.Dispatch(1);
                    soundPlaySignal.Dispatch(new SoundPlayVO(SoundType.GOAL_WIN));
                    break;

                case BoundaryType.None:
                    soundPlaySignal.Dispatch(new SoundPlayVO(SoundType.PADDLE_HIT));
                    break;

                default:
                                        #pragma warning disable 0162
                    throw new SwitchStatementException();
                    break;
                                        #pragma warning restore 0162
                }
                break;
            }
        }
예제 #5
0
        private void MissileCollision(GameObject gameObject)
        {
            var explosionScale   = 7;
            var explosionTexture = SpaceGraphics.LargeExpolosionAsset[0];
            var dimension        = explosionTexture.Width * explosionScale;

            var explosion = new GameObject("Collision", gameObject.TopLeft);
            var animation = new ScaleAnimationComponent(explosionTexture, 0, explosionScale, 100, Color.OrangeRed, null, ObjectEvent.RemoveEntity);
            var boundary  = new BoundaryComponent(null, dimension, dimension, isInvulnerable: true);

            explosion.AddComponent(animation);
            explosion.AddComponent(boundary);

            gameObject.GameLayer.AddGameObject(explosion);
            gameObject.RemoveGameObject();
        }
예제 #6
0
        public void Update(GameTime gameTime)
        {
            if (gameTime.TotalGameTime > _lastTimeSpan.Add(new TimeSpan(0, 0, 0, 1)))
            {
                _lastTimeSpan = gameTime.TotalGameTime;

                // TODO: Use perpendicular
                var y = _random.Next(0, GameConstants.ScreenBoundary.Bottom);


                var isLeftDirection = _random.Next(0, 2) == 1;
                if (isLeftDirection)
                {
                    var x = GameConstants.ScreenBoundary.Right;

                    var asteroid            = new GameObject("Asteroid", new Vector2(x, y));
                    var asteroidInstance    = new InstanceComponent();
                    var asteroidGraphics    = new SpriteComponent(GetRandomTexture());
                    var asteroidMovement    = new MovementComponent(1, FaceDirection.Left, new Vector2(-1, 0));
                    var asteroidBoundary    = new BoundaryComponent(SpaceGraphics.BoundaryAsset.First(), asteroidGraphics.Width, asteroidGraphics.Height);
                    var asteroidOutOfBounds = new OutOfBoundsComponent(ObjectEvent.RemoveEntity, -50, 0, -50, 0);
                    asteroid.AddComponent(asteroidInstance);
                    asteroid.AddComponent(asteroidGraphics);
                    asteroid.AddComponent(asteroidMovement);
                    asteroid.AddComponent(asteroidBoundary);
                    asteroid.AddComponent(asteroidOutOfBounds);
                    _gameLayer.AddGameObject(asteroid);
                }
                else
                {
                    var x                   = GameConstants.ScreenBoundary.Left;
                    var asteroid            = new GameObject("Asteroid", new Vector2(x, y));
                    var asteroidInstance    = new InstanceComponent();
                    var asteroidGraphics    = new SpriteComponent(GetRandomTexture());
                    var asteroidMovement    = new MovementComponent(1, FaceDirection.Right, new Vector2(1, 0));
                    var asteroidBoundary    = new BoundaryComponent(SpaceGraphics.BoundaryAsset.First(), asteroidGraphics.Width, asteroidGraphics.Height);
                    var asteroidOutOfBounds = new OutOfBoundsComponent(ObjectEvent.RemoveEntity, -50, 0, -50, 0);
                    asteroid.AddComponent(asteroidInstance);
                    asteroid.AddComponent(asteroidGraphics);
                    asteroid.AddComponent(asteroidMovement);
                    asteroid.AddComponent(asteroidBoundary);
                    asteroid.AddComponent(asteroidOutOfBounds);

                    _gameLayer.AddGameObject(asteroid);
                }
            }
        }
예제 #7
0
        public void Update(GameTime gameTime)
        {
            var enemyCount = _gameLayer.GameObjects.Count(gameObject => gameObject.GameType == _enemyName);

            _elapsedTimeMilliseconds += gameTime.ElapsedGameTime.TotalMilliseconds;

            if (_elapsedTimeMilliseconds > _spawnDelayMilliseconds &&
                enemyCount < _currentMaximumEnemies &&
                enemyCount < _totalMaximumEnemies)
            {
                _elapsedTimeMilliseconds = 0;
                var xLocation = _random.Next(0, GameConstants.ScreenBoundary.Right - _shipTexture.Width);

                var gameObject = new GameObject(_enemyName, new Vector2(xLocation, 0));
                var sprite     = new SpriteComponent(_shipTexture);
                var movement   = new MovementComponent(1, FaceDirection.Down, new Vector2(0, _speed));
                gameObject.AddComponent(sprite);
                gameObject.AddComponent(movement);

                var bullet      = new BulletComponent(_bulletName, SpaceGraphics.BulletAsset[0], movement, ignoreCollisionTypes: _enemyName);
                var timedAction = new TimedActionComponent(ObjectEvent.Fire, _bulletDelayMilliseconds);
                gameObject.AddComponent(bullet);
                gameObject.AddComponent(timedAction);

                var boundary    = new BoundaryComponent(SpaceGraphics.BoundaryAsset.First(), _shipTexture.Width, _shipTexture.Height, true, false, _enemyName);
                var instance    = new InstanceComponent();
                var outOfBounds = new OutOfBoundsComponent(ObjectEvent.RemoveEntity);
                gameObject.AddComponent(boundary);
                gameObject.AddComponent(instance);
                gameObject.AddComponent(outOfBounds);

                var score           = new ObjectEventComponent(ObjectEvent.CollisionEnter, IncreaseScore);
                var deathSound      = new EventSoundComponent(_deathSound, ObjectEvent.CollisionEnter);
                var collisionAction = new ObjectEventComponent(ObjectEvent.CollisionEnter, CollisionAction);
                gameObject.AddComponent(score);
                gameObject.AddComponent(deathSound);
                gameObject.AddComponent(collisionAction);

                foreach (var objectEventAction in _eventActions)
                {
                    var objectEvent = new ObjectEventComponent(objectEventAction.Item1, objectEventAction.Item2);
                    gameObject.AddComponent(objectEvent);
                }

                _gameLayer.AddGameObject(gameObject);
            }
        }
예제 #8
0
        // PRIVATE STATIC

        // PRIVATE COROUTINE

        // PRIVATE INVOKE

        //--------------------------------------
        //  Events
        //		(This is a loose term for -- handling incoming messaging)
        //
        //--------------------------------------
        /// <summary>
        /// Raises the collision enter2 d event.
        ///
        /// NOTE: This just detect BOUNDS
        ///
        /// </summary>
        /// <param name="aCollision2D">A collision2 d.</param>
        public void OnCollisionEnter2D(Collision2D aCollision2D)
        {
            //Debug.Log (aCollision2D.collider.gameObject.tag);
            //
            if (aCollision2D.collider.gameObject.tag == BoundaryComponent.TAG)
            {
                //
                BoundaryComponent boundaryComponent = aCollision2D.collider.gameObject.GetComponent <BoundaryComponent>();
                //
                if (boundaryComponent.boundaryType == BoundaryType.LeftGoal)
                {
                    //Debug.Log ("OnCollisionEnter2D() " + boundaryComponent.boundaryType);
                }
                else if (boundaryComponent.boundaryType == BoundaryType.RightGoal)
                {
                    //Debug.Log ("OnCollisionEnter2D() " + boundaryComponent.boundaryType);
                }
            }
        }
예제 #9
0
        private GameObject CreatePlayer(int playerNumber, Color color)
        {
            // MonoGame works in Radians
            // http://msdn.microsoft.com/en-us/library/system.math.sin%28v=vs.110%29.aspx
            var startX        = GameHelper.GetRelativeScaleX(0.1f);
            var startLocation = new Vector2(startX, _waveTopY) + new Vector2(playerNumber * startX, 0);
            var startRotation = (float)(90 * (Math.PI / 180));

            var texture            = SurfingGraphics.Surfboard_Large_White_Asset;
            var player             = new GameObject("Player", startLocation, startRotation);
            var airGravityMovement = new AccelerateMovementComponent(new Vector2(0, 0.05f));
            var outOfBoundary      = new OutOfBoundsComponent(ObjectEvent.ResetEntity);
            var boundary           = new BoundaryComponent(texture, texture.Width, texture.Height);
            var rotationMovement   = new RotationMovementComponent(2, Vector2.Zero);
            var rotation           = new RotationComponent(Vector2.Zero);
            var sprite             = new SpriteComponent(texture, rotationOrigin: texture.Centre(), color: color);

            player.AddComponent(airGravityMovement);
            player.AddComponent(sprite);
            player.AddComponent(rotationMovement);
            player.AddComponent(boundary);
            player.AddComponent(outOfBoundary);
            player.AddComponent(rotation);

            var onWave = "OnWave";
            var inAir  = "InAir";

            var state = new StateStringComponent();

            state.AddComponentState(rotationMovement, onWave, inAir);
            state.AddComponentState(rotation, inAir, onWave);
            state.AddComponentState(airGravityMovement, inAir, onWave);

            player.AddComponent(state);

            var boundaryState = new BoundaryStateComponent(new Rectangle(0, _waveTopY, GameHelper.GetRelativeScaleX(1f), (int)(_waveHeight * 1.3f)), onWave, inAir);

            player.AddComponent(boundaryState);

            ForegroundLayer.AddGameObject(player);

            return(player);
        }
예제 #10
0
        private GameObject CreatePlayer(string playerCharacter, int xStartPosition, int yStartPosition, Keys key)
        {
            var player = new GameObject(playerCharacter, new Vector2(xStartPosition, yStartPosition));
            // TODO: Pass in the actual player selected character through constructor
            var sprites          = new SpriteMappingComponent(RpgGraphics.GameboySpriteMapping, playerCharacter);
            var bounday          = new BoundaryComponent(null, 16, 16);
            var constantMovement = new AccelerateMovementComponent(GetMovement);
            var collisionEvent   = new ObjectEventComponent(ObjectEvent.CollisionEnter, CollisionEnter);
            var collisionExit    = new ObjectEventComponent(ObjectEvent.CollisionExit, CollisionExit);
            var keyAction        = new KeyboardActionComponent(key, PlayerAttacked);

            player.AddComponent(sprites);
            player.AddComponent(bounday);
            player.AddComponent(constantMovement);
            player.AddComponent(collisionEvent);
            player.AddComponent(collisionExit);
            player.AddComponent(keyAction);
            ForegroundLayer.AddGameObject(player);
            return(player);
        }
예제 #11
0
        private void CreatePlayer()
        {
            var xPosition = GameHelper.GetRelativeScaleX(0.5f);
            var yPosition = GameHelper.GetRelativeScaleY(0.8f);

            // PLAYER
            var player = new GameObject(TopDown.PlayerName, new Vector2(xPosition, yPosition));

            // GENERAL
            var texture  = SpaceGraphics.PlayerShipAsset.First();
            var sprite   = new SpriteComponent(texture);
            var boundary = new BoundaryComponent(SpaceGraphics.BoundaryAsset.First(), texture.Width, texture.Height);

            player.AddComponent(boundary);
            player.AddComponent(sprite);

            // MOVEMENT
            var movement      = new MovementComponent(5, FaceDirection.Up, Vector2.Zero);
            var localKeyboard = new LocalKeyboardComponent();
            var input         = new InputComponent(InputHelper.KeyboardMappedKey(), localKeyboard, movement);

            player.AddComponent(movement);
            player.AddComponent(input);

            // THRUSTER
            var thrusterLeft  = new SpriteComponent(SpaceGraphics.FlameAsset, new Vector2(2, 16), color: Color.BlueViolet);
            var thrusterRight = new SpriteComponent(SpaceGraphics.FlameAsset, new Vector2(11, 16), color: Color.BlueViolet);

            player.AddComponent(thrusterLeft);
            player.AddComponent(thrusterRight);

            // GUNS
            var gunLeft  = new SpriteComponent(SpaceGraphics.PlayerGunLeftAsset, new Vector2(-6, 8), color: Color.White);
            var gunRight = new SpriteComponent(SpaceGraphics.PlayerGunRightAsset, new Vector2(16, 8), color: Color.White);

            player.AddComponent(gunLeft);
            player.AddComponent(gunRight);

            // STATE
            var state = new StateComponent();

            state.AddComponentState(thrusterLeft, movement);
            state.AddComponentState(thrusterRight, movement);
            player.AddComponent(state);

            // HEALTH
            var healthCounter = new CounterIncrementComponent(ObjectEvent.CollisionEnter, ObjectEvent.HealthRemoved, ObjectEvent.HealthEmpty, ObjectEvent.HealthReset, 5, 0);
            var healthBar     = new SpriteRepeaterComponent(SpaceGraphics.HealthBarAsset.First(), new Vector2(0, 35), false, ObjectEvent.HealthRemoved, healthCounter, false, Color.ForestGreen);

            //healthBar.SetDynamicColors(Color.DarkRed, Color.Red, Color.Orange, Color.Yellow, Color.ForestGreen);
            healthBar.SetColorEvent(ObjectEvent.HealthRemoved, HealthColourFunc);
            player.AddComponent(healthCounter);
            player.AddComponent(healthBar);

            // TODO: Refactor into their own game objects that are attached to PlayerObject
            // FIRING - MACHINE GUN
            var machineGun   = new BulletComponent(TopDown.PlayerBulletName, SpaceGraphics.LargeBulletAsset, movement, ObjectEvent.AmmoRemoved, ObjectEvent.AmmoEmpty, ObjectEvent.AmmoReset, 20, Color.DarkOrange, 0, null, TopDown.EnemyBulletName);
            var ammoCounter  = new CounterIncrementComponent(ObjectEvent.Fire, ObjectEvent.AmmoRemoved, ObjectEvent.AmmoEmpty, ObjectEvent.AmmoReset, 50, 0);
            var ammoBar      = new SpriteRepeaterComponent(SpaceGraphics.OnePixelBarAsset.First(), new Vector2(-25, 25), true, ObjectEvent.AmmoRemoved, ammoCounter, true, Color.Red);
            var ammoMovement = new EventMovementComponent(new Vector2(0, 2), ObjectEvent.AmmoRemoved);
            var ammoSound    = new EventSoundComponent(SpaceSounds.Sound_LongFire01, ObjectEvent.AmmoRemoved);

            player.AddComponent(machineGun);
            player.AddComponent(ammoCounter);
            player.AddComponent(ammoMovement);
            player.AddComponent(ammoBar);
            player.AddComponent(ammoSound);

            // FIRING - MISSILE
            var missileKeyboard = new KeyboardEventComponent(Keys.Z, ObjectEvent.MissileFire);
            var missile         = new BulletComponent(TopDown.PlayerBulletName, SpaceGraphics.MissileAsset, movement, ObjectEvent.MissileRemoved, ObjectEvent.MissileEmpty, ObjectEvent.MissileReset, 0, Color.White, 0.5f, new Vector2(-10, 5), TopDown.EnemyBulletName);
            var missileCounter  = new CounterIncrementComponent(ObjectEvent.MissileFire, ObjectEvent.MissileRemoved, ObjectEvent.MissileEmpty, ObjectEvent.MissileReset, 50, 0);
            var missileBar      = new SpriteRepeaterComponent(SpaceGraphics.OnePixelBarAsset.First(), new Vector2(-30, 25), true, ObjectEvent.MissileRemoved, missileCounter, true, Color.DarkGray);
            var missileMovement = new EventMovementComponent(new Vector2(0, 5), ObjectEvent.MissileRemoved);
            var missileSound    = new EventSoundComponent(SpaceSounds.Sound_ShortFire01, ObjectEvent.MissileRemoved);

            missile.SetCollisionAction(MissileCollision);
            player.AddComponent(missileKeyboard);
            player.AddComponent(missile);
            player.AddComponent(missileCounter);
            player.AddComponent(missileMovement);
            player.AddComponent(missileBar);
            player.AddComponent(missileSound);

            // FIRING - LASER
            var laserKeyboard = new KeyboardEventComponent(Keys.C, ObjectEvent.LaserFire);
            var laser         = new BulletComponent(TopDown.PlayerBulletName, SpaceGraphics.LaserAsset, movement, ObjectEvent.LaserRemoved, ObjectEvent.LaserEmpty, ObjectEvent.LaserReset, 20, Color.LightBlue, 0, new Vector2(10, 5), TopDown.EnemyBulletName, TopDown.EnemyName);
            var laserCounter  = new CounterIncrementComponent(ObjectEvent.LaserFire, ObjectEvent.LaserRemoved, ObjectEvent.LaserEmpty, ObjectEvent.LaserReset, 50, 0);
            var laserBar      = new SpriteRepeaterComponent(SpaceGraphics.OnePixelBarAsset.First(), new Vector2(-20, 25), true, ObjectEvent.LaserRemoved, laserCounter, true, Color.Blue);
            var laserMovement = new EventMovementComponent(new Vector2(0, 1), ObjectEvent.LaserRemoved);
            var laserSound    = new EventSoundComponent(SpaceSounds.Sound_ShortFire01, ObjectEvent.LaserRemoved);

            player.AddComponent(laserKeyboard);
            player.AddComponent(laser);
            player.AddComponent(laserCounter);
            player.AddComponent(laserMovement);
            player.AddComponent(laserBar);
            player.AddComponent(laserSound);

            // DAMAGE
            var fireCounter = new CounterIncrementComponent(ObjectEvent.CollisionEnter, ObjectEvent.ElectricalFire, ObjectEvent.Ignore, ObjectEvent.Ignore, 0, 5, false);
            var fireSprite  = new SpriteGenericComponent(SpaceGraphics.FireAsset, Vector2.Zero, ObjectEvent.ElectricalFire, fireCounter, RandomDrawMethod);

            player.AddComponent(fireCounter);
            player.AddComponent(fireSprite);

            // DEATH
            var deathEvent = new ObjectEventComponent(ObjectEvent.HealthEmpty, PlayerDeath);

            player.AddComponent(deathEvent);

            ForegroundLayer.AddGameObject(player);
        }