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