我正在写一个小游戏,有点乐趣。这是一个简单的回合制战斗游戏,有点像口袋妖怪风格的战斗,但有愚蠢/笑话角色。
我在用户界面的主时间轴上有一些东西,但其他一切都在外部actionscript文件中处理。我有一个类的战斗,有一些与战斗相关的方法,如攻击等,我也有角色作为自己的类继承自接口。
在我的用户界面中有一些按钮,当战斗开始时,我的攻击按钮上有一个事件监听器,每次执行以下代码:
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时调用游戏方法。我每次跟踪postAttackHp变量,每次看到它低于0但是if语句经常会跳过到其他部分。
奇怪的是,有时候它会正常工作,有时却不能正常工作。
这种设置的方式是否存在根本性的愚蠢行为?
提前感谢您的帮助:)
答案 0 :(得分:7)
我没有在这台机器上安装Flash,否则我会试着看看这是不是问题,但我的第一个猜测就是那个
! postAttackHp > 0
正在评估为(! postAttackHp) > 0
。在这种情况下,postAttackHp
为== 0
时才会出现这种情况。由于! -10
= False,任何其他内容,即使是负数,也会评估为False。假的> 0为False,因为类型转换为False会将其保留为0。
尝试其中之一,
if (! (postAttackHp > 0))
或
if (postAttackHp <= 0)