0

我正在写一个小游戏来获得一点乐趣。这是一个简单的回合制战斗游戏,有点像口袋妖怪风格的战斗,但有愚蠢/开玩笑的角色。

我在用户界面的主时间线上有一些东西,但其他一切都在外部动作脚本文件中处理。我有一个战斗类,它有一些与战斗相关的方法,如攻击等,我也有角色作为他们自己的类,它们从接口继承。

在我的用户界面中有一些按钮,当战斗开始时,我的攻击按钮上有一个事件监听器,每次都会执行以下代码:

public function attack(attacker:Character, defender:Character):void
    {

        var defenderHp:int;
        var attackPower:int;
        var postAttackHp:int;

        defenderHp = defender.getHP();
        attackPower = attacker.getAttack();

        if (! passiveBlock(defender))
        {
            if (! criticalStrike(attacker))
            {
                trace("defender hp trace: " + (defenderHp - attackPower));
                postAttackHp = (defenderHp - attackPower);
            }
            else
            {
                trace("defender hp trace: " + Math.floor((defenderHp - (attackPower*1.5))));
                postAttackHp = Math.floor((defenderHp - (attackPower*1.5)));
                displayText = attacker.getName() + " landed a critical strike!";
            }

            if (! postAttackHp > 0)
            {
                gameIsOver(attacker, defender);
            }
            else
            {
                defender.setHP(postAttackHp);
            }
        }
        else
        {
            displayText = defender.getName() + " blocked the attack!";
        }

    }

代码每次都被按钮很好地调用,问题在于 if (! postAttackHp > 0) 条件。出于某种原因,只有在防守方的 HP 低于 0 时才会偶尔调用 game over 方法。我每次都在追踪 postAttackHp 变量,我每次都能看到它低于 0,但 if 语句往往会跳过到其他部分。

奇怪的是,有时它可以正常工作,有时不能正常工作,但更常见的是不工作。

这种设置方式有什么根本上愚蠢的吗?

在此先感谢您的帮助 :)

4

1 回答 1

7

我没有在这台机器上安装 Flash,否则我会尝试看看这是否是问题,但我的第一个猜测是

! postAttackHp > 0

评估为(! postAttackHp) > 0。在这种情况下,只有 是 才是postAttackHp真的== 0。其他任何东西,即使是负数,都会评估为 False,因为! -10= False。False > 0 是 False,因为类型转换 False 会将其保留为 0。

试试看,

if (! (postAttackHp > 0))

或者

if (postAttackHp <= 0)
于 2012-05-29T21:36:37.753 回答