2012-04-12 21 views
0

アクションスクリプト3で衝突の例を実行しようとしています。platformになると停止する必要があるのはcharacterです。右、左、上、下の方向に移動するとうまく動作しますが、対角線内を移動しようとすると、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; 
      } 
     } 
    } 
} 
+3

Box2Dのような物理学ライブラリを使用して、将来の脳の崩壊を防ぐことを検討しましたか? – Marty

+0

@PeterSmith私は、Flash CS5.5でBox2Dを使用しようとしています。私は間違いを見つけ、Box2DとFlash CS5.5に問題があるようです。彼らは私に例を再度コンパイルするよう指示しますが、うまくいかないでしょう。 Box2Dパッケージに含まれているサンプルを実行するのは簡単ですね。 – AntonioJunior

+0

私はWCKを使用するこのチュートリアルに従ってBox2Dを動作させました:http://gotoandlearn.com/play.php?id=135 – AntonioJunior

答えて

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つのキーが同時にダウンしたときにコードが混乱しないように、より良いロジックを作成する必要があります(シナリオに従って)&衝突が発生します。

+0

ありがとう、@loxxy。もう一つの問題もあります。 'character.getBounds(this).intersects(level [i])'で 'intersects'関数を使うことで、実際の領域ではなく、ムービークリップの周辺領域との衝突を検出します。私は 'hitTestObject'を使用しますが、私が初心者なので、その関数を使っているロジックを考えることはできません。 – AntonioJunior

+0

それは 'if(object1.hitTestObject(object2)== true){...}'と同じくらい簡単です。 – loxxy

+0

あなたは答えが正しいし、実際問題がそこにあります。しかし、私はこの複雑さを忘れ、物理エンジンを使用します。ありがとうございました! – AntonioJunior

関連する問題