Actionscript 3 在AS3中移动角色时遇到问题

Actionscript 3 在AS3中移动角色时遇到问题,actionscript-3,Actionscript 3,所以我对ActionScript3有点陌生,如果我错过了解决问题的关键,请告诉我,我会发布它,但无论如何 所以我有两层。顶层是内容,底层是as3(用于actionscript)。在我的内容中,我有一个大约在舞台中央的蓝色小球。在我的as3层中,我有以下代码: //Add the event listeners... stage.addEventListener(Event.ENTER_FRAME, moveBall); stage.addEventListener(KeyboardEvent.K

所以我对ActionScript3有点陌生,如果我错过了解决问题的关键,请告诉我,我会发布它,但无论如何

所以我有两层。顶层是内容,底层是as3(用于actionscript)。在我的内容中,我有一个大约在舞台中央的蓝色小球。在我的as3层中,我有以下代码:

//Add the event listeners...
stage.addEventListener(Event.ENTER_FRAME, moveBall);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keypress);
stage.addEventListener(KeyboardEvent.KEY_UP, keyrelease);

//Movement variables...
var velY;
var velX;
var power = 5;
var friction = 0.95;

//Key variables...
var right;
var left;
var up;
var down;

function keyrelease(event:KeyboardEvent) {
    right = false;
    left = false;
    down = false;
    up = false;
}

function keypress(event:KeyboardEvent) {
    if (event.keyCode == 39) {
        right = true;
    }
    if (event.keyCode == 37) {
        left = true;
    }
    if (event.keyCode == 38) {
        up = true;
    }
    if (event.keyCode == 40) {
        down = true;
    }
}

function moveBall(event:Event) {
    if (right == true) {
        velX += power;
    }
    if (left == true) {
        velX -= power;
    }
    if (up == true) {
        velY += power;
    }
    if (down == true) {
        velY -= power;
    }

    character.x += velX;
    character.y += velY;


    velY *= friction;
    velX *= friction;
}

基本上,我所做的是检查是否按下了一个键,如果是这样,我使velY或velX的功率相等,这将以某种方式增加小蓝球,并且velY和velX将继续减小,直到(由于舍入误差)它变为零,蓝球停止。但是,按键没有任何作用,出于某种原因,我的蓝色小圆圈位于屏幕的左上角。

这是因为您没有初始化速度变量。这些是非类型化的,因此它们的初始值是
未定义的

在这些行中,它们会自动升级为
Number

character.x += velX;
character.y += velY;
未定义
强制为
数字
时,它将变为
NaN
(不是数字)。因此,得到的坐标是
NaN
。FlashPlayer对此的响应是将
DisplayObject
设置为0

另外,我建议使用
flash.geom.Point
(很好地操纵坐标)、
flash.ui.Keyboard
(可读性更好)和
flash.utils.Dictionary
(而不是使用许多标志和ifs,构建查找图)


由于未定义velY和velX,因此当您尝试从中添加或减去时,会产生意外的结果。首先使用

废话

//Add the event listeners...
stage.addEventListener(Event.ENTER_FRAME, moveBall);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keypress);
stage.addEventListener(KeyboardEvent.KEY_UP, keyrelease);

//Movement variables...
const power:Number = 5;
const friction:Number = 0.95;
var velocity:Point = new Point();

var map:Dictionary = new Dictionary();
map[Keyboard.LEFT] = new Point(-power, 0);
map[Keyboard.UP] = new Point(0, -power);
map[Keyboard.RIGHT] = new Point(power, 0);
map[Keyboard.DOWN] = new Point(0, -power);

var acceleration:Dictionary = new Dictionary();

function keyrelease(event:KeyboardEvent):void {
    delete acceleration[map[event.keyCode]];
}

function keypress(event:KeyboardEvent):void {
    var p:Point = map[event.keyCode];
    if (p) acceleration[p] = p;
}

function moveBall(event:Event):void {
    for each (var p:Point in acceleration) velocity = velocity.add(p);
    character.x += velocity.x;
    character.y += velosity.y;
    velocity.normalize(velocity.length * friction);
}