就像广受好评的“与你的爸爸一起洗澡模拟器 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/