アクションスクリプト3で衝突の例を実行しようとしています。platform
になると停止する必要があるのはcharacter
です。右、左、上、下の方向に移動するとうまく動作しますが、対角線内を移動しようとすると、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;
}
}
}
}
Box2Dのような物理学ライブラリを使用して、将来の脳の崩壊を防ぐことを検討しましたか? – Marty
@PeterSmith私は、Flash CS5.5でBox2Dを使用しようとしています。私は間違いを見つけ、Box2DとFlash CS5.5に問題があるようです。彼らは私に例を再度コンパイルするよう指示しますが、うまくいかないでしょう。 Box2Dパッケージに含まれているサンプルを実行するのは簡単ですね。 – AntonioJunior
私はWCKを使用するこのチュートリアルに従ってBox2Dを動作させました:http://gotoandlearn.com/play.php?id=135 – AntonioJunior