libGDX — попытка реализовать столкновение между двумя спрайтами

что название говорит в основном

Немного предыстории текущей игры: игрок всегда движется слева направо, если коснуться экрана, он подпрыгнет, если его перетащить, он бросится вперед. Я добавил плитку (объект «Платформа») и теперь пытаюсь заставить моего игрока перестать двигаться, если он ударит по ней.

Игрок начинается в левом нижнем углу экрана, а Платформа находится в правом верхнем углу. Что происходит, так это то, что игрок останавливается, когда достигает середины экрана, а не фактической платформы. Может ли кто-нибудь взглянуть на мой код и посмотреть, смогут ли они понять, почему? Был бы высоко оценен.

public class Platform extends GameObject {
private Rectangle playerRect;
private Rectangle platformRect;
private Player player;
private boolean isOverlapping;

public Platform(Sprite spr) {
    super(spr);
    player = Player.getInstance(null); // Initialises the Player class (a Singleton)
// Set position of sprite
    setxPos(getWidth() - 400);
    setyPos(getHeight() / 2 - 100);
    spr.setX(getxPos()); 
    spr.setY(getyPos()); 

}

public void update() {
// Rectangle of Player
    playerRect = new Rectangle(player.getxPos(), player.getyPos(), player
            .getSprite().getWidth() + player.getxPos(), player.getSprite()
            .getHeight() + player.getyPos());
// Rectangle of Platform
    platformRect = new Rectangle(getxPos(), getyPos(), getSprite().getWidth()
            + getxPos(), getSprite().getHeight() + getxPos());

// Make Player stop moving if the two rectangles collide
    isOverlapping = playerRect.overlaps(platformRect);
    if (isOverlapping) {
        player.setxSpeed(0);

    }
}
    }

Застрял на этом некоторое время, заранее спасибо за любой вклад


person DeuceDeuce    schedule 23.11.2014    source источник


Ответы (2)


это то, что вы можете увидеть, если прямоугольники находятся там, где вы думаете, и если игрок останавливается, сталкиваясь или иным образом пытаясь что-то сделать, я добавляю его в обновление, но вы можете поместить куда угодно еще рисовать и т. д.

Я надеюсь, вы понимаете.

Переменный класс.

   private ShapeRenderer sRDebugRectangelPlayer = new ShapeRenderer();
   private ShapeRenderer sRDebugRectangelPlatform = new ShapeRenderer();

   private Rectangle playerRect = new Rectangle();
   private Rectangle platformRect = new Rectangle();

Ваш метод

public Platform(Sprite spr) {
super(spr);
player = Player.getInstance(null); // Initialises the Player class (a Singleton)
// Set position of sprite
setxPos(getWidth() - 400);
setyPos(getHeight() / 2 - 100);
spr.setX(getxPos()); 
spr.setY(getyPos()); 

//add

// Rectangle of Player
playerRect = new Rectangle(player.getxPos(), player.getyPos(),
                           player.getSprite().getWidth(),
                           player.getSprite().getHeight());

// Rectangle of Platform
platformRect = new Rectangle(getxPos(), getyPos(), 
                             getSprite().getWidth(), 
                             getSprite().getHeight());
}

Ваш метод

public void update() {

playerRect.setPosition(player.getxPos(), player.getyPos());
platformRect.setPosition(getxPos(), getyPos());



// Make Player stop moving if the two rectangles collide

isOverlapping = playerRect.overlaps(platformRect);

if (isOverlapping) {
        player.setxSpeed(0);
}
}

//добавляем для теста в update или draw

sRDebugRectangelPlayer.begin(ShapeType.Filled);
sRDebugRectangelPlayer.identity();

sRDebugRectangelPlayer.rect(player.getxPos(), player.getyPos(),
                           player.getSprite().getWidth(),
                           player.getSprite().getHeight());

sRDebugRectangelPlayer.end();

//добавляем для тестового обновления или отрисовки

sRDebugRectangelPlatform.begin(ShapeType.Filled);
sRDebugRectangelPlatform.identity();

sRDebugRectangelPlatform.rect(getxPos(), getyPos(), 
                             getSprite().getWidth(), 
                             getSprite().getHeight());

sRDebugRectangelPlatform.end();
person Angel Angel    schedule 23.11.2014
comment
Спасибо за ответ. Я попробовал ваш код, но я не вижу никаких прямоугольников, и теперь спрайт не останавливается (нет обнаружения столкновений). Мне до сих пор не удалось нарисовать прямоугольник в Android, лол. - person DeuceDeuce; 24.11.2014
comment
неважно, я поместил его в draw(), и он работает. Большое спасибо! редактировать: прямоугольники находятся в нужном месте, но столкновение не обнаружено, лол - person DeuceDeuce; 24.11.2014
comment
хорошо, мне пришлось инициализировать прямоугольники в методе update(), теперь все работает. еще раз спасибо - person DeuceDeuce; 24.11.2014
comment
@DeuceDeuce Я рад, что вы работали, но вы не можете сделать так, чтобы он инициализировался в конструкторе? и обновлялся в обновлении, потому что иначе они будут создаваться при каждом обновлении, и я думаю, что это было бы менее эффективно, лучше поверьте, что обновляйте только должности, - person Angel Angel; 24.11.2014
comment
@DeuceDeuce, а не создавать их при каждом звонке, обновлять это только мое мнение, извините за мой английский - person Angel Angel; 24.11.2014

конструктор класса Rectangle требует x, y, ширины, высоты

Но вы предоставляете ему координаты противоположных углов.

Заменять

// Rectangle of Player
playerRect = new Rectangle(player.getxPos(), player.getyPos(), player
        .getSprite().getWidth() + player.getxPos(), player.getSprite()
        .getHeight() + player.getyPos());

// Rectangle of Platform
platformRect = new Rectangle(getxPos(), getyPos(), getSprite().getWidth()
        + getxPos(), getSprite().getHeight() + getxPos());

с

// Rectangle of Player
playerRect = new Rectangle(player.getxPos(), player.getyPos(),
                           player.getSprite().getWidth(),
                           player.getSprite().getHeight());

// Rectangle of Platform
platformRect = new Rectangle(getxPos(), getyPos(), 
                             getSprite().getWidth(), getSprite().getHeight());

Надеюсь это поможет.

person Tanmay Patil    schedule 23.11.2014
comment
Спасибо за ответ, та же проблема. - person DeuceDeuce; 23.11.2014