碰撞和移动不按预期工作

时间:2012-04-12 02:42:22

标签: actionscript-3

我试图在Action Script 3中做一个碰撞的例子。这是一个character,它应该在它到达platform时停止。当我只向右,向左,向上或向下移动时,它运行良好,但如果我尝试移动对角线,如果characterplatform发生碰撞,则对象转到屏幕的不同区域。

这是已编译的示例:http://dl.dropbox.com/u/5282142/GameDemo.html

以下是我的代码。

现在,有没有人知道一个更好的方法来做我正在做的事情,或者当我试图在对角线上移动它时,我怎么能让角色不去一个奇怪的位置呢?

var level:Array = new Array();
for (var i = 0; i < numChildren; i++) {
    if (getChildAt(i) is Platform) {
        level.push(getChildAt(i).getBounds(this));
    }
}

var speedX:int = 0;
var speedY:int = 0;

var kLeft:Boolean = false;
var kRight:Boolean = false;
var kDown:Boolean = false;
var kUp:Boolean = false;

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUpHandler);

function onKeyDownHandler(event:KeyboardEvent):void {
    if (event.keyCode == 37) kLeft = true;
    if (event.keyCode == 38) kUp = true;
    if (event.keyCode == 39) kRight = true;
    if (event.keyCode == 40) kDown = true;
}

function onKeyUpHandler(event:KeyboardEvent):void {
    if (event.keyCode == 37) kLeft = false;
    if (event.keyCode == 38) kUp = false;
    if (event.keyCode == 39) kRight = false;
    if (event.keyCode == 40) kDown = false;
}

addEventListener(Event.ENTER_FRAME, loop);

function loop(event:Event):void {
    moveChar();
    bound();
}

function moveChar():void {
    if (kLeft) {
        speedX = -10;
    } else if (kRight) {
        speedX = 10;
    } else {
        speedX *= 0.5;
    }

    if (kUp) {
        speedY = -10;
    } else if (kDown) {
        speedY = 10;
    } else {
        speedY *= 0.5;
    }

    character.x += speedX;
    character.y += speedY;
}

function bound():void {
    if (character.x > (800 - character.width/2)){
        character.x = 800 - character.width/2;
    }
    if (character.x < (character.width/2)){
        character.x = character.width/2;
    }
    if (character.y > (480 - character.height/2)){
        character.y = 480 - character.height/2;
    }
    if (character.y < (character.height/2)){
        character.y = character.height/2;
    }
    for (i = 0; i < level.length; i++) {
        if (character.getBounds(this).intersects(level[i])) {
            if (speedX > 0) {
                character.x = level[i].left - character.width/2;
            }
            if (speedX < 0) {
                character.x = level[i].right + character.width/2;
            }
        }
    }
    for (i = 0; i < level.length; i++) {
        if (character.getBounds(this).intersects(level[i])) {
            if (speedY > 0) {
                character.y = level[i].top - character.height/2;
            }
            if (speedY < 0) {
                character.y = level[i].bottom + character.height/2;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题出在代码的这一部分:

for (i = 0; i < level.length; i++) {
        if (character.getBounds(this).intersects(level[i])) {
            if (speedX > 0) {
                character.x = level[i].left - character.width/2;
            }
            if (speedX < 0) {
                character.x = level[i].right + character.width/2;
            }
        }
    }

for (i = 0; i < level.length; i++) {
            if (character.getBounds(this).intersects(level[i])) {
                if (speedY > 0) {
                    character.y = level[i].top - character.height/2;
                }
                if (speedY < 0) {
                    character.y = level[i].bottom + character.height/2;
                }
            }
        }

角色实际上并未移动到随机位置。它由你在上面设定。

您必须创建一个更好的逻辑(根据场景),当两个键同时关闭时,您的代码不应混淆。发生碰撞。