アクションスクリプト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;
}
}
}
}