コード例 #1
0
        }                                                                                                 // does not rotate (i.e. does not respect FacingDirectionInMillidegrees)

        public PlayerBullet(long xMillis, long yMillis, PlayerBulletType bulletType, DTImmutableList <ObjectBox> collisionBoxes)
        {
            this.xMillis         = xMillis;
            this.yMillis         = yMillis;
            this.bulletType      = bulletType;
            this._collisionBoxes = collisionBoxes;
        }
コード例 #2
0
        public static bool HasCollided(
            long object1XMillis,
            long object1YMillis,
            DTImmutableList <ObjectBox> object1Boxes,            /* nullable */
            long object2XMillis,
            long object2YMillis,
            DTImmutableList <ObjectBox> object2Boxes /* nullable */)
        {
            if (object1Boxes == null || object2Boxes == null)
            {
                return(false);
            }
            if (object1Boxes.Count == 0 || object2Boxes.Count == 0)
            {
                return(false);
            }

            for (int i = 0; i < object1Boxes.Count; i++)
            {
                ObjectBox obj1Box = object1Boxes[i];
                for (int j = 0; j < object2Boxes.Count; j++)
                {
                    ObjectBox obj2Box = object2Boxes[j];

                    long obj1Left  = object1XMillis + obj1Box.LowerXMillis;
                    long obj1Right = object1XMillis + obj1Box.UpperXMillis;

                    long obj2Left  = object2XMillis + obj2Box.LowerXMillis;
                    long obj2Right = object2XMillis + obj2Box.UpperXMillis;

                    bool noXCollision = obj1Right < obj2Left || obj2Right < obj1Left;

                    if (!noXCollision)
                    {
                        long obj1Bottom = object1YMillis + obj1Box.LowerYMillis;
                        long obj1Top    = object1YMillis + obj1Box.UpperYMillis;

                        long obj2Bottom = object2YMillis + obj2Box.LowerYMillis;
                        long obj2Top    = object2YMillis + obj2Box.UpperYMillis;

                        bool noYCollision = obj1Top < obj2Bottom || obj2Top < obj1Bottom;

                        if (!noYCollision)
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
コード例 #3
0
        // Returns whether the player collided with any enemy objects
        public static bool HandleCollisionBetweenPlayerAndEnemyObjects(
            List <Player.PlayerSubFramePosition> playerSubFramePositions,
            bool isPlayerDead,
            bool isPlayerInvulnerable,
            List <EnemyObject> enemyObjects)
        {
            if (isPlayerDead)
            {
                return(false);
            }

            if (isPlayerInvulnerable)
            {
                return(false);
            }

            List <ObjectBox> playerCollisionBoxesList = new List <ObjectBox>();

            playerCollisionBoxesList.Add(new ObjectBox(lowerXMillis: -1 * 1000, upperXMillis: 1 * 1000, lowerYMillis: -1 * 1000, upperYMillis: 1 * 1000));
            DTImmutableList <ObjectBox> playerCollisionBoxes = new DTImmutableList <ObjectBox>(playerCollisionBoxesList);

            foreach (EnemyObject enemyObj in enemyObjects)
            {
                if (enemyObj.IsDestroyed)
                {
                    continue;
                }

                foreach (Player.PlayerSubFramePosition playerSubFramePosition in playerSubFramePositions)
                {
                    bool hasCollided = HasCollided(
                        object1XMillis: playerSubFramePosition.XMillis,
                        object1YMillis: playerSubFramePosition.YMillis,
                        object1Boxes: playerCollisionBoxes,
                        object2XMillis: enemyObj.XMillis,
                        object2YMillis: enemyObj.YMillis,
                        object2Boxes: enemyObj.CollisionBoxes);

                    if (hasCollided)
                    {
                        enemyObj.MilliHP = enemyObj.MilliHP - EnemyObject.DAMAGE_TAKEN_IN_MILLIHP_WHEN_COLLIDE_WITH_PLAYER;
                        return(true);
                    }
                }
            }

            return(false);
        }
コード例 #4
0
        public EnemyObject(
            EnemyObjectTemplate template,
            long initialXMillis,
            long initialYMillis,
            long playerXMillis,
            long playerYMillis,
            long elapsedMillisecondsPerIteration,
            bool isPlayerDestroyed,
            EnemyObject parent /* nullable */,
            Dictionary <string, IMathExpression> initialNumericVariables,            /* MathExpression is with respect to the parent */ /* nullable */
            Dictionary <string, BooleanExpression> initialBooleanVariables /* BooleanExpression is with respect to the parent */ /* nullable */,
            IDTDeterministicRandom rng)
        {
            this._objectType     = template.ObjectType;
            this._damageBoxes    = template.DamageBoxes;
            this._collisionBoxes = template.CollisionBoxes;
            this.SpriteName      = template.SpriteName;
            this.Action          = template.Action;
            if (template.InitialMilliHP != null)
            {
                EnemyObjectExpressionInfo enemyObjectExpressionInfo;

                if (parent != null)
                {
                    enemyObjectExpressionInfo = parent.GetEnemyObjectExpressionInfo();
                }
                else
                {
                    enemyObjectExpressionInfo = null;
                }

                this.MilliHP = template.InitialMilliHP.Evaluate(
                    enemyObjectExpressionInfo: enemyObjectExpressionInfo,
                    playerXMillis: playerXMillis,
                    playerYMillis: playerYMillis,
                    elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                    rng: rng);
            }
            else
            {
                this.MilliHP = null;
            }
            this.XMillis = initialXMillis;
            this.YMillis = initialYMillis;
            this.SpeedInMillipixelsPerMillisecond = 0;
            this.MovementDirectionInMillidegrees  = 180 * 1000;
            this.FacingDirectionInMillidegrees    = 180 * 1000;
            this.IsDestroyed      = false;
            this._parentObject    = parent;
            this.NumericVariables = new Dictionary <string, long>();
            this.BooleanVariables = new Dictionary <string, bool>();
            if (initialNumericVariables != null)
            {
                foreach (var keyValuePair in initialNumericVariables)
                {
                    string variableName = keyValuePair.Key;
                    EnemyObjectExpressionInfo enemyObjectExpressionInfo;
                    if (parent != null)
                    {
                        enemyObjectExpressionInfo = parent.GetEnemyObjectExpressionInfo();
                    }
                    else
                    {
                        enemyObjectExpressionInfo = null;
                    }

                    this.NumericVariables.Add(variableName,
                                              keyValuePair.Value.Evaluate(
                                                  enemyObjectExpressionInfo: enemyObjectExpressionInfo,
                                                  playerXMillis: playerXMillis,
                                                  playerYMillis: playerYMillis,
                                                  elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                                  rng: rng));
                }
            }
            if (initialBooleanVariables != null)
            {
                foreach (var keyValuePair in initialBooleanVariables)
                {
                    string variableName = keyValuePair.Key;
                    EnemyObjectExpressionInfo enemyObjectExpressionInfo;
                    if (parent != null)
                    {
                        enemyObjectExpressionInfo = parent.GetEnemyObjectExpressionInfo();
                    }
                    else
                    {
                        enemyObjectExpressionInfo = null;
                    }

                    bool?isParentDestroyed;
                    if (parent != null)
                    {
                        isParentDestroyed = parent.IsDestroyed;
                    }
                    else
                    {
                        isParentDestroyed = null;
                    }

                    this.BooleanVariables.Add(variableName,
                                              keyValuePair.Value.Evaluate(
                                                  enemyObjectExpressionInfo: enemyObjectExpressionInfo,
                                                  isParentDestroyed: isParentDestroyed,
                                                  isPlayerDestroyed: isPlayerDestroyed,
                                                  playerXMillis: playerXMillis,
                                                  playerYMillis: playerYMillis,
                                                  elapsedMillisecondsPerIteration: elapsedMillisecondsPerIteration,
                                                  rng: rng));
                }
            }
        }