java - 如何在 Slick2D 中的随机位置接触后重生矩形?

标签 java collision-detection lwjgl slick2d

就像广受好评的“与你的爸爸一起洗澡模拟器 2015”一样,我正在尝试编写一个程序,其中玩家会跑进一个矩形,然后该矩形会在 map 上的随机位置重生。我尝试通过调用 render() 方法来做到这一点,但意识到 (1) 这会将最后一个矩形留在地面上,并且 (2) 在 render() 构造函数中,由于某种原因,“g”不被视为有效参数。这是我的 Play 类代码。

    public class Play extends BasicGameState 
{
    private Image player;
    private Shape castle;
    private Random randX, randY;
    private final int MAX_X = 730;
    private final int MAX_Y = 570;
    private int playerX = 400;
    private int playerY = 590;
    private int castleX, castleY;

    public Play(int state)
    {

    }

    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException 
    {
        player = new Image("res/play.png");
        randX = new Random();
        randY = new Random();
        castleX = randX.nextInt(MAX_X);
        castleY = randY.nextInt(MAX_Y);
        castle = new Rectangle(castleX,castleY,70,70);
    }

    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException 
    {
        g.drawImage(player, playerX, playerY);
        g.setColor(new Color(0,255,0));
        g.fill(castle);
        g.draw(castle);
    }

    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException 
    {
        Input input = gc.getInput();
        if(input.isKeyDown(Input.KEY_UP)){playerY -= 1;}
        if(input.isKeyDown(Input.KEY_DOWN)){playerY += 1;}
        if(input.isKeyDown(Input.KEY_LEFT)){playerX -= 1;}
        if(input.isKeyDown(Input.KEY_RIGHT)){playerX += 1;}

        if(playerX == castle.getX())
        {
            /*try
            {
            this.render(gc, sbg, g);
            }
            catch(Exception e){e.printStackTrace();}*/
        }
    }

    public int getID() 
    {
        return 2;
    }
}

最佳答案

让我们从一些建议开始。你的 init 方法很清楚。您目前的渲染也是如此。在您的更新方法中,您永远不应该调用渲染,因为它会在每个周期被调用。仅供引用,请记住,在 Slick 中,游戏由两个步骤组成:调用 init 方法的 init,每隔几毫秒调用一次 render() 和 update() 的循环。您在第 N 周期中更新的内容将应用于第 N+1 周期(玩家看不到差异)。

为了测试你的城堡和你的玩家之间的交集,有一个公式可以做到这一点。类似的东西

 If( (Cx>Px && Cx<Px+Pw) && (Cy>Py && Cy<Py+Ph) || // Top left corner

 (Cx+Cw>Px && Cx+Cw<Px+Pw) && (Cy>Py && Cy<Py+Ph) || //top right corner

 (Cx>Px && Cx<Px+Pw) && (Cy+Ch>Py && Cy+Ch<Py+Ph) || // bottom left corner

 (Cx+Cw>Px && Cx+Cw<Px+Pw) && (Cy+Ch>Py && Cy+Ch<Py+Ph) ) //bottom right corner

其中:Cx = caSTLeX,Cy = caSTLeY,Cw = caSTLeWidth; P 代表玩家等...

但是这样做很烦人。如果你愿意的话,你仍然可以这样做。但我更喜欢使用 Slick 的功能:intersect !

现在,让我们看看如何让这座城堡移动。

public class Play extends BasicGameState 
{
    private Image playerImage;
    private Rectangle playerRectangle;
    private Shape castle;
    private Random randX, randY;
    private final int MAX_X = 730;
    private final int MAX_Y = 570;
    private int playerX = 400;
    private int playerY = 590;
    private int castleX, castleY, castleWidth, castleHeight;

    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException 
    {
        playerImage = new Image("res/play.png");
        playerRetangle = new Rectangle(playerX, playerY, playerImage.getWidth(), playerImage.getHeight());
        randX = new Random();
        randY = new Random();
        castleX = randX.nextInt(MAX_X);
        castleY = randY.nextInt(MAX_Y);
        castleWidth = 70;
        castleHeight = 70;
        castle = new Rectangle(castleX, castleY, castleWidth, castleHeight);
    }

    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException 
    {
        g.drawImage(playerImage, playerRectangle.getX(), playerRectangle.getY());
        g.setColor(new Color(0,255,0));
        g.fill(castle);
        g.draw(castle);
    }

    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException 
    {
        Input input = gc.getInput();


        if(input.isKeyDown(Input.KEY_UP)){playerRectangle.setY(playerRectangle.getY() - 1;}
        if(input.isKeyDown(Input.KEY_DOWN)){playerRectangle.setY(playerRectangle.getY() + 1;}
        if(input.isKeyDown(Input.KEY_LEFT)){playerRectangle.setX(playerRectangle.getX() - 1;}
        if(input.isKeyDown(Input.KEY_RIGHT)){playerRectangle.setX(playerRectangle.getX() + 1;}


        // use formula or intersect
        if(castle.intersects(playerRectangle)) {
            castleX = randX.nextInt(MAX_X);
            castleY = randY.nextInt(MAX_Y);
        }
    }
}

PS:为了改进您的代码,您应该在 mousePressed 重写方法中测试您的输入。请参阅:mousePressed in BasicGameState

关于java - 如何在 Slick2D 中的随机位置接触后重生矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34467940/

相关文章:

javascript - 发生碰撞时如何修复玩家健康的随机减法?

java - 插入和弹出矩阵

java - 导入新包的类名冲突(java)

javascript - Kinetic JS(用鼠标指针拖动一个球)

algorithm - 确定 SAT 分离轴定理中的边缘法线

java - 为什么我在 OpenGL (3) 中的三角形不使用 lwjgl 渲染?

java - 登录端点?

java - 如何正确输出正确的 double 值?

java - 如何处理在Mule中扩展AbstractMessageTransformer的Java类中的FileNotFoundException?

java - 按值对哈希表排序