【问题标题】:libGDX - Trying to implement collision between 2 spriteslibGDX - 尝试实现 2 个精灵之间的碰撞
【发布时间】:2014-11-23 16:09:23
【问题描述】:

标题基本是什么意思

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

播放器从屏幕左下角开始,平台在右上角。发生的情况是当玩家到达屏幕中间时停止,而不是实际的平台。任何人都可以看看我的代码,看看他们是否能找出原因吗?将不胜感激。

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

    }
}
    }

在此停留了一段时间,在此先感谢您的任何意见

【问题讨论】:

    标签: java android libgdx sprite collision


    【解决方案1】:

    Rectangle 类的 constructor 需要 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());
    

    希望这会有所帮助。

    【讨论】:

    • 感谢回复,还是有同样的问题。
    【解决方案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);
    }
    }
    

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

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

    【讨论】:

    • 感谢您的回复。我试过你的代码,但我没有看到任何矩形,现在精灵没有停止(没有碰撞检测)。我在 Android 中绘制矩形仍然没有成功,哈哈
    • 没关系,我把它放在 draw() 中就可以了。非常感谢!编辑:矩形在正确的位置,但没有检测到碰撞大声笑
    • 好的,我必须在 update() 方法中初始化矩形,现在一切正常。再次感谢
    • @DeuceDeuce 我很高兴你工作了,但你不能在构造函数中初始化它?,并在更新中更新,否则每次更新都会创建它们,我认为它会更少高效,最好相信只更新职位,
    • @DeuceDeuce 而不是在每次通话时都创建它们仅更新我的意见,对不起我的英语
    猜你喜欢
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多