我现在正在尝试制作一个“攻击”动画。但是必须要有冷却时间(大约2-3秒)。
虽然我可以让它这样做,但我目前遇到的问题是动画被切掉了。我所追求的是动画播放完整,然后倒计时计时器开始。
我尝试使用自定义调度事件。然而,因为对象被放入数组中。我试着在其他地方遵循一些建议,但似乎都没有奏效。如果我尝试在将对象推入数组(IE enemiesi.addEventListener(...))之后直接添加事件侦听器,则会得到错误"A term is undefined and has no properties"
或者,如果我尝试将侦听器添加为对象的变量(IE enemy.addEventListener(...);),则会出现错误"addEventListener is not a function"
我还尝试了使用while循环的更简单的方法( AI发起攻击,触发while循环,递增一个整数,直到达到100左右,然后退出并重置为0 )。在while循环期间,判断AI/字符是否可以攻击的布尔值为false。当它退出时,它也会重置为true ),但这样做的问题是,它切断了动画。
如果有任何关于如何对攻击速度进行简单冷却的建议,请帮助。我已经发布了我认为相关的程序部分(涉及创建敌人和推送它,AI如何确定它是否攻击,以及涉及攻击的部分等);
public function addEnemies()
{
enemies = new Array();
var i:int = 1;
while(true)
{
attackDone = cooldown(i);
if(gameLevel["enemy"+i] == null) break;
var enemy = new Object();
enemy.aI = true;
enemy.mc = gameLevel["enemy"+i];
//....
//OTHER VARIABLES
//....
enemy.attackAnimation = new Array (26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40)
//....
enemy.animStep = 0;
//....
//....
enemy.attack = false;
//....
enemy.cooldown = 0
enemy.canAttack = true;
//....
//....
enemy.addEventListener("ATTACK_DONE", attackDone);
enemies.push(enemy);
i++;
}
}确定AI做什么;
public function moveEnemies(timeDiff:int)
{
for(var i:int = 0; i<enemies.length; i++)
{
//Move the enemies
moveCharacter(enemies[i], timeDiff);
enemies[i].playerDistance = player.mc.x - enemies[i].mc.x;
if(enemies[i].playerDistance < 0)
{
enemies[i].playerDistance = -enemies[i].playerDistance;
}
//If hit something, reverse direction
if(enemies[i].hitWallLeft)
{
enemies[i].moveLeft = true;
enemies[i].moveRight = false;
enemies[i].attack = false;
}
else if(enemies[i].hitWallRight)
{
enemies[i].moveLeft = false;
enemies[i].moveRight = true;
enemies[i].attack = false;
}
if(enemies[i].playerDistance <= 10)
{
enemies[i].moveLeft = false;
enemies[i].moveRight = false;
if(enemies[i].canAttack)
enemies[i].attack = true;
}
}
}执行攻击;
public function moveCharacter(char:Object, timeDiff:Number)
{
if(timeDiff < 1) return;
//.......
//.......
//Key Press
var horizontalChange = 0;
var newAnimState:String = "stand";
var newDirection:int = char.direction;
//Test Assumptions
//Move Left
//.......
//.......
//attack
if(char.attack)
{
newAnimState = "attack";
}
//.......
//.......
//.......
//.......
//.......
//.......
//.......
//.......
//.......
//.......
//Set new position of Character
char.mc.x = newX;
char.mc.y = newY;
//.......
//.......
//.......
char.animState = newAnimState;
//.......
//.......
//.......
//.......
else if(char.animState == "attack")
{
char.animStep += timeDiff / 60;
if(char.animStep > char.attackAnimation.length)
{
char.animStep = 0;
}
char.mc.gotoAndPlay(char.attackAnimation[Math.floor(char.animStep)]);
}
//.......
//.......
}发布于 2014-04-30 15:06:58
必须在EventDispatcher上调用addEventListener -一个可以分派您正在等待的事件的类。
你试着在一个简单的对象上调用它:
var enemy = new Object();
enemy.addEventListener("ATTACK_DONE", attackDone);这就是你得到这个错误的原因。您应该创建自己的自定义类来调度此事件。
而且,当你开始你的动画时,没有地方可以派送它。它应该在电影的最后一帧,或者你应该做一些代码,以便知道动画何时结束(查找帧标签;设置计时器;在关键帧上调度事件,或任何你喜欢的)。
https://stackoverflow.com/questions/23378949
复制相似问题