Exemple #1
0
        private static ObjectAction GetShootBulletAction(
            Dictionary <string, DTDanmakuImage> spriteNameToImageDictionary,
            Dictionary <string, EnemyObjectTemplate> enemyObjectTemplates,
            GuidGenerator guidGenerator)
        {
            string angleVariable         = guidGenerator.NextGuid();
            string shootCooldownVariable = guidGenerator.NextGuid();

            ObjectAction initializeAngleVariable = ObjectActionGenerator.DoOnce(
                ObjectAction.SetNumericVariable(angleVariable, MathExpression.RandomInteger(360 * 1000)));

            ObjectAction updateAngleVariableAction = ObjectAction.Union(
                ObjectAction.SetNumericVariable(
                    angleVariable,
                    MathExpression.Add(MathExpression.Variable(angleVariable), MathExpression.Multiply(MathExpression.Constant(150), MathExpression.ElapsedMillisecondsPerIteration()))),
                ObjectAction.Condition(
                    condition: BooleanExpression.GreaterThan(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000)),
                    action: ObjectAction.SetNumericVariable(angleVariable, MathExpression.Subtract(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000)))),
                ObjectAction.Condition(
                    condition: BooleanExpression.GreaterThan(MathExpression.Variable(angleVariable), MathExpression.Constant(360 * 1000)),
                    action: ObjectAction.SetNumericVariable(angleVariable, MathExpression.Constant(0))));

            ObjectAction createBulletAction = ObjectAction.Condition(
                condition: BooleanExpression.Variable("can shoot"),
                action: SpawnBullet(
                    bulletDirectionInMillidegrees: MathExpression.ParentVariable(angleVariable),
                    spriteNameToImageDictionary: spriteNameToImageDictionary,
                    enemyObjectTemplates: enemyObjectTemplates,
                    guidGenerator: guidGenerator));

            IMathExpression shootCooldownInMillis   = MathExpression.Constant(50);
            ObjectAction    startCooldownAction     = ObjectAction.SetNumericVariable(shootCooldownVariable, shootCooldownInMillis);
            ObjectAction    decrementCooldownAction = ObjectAction.SetNumericVariable(shootCooldownVariable, MathExpression.Subtract(MathExpression.Variable(shootCooldownVariable), MathExpression.ElapsedMillisecondsPerIteration()));
            ObjectAction    createBulletWhenCooldownFinishedAction = ObjectAction.Condition(
                condition: BooleanExpression.LessThanOrEqualTo(MathExpression.Variable(shootCooldownVariable), MathExpression.Constant(0)),
                action: ObjectAction.Union(startCooldownAction, createBulletAction));

            return(ObjectAction.Union(
                       initializeAngleVariable,
                       updateAngleVariableAction,
                       ObjectActionGenerator.DoOnce(startCooldownAction),
                       decrementCooldownAction,
                       createBulletWhenCooldownFinishedAction));
        }