【问题标题】:How do I respawn the rectangle after contact in a random location in Slick2D?如何在 Slick2D 中的随机位置接触后重新生成矩形?
【发布时间】:2015-12-26 02:06:55
【问题描述】:

就像广受好评的“与你的爸爸模拟器 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;
    }
}

【问题讨论】:

    标签: java collision-detection lwjgl slick2d


    【解决方案1】:

    让我们从一些建议开始。你的 init 方法很清楚。你现在的渲染也是如此。在你的更新方法中,你永远不应该调用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多