2016-05-25 15 views
0

私は自分のゲームの衝突を完全に完璧にしようとしています。私がテストしていることは、あなたがプレイヤーと壁を打つと、止まってしまうことです。私は、プレーヤーが壁の左側に当たったとき(壁がプレーヤーの右側にあるとき)の衝突コードを実装しました。ここにコードがあります。LibGdx Javaで完璧な衝突が発生しました

if(entityOnRight){ 
     if(player.getPositionCorner(SquareMapTuples.BOTTOM_RIGHT).x - 
       ent.getPositionCorner(SquareMapTuples.BOTTOM_LEFT).x > -.9f) 
      player.setMovementBooleans(false, false, false, false); 
     else 
      player.setMovementBooleans(true, false, false, false); 
    } 

注:私は非常に遅い行く場合、それは私がそれを停止することを望むプレイヤーを停止しますが、高速で行く、それが衝突私は基本的に

を望むようにしないだろうコードは、壁が右側にある場合はプレーヤの四角形の右下隅をチェックし、壁の左下隅を引いて、2つの間の距離が0.001であるかどうかを確認します。 0.001はほとんど目立たない距離なので、なぜ私はその値を使用したのですか?ここでplayer.setMovementBooleans

public void setMovementBooleans(boolean canMoveRight, boolean canMoveLeft, boolean canMoveUp, boolean canMoveDown){ 

    this.canMoveRight = canMoveRight; 
    if(canMoveRight == false && moveRight) 
     vel.x = 0; 
} 

のコードは(ないパラメータで)PlayerクラスのcanMoveRightブール値であるあなたが右に移動しようとしているときmoveRightは、あなたが移動できるようにすることができますものです。

//If you clicked right arrow key and you're not going 
    //Faster then the max speed 

    if(moveRight && !(vel.x >= 3)){ 
     vel.x += movementSpeed; 
    }else if(vel.x >= 0 && !moveRight){ 
     vel.x -= movementSpeed * 1.5f; 
     System.out.println("stopping"); 
     //Make sure it goes to rest 
     if(vel.x - movementSpeed * 1.5f < 0) 
      vel.x = 0; 
    } 

と::

if(Gdx.input.isKeyPressed(Keys.D) && canMoveRight) 
     moveRight = true; 
    else 
     moveRight = false; 

ので、概要を与えるために、あなたは「D」キーをクリックすると、それが移動を開始することができますここでは、より良いこれらのブール値がどのように相互作用するかを説明しますいくつかのコードがあります。しかし、ブール値canMoveRightがfalseの場合、移動しません。ここでは何が起こるかを示す画像であるあなたが見ることができるように、プレイヤーは、私はそれがしたいその後、更に多くなっ

enter image description here

(プレイヤーが黄色で、壁は緑です)。それはこの時点で停止する必要があります

enter image description here

これを実現する方法を考え出すとすべてのヘルプは非常に感謝されます!

答えて

1

あなたが試した方法は多少複雑すぎるかもしれません:-)。より簡単な方法を提案します。地図とプレーヤーをcom.badlogic.gdx.math.Rectangleインスタンスにします。コードの次の部分では、移動後にプレーヤーがまだマップ内にあるかどうかを確認します。そうであれば移動を許可し、許可しない場合は許可しません:

if(Gdx.input.isKeyPressed(Keys.D){ 
    float requestedX, requestedY; 
    //calculate the requested coordinates 
    Rectangle newPlayerPositionRectangle = new Rectangle(requestedX, requestedY, player.getWidth(), player.getHeight()); 
    if (newPlayerPositionRectangle.overlaps(map) { 
     //move the player 
    } else { 
     //move the player only to the edge of the map and stop there 
    } 
} 
+0

はい.overLapsメソッドは – Luke

+0

を求める部分ですので、あなたの質問に答えましたか? – WonderfulWorld

+0

申し訳ありませんが、私はオーバーラップが実際に組み込まれたメソッドであることを認識しませんでした – Luke

1

これらの衝突を処理する最善の方法は、既にLibgdxでパックされているBox2Dのような物理エンジンを使用することです。 Box2Dで衝突が発生すると、イベントが発生し、そのイベントをeasly扱うことができます。だから、あなたはおそらく一見を参照する必要がありますhere

物理なしでこれを達成する別の方法は、プレーヤと壁(ポリラインでもよい)を表す論理長方形を使用し、Intersectorクラスのlibgdxを使用することです。 はhereです。

関連する問題