我编写了一个简单的Java游戏,其中屏幕上有两个矩形,其中一个矩形应移动而另一个应保持静止,移动的矩形随键盘箭头输入移动,可以向上,向下,向左或向上移动对。我遇到的问题是,当只有其中一个矩形(rectOne)和rectTwo应该保持静止时,两个矩形都在移动,我的变量设置如下所示:
float buckyPositionX = 0;
float buckyPositionY = 0;
float shiftX = buckyPositionX + 320;//keeps user in the middle of the screem
float shiftY = buckyPositionY + 160;//the numbers are half of the screen size
//my two rectangles are shown bellow
java.awt.geom.Rectangle2D.Float rectOne = new Rectangle2D.Float(shiftX, shiftY,90,90);
java.awt.geom.Rectangle2D.Float rectTwo = new Rectangle2D.Float(500 + buckyPositionX, 330 + buckyPositionY, 210, 150);
坐标变量buckyPositionX和buckyPositionY为0,0因此它们显示我屏幕的左下角,坐标变量shiftX和shiftY显示屏幕中心的坐标,以便移动的矩形始终居中。
其中包含所有游戏代码的Play类由几种方法组成,重要的是更新和渲染,更新处理矩形移动速度和键盘输入,向您展示一个示例在更新类中,这是按下它们的键时的代码示例:
if(input.isKeyDown(Input.KEY_UP)){buckyPositionY += 2;}
这适用于所有键盘箭头输入。接下来是渲染方法,它处理绘制屏幕上的所有内容和图形,此方法包括在屏幕上绘制以前使用变量编码的矩形。
所以,当我尝试使用键盘输入移动矩形时,我在屏幕上绘制了两个矩形,同时矩形一起移动,我认为我如何设置矩形坐标有一个问题尝试与他们一起玩,例如从他们那里删除+ buckyPositionX和+ buckyPositionY但是同样的问题发生了,如果你有什么想法可以解决这个问题,请告诉我。
提前谢谢。
Edit1:
以下是我的Play课程的完整代码:
imports are here
public class Play extends BasicGameState{
Animation bucky, movingUp, movingDown, movingLeft, movingRight;
Image worldMap;
int[] duration = {200, 200};//how long frame stays up for
float buckyPositionX = 0;
float buckyPositionY = 0;
float shiftX = buckyPositionX + 320;//keeps user in the middle of the screem
float shiftY = buckyPositionY + 160;//the numbers are half of the screen size
java.awt.geom.Rectangle2D.Float rectOne = new Rectangle2D.Float(shiftX, shiftY,90,90);
java.awt.geom.Rectangle2D.Float rectTwo = new Rectangle2D.Float(500 + buckyPositionX, 330 + buckyPositionY, 210, 150);
public Play(int state){
}
public void init(GameContainer gc, StateBasedGame sbg) throws SlickException{
worldMap = new Image("res/world.png");
Image[] walkUp = {new Image("res/b.png"), new Image("res/b.png")}; //these are the images to be used in the "walkUp" animation
Image[] walkDown = {new Image("res/f.png"), new Image("res/f.png")};
Image[] walkLeft = {new Image("res/l.png"), new Image("res/l.png")};
Image[] walkRight = {new Image("res/r.png"), new Image("res/r.png")};
movingUp = new Animation(walkUp, duration, false);
movingDown = new Animation(walkDown, duration, false);
movingLeft = new Animation(walkLeft, duration, false);
movingRight = new Animation(walkRight, duration, false);
bucky = movingDown;//facing screen initially on startup
}
public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException{
worldMap.draw(buckyPositionX, buckyPositionY);//position 0,0
bucky.draw(shiftX, shiftY);//makes him appear at center of map
g.fillRect((float)rectOne.getX(), (float)rectOne.getY(), (float)rectOne.getWidth(), (float)rectOne.getHeight());
g.fillRect((float)rectTwo.getX(), (float)rectTwo.getY(), (float)rectTwo.getWidth(), (float)rectTwo.getHeight());
}
public void update(GameContainer gc, StateBasedGame sbg, int delta)throws SlickException{
Input input = gc.getInput();
//up
if(input.isKeyDown(Input.KEY_UP)){
bucky = movingUp;//changes the image to his back
buckyPositionY += 2;;//increase the Y coordinates of bucky (move him up)
if(buckyPositionY>162){//if I reach the top
buckyPositionY -= 2;//stops any further movement in that direction
}
}
//down
if(input.isKeyDown(Input.KEY_DOWN)){
bucky = movingDown;
buckyPositionY -= 2;
if(buckyPositionY<-550){
buckyPositionY += 2;//basically change the direction if + make -
}}
//left
if(input.isKeyDown(Input.KEY_LEFT)){
bucky = movingLeft;
buckyPositionX += 2;
if(buckyPositionX>324){
buckyPositionX -= 2;//delta * .1f
}}
//right
if(input.isKeyDown(Input.KEY_RIGHT)){
bucky = movingRight;
buckyPositionX -= 2;
if(buckyPositionX<-776){
buckyPositionX += 2;
}}}
public int getID(){
return 1;
}}
回答问题:
我在rectTwo变量中使用变量buckyPositionX和buckyPositionY的原因是因为当我尝试使用g.fillRect函数绘制它时,一切正常,这些输入,rectOne移动和RectTwo保持静止,但当我调用完全相同变量中的矩形通过说g.fillRect(rectOne.X,rectOne.Y ...)我得到这个问题,其中两个矩形一起移动这很奇怪,因为坐标和大小与绘制它们时完全相同使用g.fillRect(500 + buckyPositionX,330 + buckyPositionY,210,150)和rectOne相同。我会尝试使用一些代码使其更清晰:
如果我在变量中使用它:
java.awt.geom.Rectangle2D.Float rectOne = new Rectangle2D.Float(shiftX, shiftY,90,90);
java.awt.geom.Rectangle2D.Float rectTwo = new Rectangle2D.Float(500 + buckyPositionX, 330 + buckyPositionY, 210, 150);
这在我的渲染方法中:
g.fillRect((float)rectOne.getX(), (float)rectOne.getY(), (float)rectOne.getWidth(), (float)rectOne.getHeight());
g.fillRect((float)rectTwo.getX(), (float)rectTwo.getY(), (float)rectTwo.getWidth(), (float)rectTwo.getHeight());
两个矩形,rectOne和rectTwo一起移动。
但如果我在我的渲染方法中使用它而没有设置任何变量:
g.fillRect(shiftX, shiftY,90,90)
g.fillRect(500 + buckyPositionX, 330 + buckyPositionY, 210, 150)
虽然我的碰撞不适用于这种方法(这就是为什么我要修理它),但是一切都很有效。矩形都会出现在屏幕上,而rectOne会移动而rectTwo会保持静止。
我会发一个新帖子更详细地解释我的问题,因为这个问题开始变得过于拥挤和偏离主题。
答案 0 :(得分:1)
这是一个循环吗?
float buckyPositionX = 0;
float buckyPositionY = 0;
float **shiftX** = buckyPositionX + 320;//keeps user in the middle of the screem
float **shiftY** = buckyPositionY + 160;//the numbers are half of the screen size
//my two rectangles are shown bellow
java.awt.geom.Rectangle2D.Float rectOne = new Rectangle2D.Float(shiftX, shiftY,90,90);
*java.awt.geom.Rectangle2D.Float rectTwo = new Rectangle2D.Float(500 + buckyPositionX, 330 + buckyPositionY, 210, 150);*
if(input.isKeyDown(Input.KEY_UP)){**buckyPositionY** += 2;}
如果rectTwo要保持静止,为什么还要使用buckyPositiony? - 您正在使用keyup
更新它答案 1 :(得分:1)
我猜这个问题与this有关?
无论如何,但是矩形依赖于 buckyPositionY ,所以通过更新该变量实际上是更新两个矩形。
尝试这样的事情。您最好将坐标更新为 rectOne ,但我可以看到没有 setX 方法 Rectangle2D
if (input.isKeyDown(Input.KEY_UP)){
rectOne = new Rectangle2D.Float((float)rectOne.getX(), (float)rectOne.getY()+2, (float)90, (float)90);
}