1

プレイヤーと多くの同じオブジェクト (この場合は壁のタイル) との間の衝突を検出するときに問題が発生しました。問題は、最後に追加された壁タイルに接触しているときにのみ、プログラムが衝突を検出することです。これはJavaで書かれています...

衝突を検出するために長方形(交差メソッド)を使用しています。

コードサンプル:

タイルを更新する:

        for (int i = 0; i < wallTileArr.size(); i++)
    {
        wallTile = wallTileArr.get(i);
        wallTile.update(p);
        if(wallTile.getBounds().intersects(Screen.getBounds()))
        {
            wallTile.draw = true;
        }
        else if(!wallTile.getBounds().intersects(Screen.getBounds()))
        {
            wallTile.draw = false;
        }
    }

タイルから壁を作る私のクラスは次のとおりです。

     public Wall(int x, int y, int length, int dir, WallTile wallTile)
     {
 this.x = x;
 this.y = y;
 this.length = length;
 this.wallTile = wallTile;


    for(int i = 0; i < length; i++)
    {
        if (dir == 0)
        {
            Methods.addWallTile(new WallTile(x+(wallTile.size*i), y));
        }
        else if (dir == 1)
        {
            Methods.addWallTile(new WallTile(x, y+(wallTile.size*i)));
        }

        else if (dir != 0 || dir != 1)
        {
            System.out.println("Error in setting direction: 0 = horizontal, 1 = vertical. Your input is: "+dir );
            //Methods.Exit(1);
        }

    }

}

そして、ここに壁のある部屋や家を作る私のクラスがあります:

     public HouseSmall_1(int x, int y,int size, int rotation, WallTile wallTile)
    {
this.x = x;
this.y = y;
this.wallTile = wallTile;
this.size = size;


if (rotation == 0)
{
    Methods.addWall(new Wall(x, y, size, 1, wallTile));
    Methods.addWall(new Wall(x+(size*wallTile.size), y, size, 1, wallTile));

    Methods.addWall(new Wall(x, y, size, 0, wallTile));
    Methods.addWall(new Wall(x, y+(size*wallTile.size), (size)/2, 0, wallTile));
    Methods.addWall(new Wall(x+wallTile.size+((size*wallTile.size)/2), y+(size*wallTile.size),(size/2), 0, wallTile));
}

}

タイルと壁を arrayList に追加するコード:

public static void addWallTile(WallTile wallTile)
{
    Controller.wallTileArr.add(wallTile);
}

public static void addWall(Wall wall)
{
    Controller.wallArr.add(wall);
}

wallTile.java ファイルの衝突のコードを更新します。

    public void update(Player p)
{
    x+=Screen.movementX;
    y+=Screen.movementY;

    if(getBounds().intersects(p.upGetBounds()))
    {

        p.walk = false;

    }
    else
    {
        p.walk = true;
    }
}

なぜこうなった?そして、どのように修正することをお勧めしますか?

より多くのコードサンプルをお気軽にお問い合わせください!

4

1 に答える 1

5
if(getBounds().intersects(p.upGetBounds()))
{

    p.walk = false;

}
else
{
    p.walk = true;
}

問題はこのコードです。プレーヤーと衝突していないすべてのタイルのフラグをリセットしているため、最後のタイルのみがプレーヤーと正常に衝突し、フラグがリセットされません。

すなわち - 2 つのタイルがあり、#1衝突していて衝突し#2ていないとしましょう。

ループの最初の繰り返しで -

#1衝突している => p.walk = false;

ループの 2 回目の反復で -

#2衝突していません => p.walk = true;//value has been reset.

ただし、#2衝突した場合、フラグはリセットされません。

else修正するには:句を削除し、ループの前に一度リセットします。true for

于 2013-01-06T12:01:12.480 に答える