0

学校のプロジェクトで Android ゲームを作成しています。私は Java には精通していますが、ゲームの作成経験はありません。私のゲームでは、ボールはプレーヤーによってコントロールされます。このボールは壁で跳ね返る必要があります。

私はこれを2つの方法で試しましたが、どちらも失敗しました。最初の試行: オーバーラップは検出できますが、ボールが当たる側を検出できません。

c = ボール、r = 壁

    float closestX = c.center.x;
    float closestY = c.center.y;

    if(c.center.x < r.topLeft.x) {
        closestX = r.topLeft.x; 
    } 
    else if(c.center.x > r.topLeft.x + r.width) {
        closestX = r.topLeft.x + r.width;
    }

    if(c.center.y < r.topLeft.y) {
        closestY = r.topLeft.y;
    } 
    else if(c.center.y > r.topLeft.y + r.height) {
        closestY = r.topLeft.y + r.height;
    }

    return c.center.distSquared(closestX, closestY) < c.radius * c.radius;  

そこで、新しいアプローチを試みました。しかし、このアプローチは不安定で、ボールを正方形のように扱います。

cNew = 次の位置のボール、cOld = 現在の位置のボール、r = 壁

    if (cNew.center.x + cNew.radius >= r.topLeft.x && cNew.center.x - cNew.radius <= r.topLeft.x + r.width)
    {
        if (cOld.center.y + cOld.radius <  r.topLeft.y && cNew.center.y + cNew.radius >=  r.topLeft.y)
        {
            return Side.TOP;
        }
        else if (cOld.center.y - cOld.radius >  r.topLeft.y + r.height && cNew.center.y - cNew.radius <=  r.topLeft.y + r.height)
        {
            return Side.BOTTOM;
        }
    }
    if (cNew.center.y + cNew.radius >= r.topLeft.y && cNew.center.y - cNew.radius <= r.topLeft.y + r.height)
    {
        if (cOld.center.x + cOld.radius <  r.topLeft.x && cNew.center.x + cNew.radius >=  r.topLeft.x)
        {
            return Side.LEFT;
        }
        else if (cOld.center.x - cOld.radius >  r.topLeft.x + r.width && cNew.center.x - cNew.radius <=  r.topLeft.x + r.width)
        {
            return Side.RIGHT;
        }
    }
    return null;

これら2つを何らかの方法で組み合わせる必要がありますが、その方法を見つけることができませんでした。

助けていただければ幸いです。

4

2 に答える 2

0

ここで、私がどのように行ったかを説明します。プレイヤー(およびすべての敵)に必要なもの:

  • バツ
  • y
  • w
  • 時間

と :

  • x速度
  • y速度

および次のポイント配列(リスト):

概要 :

  • 上部
  • 下側
  • 左側
  • 右側
  • 一緒に

- 壁との衝突をチェックするための、ボール内のすべてのポイント、アルファ = 0 ではないすべてのピクセル

壁 :

  • 壁は点配列(リスト)として与えられます。たとえば、レベル画像を分析すると、すべての黒いピクセルが追加されます

次に、次の操作を行います。

  • あなたのクラスでは、移動する方法があります

そこでは、次のロジックが必要です:

int miny=Integer.MAX_VALUE;
for (Point p:walls) { //For every point in the walls
     if (p.x >= (int)x && p.x <= (int)x+w && (int)p.x-(int)x < lower_side.length) {
         try {
              Point p2=lower_side[(int)p.x-(int)x]; //Get the point that is on the same height as the walls point
              if (p.y >= (int)(y+p2.y) && (int)(y+p2.y+yvel) >= p.y && p.y-p2.y-1 < miny) { //Check if you are going to hit the wall, and if it is earlier as the earliest point determined.
                  miny=p.y-p2.y-1d; //Where is the earliest point where this can happen
              }
          } catch (Exception bug) {
              System.out.println(bug);
          }
     }
}

これをすべての方向と寸法に適用します。

if (miny != Integer.MAX_VALUE) {
    y=miny; //Set position over the wall
    yvel=-(yvel*0.75); //Bounce off
}

ご不明な点がございましたら、お気軽にコメントしてください。

于 2017-04-26T07:40:35.093 に答える