0

アクションスクリプト3で衝突の例を実行しようとしています。これはcharacter、に当たると停止するはずplatformです。右、左、上、下の方向にのみ移動するとうまく機能しますが、対角線を移動しようとすると、characterがと衝突しているplatform場合、オブジェクトは画面の別の領域に移動します。

これはコンパイルされた例です: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;
            }
        }
    }
}
4

1 に答える 1

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;
                }
            }
        }

キャラクターは実際にはランダムな位置に移動しません。上記であなたが設定しています。

2つのキーが同時に押されて衝突が発生したときにコードが混乱しないように、(シナリオに従って)より優れたロジックを作成する必要があります。

于 2012-04-12T09:01:43.483 に答える