我是AS3的新手,我曾经在AS2编码,但一年多以来我不使用Flash或ActionScript。 我的问题是,当我按下左边或右边的箭头时,将角色向右移动,左边的动画就停在第一帧。空闲动画工作正常,但每次按下按钮时,步行动画在第1帧开始和停止。
vector.gotoAndPlay("parado");
var leftKeyDown:Boolean = false;
var rightKeyDown:Boolean = false;
var mainSpeed:Number = 7;
vector.addEventListener(Event.ENTER_FRAME, moveChar);
function moveChar(event:Event):void{
if(leftKeyDown){
if(vector.currentLabel!="andando"){
vector.x -= mainSpeed;
vector.scaleX=-1;
vector.gotoAndPlay("andando");
}
} else {
if(rightKeyDown){
if(vector.currentLabel!="andando") {
vector.x += mainSpeed;
vector.scaleX=1;
vector.gotoAndPlay("andando");
}
}
}
}
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeysDown);
function checkKeysDown(event:KeyboardEvent):void{
if(event.keyCode == 37){
leftKeyDown = true;
}
if(event.keyCode == 39){
rightKeyDown = true;
}
}
stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp);
function checkKeysUp(event:KeyboardEvent):void{
if(event.keyCode == 37){
leftKeyDown = false;
}
if(event.keyCode == 39){
rightKeyDown = false;
}
}
仅供参考:“parado”是我的空闲动画,“andando”是我的漫步动画。
答案 0 :(得分:3)
它不是在第1帧停止,它只是一直被送回第1帧。考虑当您按住按钮几秒钟时会发生什么:
rightKeyDown
以false开头。该分支中没有代码被执行。
用户按住右箭头,rightKeyDown
变为真
moverChar
检查rightKeyDown
,看到它是真的并将该字符发送到“andando”。
moveChar
再次运行,看到rightKeyDown
为真,但角色仍处于“andando”框架,因此它什么也没做。
字符在“andando”之后进入框架。
moverChar
运行,rightKeyDown
仍然是正确的,但框架不再处于“andando”,因此它会重置为它。
并且在用户按住键的所有时间内重复,因此它似乎卡在第1帧和第2帧中
解决此问题的几种方法:
仅在用户按下或释放按钮时更改关键帧,而不是在每个帧之间更改关键帧。
function moveChar(event:Event):void{
if(leftKeyDown){
vector.x -= mainSpeed;
// No frame checks or frame changes here.
}
[...]
function checkKeysDown(event:KeyboardEvent):void{
if(event.keyCode == 37){
leftKeyDown = true;
vector.scaleX=-1;
vector.gotoAndPlay("andando");
// Send the character to the correct frame when the user presses the key.
}
[...]
function checkKeysUp(event:KeyboardEvent):void{
if(event.keyCode == 37){
leftKeyDown = false;
vector.gotoAndPlay("parado");
// Send it back to idle when the user releases the key.
}
[...]
另一种选择是将每个动画单独存储在动画片段中,并将它们放入容器动画片段中。因此,角色的符号中只有两个帧,一个用于空闲动画,另一个用于步行动画。在您的代码中,您使用的是gotoAndStop
而不是gotoAndPlay
,因此无论每帧都调用它都无关紧要。
编辑:还尝试对条件进行分组。
} else {
if(rightKeyDown){
if(vector.currentLabel!="andando") {
vector.x += mainSpeed;
vector.scaleX=1;
vector.gotoAndPlay("andando");
}
}
}
可以改写为
} else if (rightKeyDown && vector.currentLabel != "andando"){
vector.x += mainSpeed;
vector.scaleX=1;
vector.gotoAndPlay("andando");
}