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

时间:2015-12-26 02:06:56

标签: java collision-detection lwjgl slick2d

就像广受好评的“与你的爸爸模拟器2015淋浴”一样,我正在尝试编写一个程序,其中玩家遇到一个矩形,然后在地图上随机的位置重新生成矩形。我尝试通过调用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;
    }
}

1 个答案:

答案 0 :(得分:0)

让我们从一些建议开始。你的init方法很清楚。那么你的渲染也是如此。在您的更新方法中,您不应该调用render,因为每个周期都会调用render。仅供参考,请记住,在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