Java 2D游戏,游戏地图和矩形运动

时间:2013-01-04 17:51:30

标签: java collision-detection rectangles

游戏

我编写了一个简单的Java游戏,其中2D地图上有一个玩家的俯视图,随着键盘箭头输入(向上,向下,向左,向右)移动,我的Play类包含我的所有游戏代码由几个方法组成,init保存初始游戏选项,例如玩家在游戏开始时应该面对的方式,渲染将所有内容绘制到屏幕上,如实际玩家和地图,更新处理键盘输入和移动播放器,当我说移动播放器时,在这个游戏中它真的是移动地图,因为地图太大我需要玩家能够在地图上走动并且屏幕跟随它并且最简单这样做的方法是让玩家保持静止并移动地图,从而产生玩家实际移动的错觉。

问题

除了地图外,一切都很好,地图是一个大型的2D图像,它上面有房子等障碍物,此时玩家只是穿过房屋和其他障碍物(现在让我们专注于房子) ),我需要游戏来阻止玩家走过房子。所以我计划使用简单的矩形碰撞检测,如果发生碰撞,只需改变播放器的方向,所以我尝试制作两个矩形,但是当我使用渲染方法在屏幕上绘制矩形时出现问题(上面一个)玩家(rectOne),另一个在房子之上(rectTwo))它并没有完全按照计划进行游戏,当我尝试移动一个矩形而另一个跟随它时,这是一个问题,因为应该怎么做两个矩形的碰撞同时移动。

守则

显示的代码是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;
    }}

代码显示两个矩形(rectOne和rectTwo)rectOne位于播放器顶部,rectTwo应该位于地图上的房子顶部,这不会发生,两个重复一起移动,记住,我提到了地图正在移动并且玩家保持静止,地图设置为坐标buckyPositionX和buckyPositionY,并且玩家设置为shiftX和shiftY,这是屏幕的中心,如果需要,可以用常量替换,因为玩家不移动,更新方法下的所有if语句都修改了buckyPositionX和buckyPositonY,这意味着他们移动了地图,因此rectTwo(也就是房子)也必须移动而rectOne(播放器矩形)保​​持静止,这就是我使用变量的原因rectTwo的buckyPositionX和buckyPoitionY,但是我的问题仍然存在,所以一定有问题。

////////////编辑 - 删除段落以缩短帖子//////////////

提前谢谢。

0 个答案:

没有答案