0

ゲームの衝突に問題があります。ゲームは「タイルベース」です。プレイヤーがそこに入るのをブロックするはずのタイルを配置すると、問題が発生します。タイルに隣接する無限の垂直および水平バリアが生成されます。

これが私のコードです:

double d = delta;
Point oldVerticalPoint = new Point(point.getX(), point.getY());
if (Keyboard.isKeyDown(Keyboard.KEY_UP))
    point.setY((float) (point.getY() - (speed * d)));
if (Keyboard.isKeyDown(Keyboard.KEY_DOWN))
    point.setY((float) (point.getY() + (speed * d)));
for (int x = 1; x <= game.map.width; x++) {
    for (int y = 1; y <= game.map.height; y++) {
        Block block = game.map.getBlock(x, y);
        if (block instanceof BlockWall) {
            BlockWall b = (BlockWall) block;
            Point blockPoint = Block.getStandardBlockCoords(x, y);
            Point playerPoint = game.thePlayer.point;
            if (playerPoint.getY() > blockPoint.getY() && playerPoint.getY() < <blockPoint.getY() + Block.LENGTH)
                game.thePlayer.point = oldVerticalPoint;
        }
    }
}

Point oldHorizontalPoint = new Point(point.getX(), point.getY());;
if (Keyboard.isKeyDown(Keyboard.KEY_LEFT))
    point.setX((float) (point.getX() - (speed * d)));
if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT))
    point.setX((float) (point.getX() + (speed * d)));
for (int x = 1; x <= game.map.width; x++) {
    for (int y = 1; y <= game.map.height; y++) {
        Block block = game.map.getBlock(x, y);
        if (block instanceof BlockWall) {
            BlockWall b = (BlockWall) block;
            Point blockPoint = Block.getStandardBlockCoords(x, y);
            Point playerPoint = game.thePlayer.point;
            if (playerPoint.getX() > blockPoint.getX() && playerPoint.getX() < blockPoint.getX() + Block.LENGTH)
                game.thePlayer.point = oldHorizontalPoint;
        }
    }
}

なぜこれを行うのかわかりません。明確にしておくべきことの 1 つは、2 つの衝突検出がある理由です。プレーヤーが水平方向に壁に向かって移動し、単純なタイルなどの上を垂直方向に移動している場合、プレーヤーの動きが完全に停止することはありません。getStandardBlockCoordsも使用されます。たとえば、ブロックxyx = 1y = 2の場合、ブロックが 2 列目と 1 行目にあることを意味します。このメソッドは、これを単純にピクセル座標に変換します。

LWJGL と Slick2D を使用しています。ヘルプ?

4

1 に答える 1

1

衝突を検出するには、Slick のメソッドを使用する必要があります。それはとても良い考えです。

if (block instanceof BlockWall)
   {
        BlockWall b = (BlockWall)block;
        Point blockPoint= Block.getStandardBlockCoords(x, y);
        Point playerPoint = game.thePlayer.point;
            //You should use playerPoint.contains(blockPoint){ };
        if (playerPoint.getY() > blockPoint.getY() && playerPoint.getY() <
            blockPoint.getY() + Block.LENGTH)
            game.thePlayer.point = oldVerticalPoint; 
        }
    }
}

あなたのコードと私のコードに問題があります。

あなたのコード: あなたのコードは、X と Y の 2 つのポイントをプルします。これらのポイントのみを検証します。たとえば、ブロックが x = 250 および y = 300 で 30 x 50 であるとします。ここで、ブロック全体をチェックできるようにする必要があります。ただし、X と Y の位置に対するチェックのみです。

if(playerPoint.contains(blockPoint)){
    //if only playerPoint x = 250 and y = 300 will this ever be true
}

したがって、x = 260 と y = 330 を確認する場合、点が互いに含まれていないため、if ステートメントは false を返します。ここで、長方形、多角形などの形状を使用した場合、オブジェクトの作成時に作成されるサイズ パラメータがあります。つまりcontains、全体の形状をチェックします。したがって、ポイントが 260 と 330 の場合、if ステートメントは true になります。これは、プレーヤーが blockPoint を含んでいるためです。

それが意味をなさない場合はお知らせください。必要に応じてさらに説明します。

また、あなたのコードは非常に混乱しています。インデントしてください!それは違いの世界を作ります。

于 2013-05-25T07:10:11.320 に答える