Возникли проблемы при перемещении персонажа в AS3 - PullRequest
1 голос
/ 01 мая 2011

Так что я немного новичок в ActionScript 3, и если мне не хватает чего-то важного для решения, просто скажите мне, и я опубликую это, но в любом случае ...

Итак, у меня есть 2 слоя. Верхний слой - это контент, а нижний - 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 равными значениям Powe, которые будут увеличивать маленький синий шарик определенным образом, а velY и velX будут уменьшаться до (из-за ошибок округления) оно становится равным нулю, и синий шар останавливается. Но с клавишами ничего не работает, и по какой-то причине мой маленький синий кружочек находится в левом верхнем углу экрана.

Ответы [ 2 ]

0 голосов
/ 01 мая 2011

Поскольку ваши velY и velX не определены, при попытке добавить или вычесть из них получаются неожиданные результаты.Сначала определите их с помощью

CRAP

0 голосов
/ 01 мая 2011

Это потому, что вы не инициализируете переменные скорости. Они не типизированы, поэтому их начальное значение равно undefined.

В этих строках они автоматически повышаются до Number

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

При приведении undefined к Number становится NaN (не число). Таким образом, полученные координаты NaN. FlashPlayer отвечает на это, помещая DisplayObject в 0.

Кроме того, я бы предложил использовать flash.geom.Point (хорошо для манипулирования координатами), flash.ui.Keyboard (гораздо удобнее для чтения) и flash.utils.Dictionary (вместо того, чтобы иметь много флагов и ifs, создавать карты поиска).

//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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...