libGDX - 尝试实现2个精灵之间的冲突

时间:2014-11-23 16:09:24

标签: java android libgdx sprite collision

标题基本上是什么

关于当前游戏的一些背景知识:玩家总是从左向右移动,如果屏幕被点击,他会跳跃,如果它被拖动,他会向前冲。我添加了一个磁贴(平台对象),现在我试图让我的玩家停止移动,如果他击中它。

播放器从屏幕左下角开始,平台位于右上角。发生的事情是玩家在到达屏幕中间时停止,而不是实际的平台。任何人都可以查看我的代码,看看他们是否可以找出原因?非常感谢。

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);

    }
}
    }

已经坚持了一段时间,提前感谢任何输入

2 个答案:

答案 0 :(得分:1)

Rectangle类的constructor需要x,y,width,height

但是你要为它提供相反角的坐标。

替换

// 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());

希望这有帮助。

答案 1 :(得分:0)

是你可以看到矩形是你想到的地方,如果玩家因碰撞而停止或以其他方式尝试某些东西,我把它放在更新中,但你可以放在其他任何地方画等。

我希望你明白。

变量类。

   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);
}
}

//在更新中添加测试或绘制

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();