Actionscript 3 在Actionscript 3游戏中只设置一次变量?

Actionscript 3 在Actionscript 3游戏中只设置一次变量?,actionscript-3,actionscript,Actionscript 3,Actionscript,我正在尝试创建一个简单的游戏。我已经建立了一个层“actionscript”,我把所有的代码都放在里面。然后我有一个图像,实例名是“player”。这是我的密码: stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDown); var power = 5; var friction = 0.95; var xspeed = 0; var yspeed = 0; function KeyDown(keyEvent:KeyboardEvent)

我正在尝试创建一个简单的游戏。我已经建立了一个层“actionscript”,我把所有的代码都放在里面。然后我有一个图像,实例名是“player”。这是我的密码:

stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyDown);

var power = 5;
var friction = 0.95;

var xspeed = 0;
var yspeed = 0;

function KeyDown(keyEvent:KeyboardEvent) {
if(keyEvent.keyCode==37) { //left
        xspeed -= power;
    }
    if(keyEvent.keyCode==39) { //right
        xspeed += power;
}

xspeed *= friction;

player.x += xspeed;

//trace(keyEvent.keyCode.toString());
}
突然,脚本每次都会重置
xspeed
(和
yspeed
),因此速度不能上升或下降。如何预防

我正在Actionscript中尝试我的翅膀,因此我想提供一些提示和帮助:)


Martti Laine

我认为你的问题在于你的时间轴上有多个帧,因此每次播放头移动到另一帧时,脚本都会再次运行,所有内容基本上都会重置

以下是我的做法(如果您愿意尝试更高级的东西):
第一步确保在舞台上没有选择任何内容,并在
PUBLISH
标题下找到标记为
Class:
的字段
将文本
DocumentClass
粘贴到其中。
现在,在与fla文件相同的目录中创建文件名
DocumentClass.as

然后将以下内容粘贴到其中,保存并运行fla文件

package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;

// Start class
// This class must extend MovieClip
public class DocumentClass extends MovieClip{
    private var acceleration:Number = 2;
    private var friction:Number = 0.95;
    // Limits the player's speed to prevent it from moving too fast
    private var maxSpeed:Number = 6;

    // The players velocity
    private var playerSpeedX:Number = 0;
    private var playerSpeedY:Number = 0;

    // Keeps track of what keys are pressed
    private var keyLeft:Boolean;
    private var keyRight:Boolean;

    // The contructor for DocumentClass - this is automatically called
    public function DocumentClass(){
        addEventListener(Event.ENTER_FRAME, eventEnterFrame, false, 0, true);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, eventKeyDown, false, 0, true);
        stage.addEventListener(KeyboardEvent.KEY_UP, eventKeyUp, false, 0, true);
    }

    // This function is called when a key is pressed
    private function eventKeyDown(keyEvent:KeyboardEvent):void{
        switch(keyEvent.keyCode){
            // Left
            case 37: keyLeft = true; break;
            // Right
            case 39: keyRight = true; break;
        }
    }
    // This function is called when a key is released
    private function eventKeyUp(keyEvent:KeyboardEvent):void{
        switch(keyEvent.keyCode){
            // Left
            case 37: keyLeft = false; break;
            // Right
            case 39: keyRight = false; break;
        }
    }

    // This function is called every frame.
    // Move the player every frame instead of in the keyboard events.
    private function eventEnterFrame(event:Event):void{
        // If the left key is pressed and the player's speed is under the limit.
        if(keyLeft && playerSpeedX > -maxSpeed)
            playerSpeedX -= acceleration;
        // Otherwise if the right key is pressed and the player's speed is under the limit.
        else if(keyRight && playerSpeedX < maxSpeed)
            playerSpeedX += acceleration;

        playerSpeedX *= friction;

        // I find that when the playerSpeedX values start to get really small the player
        // will seems to just slowly move for a long so I clip the speed when it becomes very small
        if(playerSpeedX < 0.1 && playerSpeedX > -0.1) playerSpeedX = 0;

        player.x += playerSpeedX;
    }


}// End class

}
包{
导入flash.display.MovieClip;
导入flash.events.Event;
导入flash.events.KeyboardEvent;
//开始上课
//此类必须扩展MovieClip
公共类DocumentClass扩展了MovieClip{
专用var加速:数字=2;
私人var摩擦:数值=0.95;
//限制玩家的速度以防止其移动过快
专用var maxSpeed:Number=6;
//运动员的速度
私有变量playerSpeedX:Number=0;
私有变量playerspeydy:Number=0;
//跟踪按下的键
私有变量keyLeft:布尔值;
私有var-keyRight:布尔值;
//DocumentClass的构造函数-这是自动调用的
公共函数DocumentClass(){
addEventListener(Event.ENTER_FRAME,eventEnterFrame,false,0,true);
stage.addEventListener(KeyboardEvent.KEY_DOWN,eventKeyDown,false,0,true);
stage.addEventListener(KeyboardEvent.KEY\u UP,eventKeyUp,false,0,true);
}
//按下某个键时调用此函数
私有函数eventKeyDown(keyEvent:KeyboardEvent):无效{
开关(keyEvent.keyCode){
//左
案例37:keyLeft=true;break;
//对
案例39:keyRight=true;break;
}
}
//释放钥匙时调用此函数
私有函数eventKeyUp(keyEvent:KeyboardEvent):无效{
开关(keyEvent.keyCode){
//左
案例37:keyLeft=false;break;
//对
案例39:keyRight=false;break;
}
}
//此函数每帧调用一次。
//每帧移动播放器,而不是在键盘事件中移动。
私有函数eventEnterFrame(事件:事件):void{
//如果按下左键且播放器的速度低于限制。
if(keyLeft&&playerSpeedX>-maxSpeed)
playerSpeedX-=加速度;
//否则,如果按下右键且播放器的速度低于限制。
else if(键右键和播放器速度-0.1)playerSpeedX=0;
player.x+=playerSpeedX;
}
}//末级
}
当然,如果您现在有点不明白,我已经稍微修改了您的原始代码:

stage.addEventListener(KeyboardEvent.KEY_DOWN, eventKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, eventKeyUp);
addEventListener(Event.ENTER_FRAME, eventEnterFrame);

var power:Number = 5;
var friction:Number = 0.95;

var keyLeft:Boolean;
var keyRight:Boolean;

var xspeed:Number = 0;
var yspeed:Number = 0;

function eventKeyDown(keyEvent:KeyboardEvent):void{
    // Left
    if(keyEvent.keyCode==37){
        keyLeft = true;
    }
    // Right
    if(keyEvent.keyCode==39){
        keyRight = true;
    }
}

function eventKeyUp(keyEvent:KeyboardEvent):void{
    // Left
    if(keyEvent.keyCode==37){
        keyLeft = false;
    }
    // Right
    if(keyEvent.keyCode==39){
        keyRight = false;
    }
}

function eventEnterFrame(event:Event):void{
    if(keyLeft) xspeed -= power;
    if(keyRight) xspeed += power;

    xspeed *= friction;

    if(xspeed < 0.1 && xspeed > -0.1) xspeed = 0;

    player.x += xspeed;
}
stage.addEventListener(KeyboardEvent.KEY\u DOWN,eventKeyDown);
stage.addEventListener(KeyboardEvent.KEY\u UP,eventKeyUp);
addEventListener(Event.ENTER_FRAME,eventEnterFrame);
无功功率:数字=5;
var摩擦:数值=0.95;
var-keyLeft:布尔型;
var-keyRight:布尔型;
var xspeed:Number=0;
var y速度:数字=0;
函数eventKeyDown(keyEvent:KeyboardEvent):无效{
//左
if(keyEvent.keyCode==37){
keyLeft=true;
}
//对
if(keyEvent.keyCode==39){
keyRight=true;
}
}
函数eventKeyUp(keyEvent:KeyboardEvent):无效{
//左
if(keyEvent.keyCode==37){
keyLeft=false;
}
//对
if(keyEvent.keyCode==39){
keyRight=false;
}
}
函数eventEnterFrame(事件:事件):void{
如果(keyLeft)xspeed-=功率;
如果(keyRight)xspeed+=功率;
X速度*=摩擦力;
如果(xspeed<0.1&&xspeed>-0.1)xspeed=0;
player.x+=xspeed;
}