摄像机在基于Slick2d像素的游戏中跟随玩家的方法

时间:2014-03-05 13:54:22

标签: java animation slick2d

我正在制作一个2D游戏(非基于平铺),并希望让我的相机跟随我的角色。以下是游戏的实施方式:

游戏是基于像素的,因此它的外观如下: enter image description here

如您所见,窗口大小为840x490,地图为1260x735。我的Camera类保存相机的X和Y位置,以及它的大小。代码:

public class Camera{

public Level level;
public GameContainer gc;

public static final int width = Game.displayWidth; // 840
public static final int height = Game.displayHeight; // 490
public static float posX = 0;
public static float posY = 0;
public static int maxX = 0;
public static int maxY = 0;

public Camera(Level level){

    this.level = level;
    this.maxX = this.level.worldMap.getWidth();
    this.maxY = this.level.worldMap.getHeight();
}


}

现在我使用箭头键(测试)移动相机,在我们绘制其他所有内容之前,相机XY位置用于g.translate()图形上下文,这就是我如何用箭头移动。这是我的渲染方法:

@Override
public void render(GameContainer container, StateBasedGame game, Graphics g)
        throws SlickException {

     int offSetX = 10;
     int offSetY = 10;

    g.translate(-camera.posX, -camera.posY);
    worldMap.draw(0 ,0);


    for(GameObject o : objects){

        o.drawObj(container, game, g);
        if(quit == true){
            Shape s = o.getBoundsBox(); 
            g.draw(s);
        }
    }

}

我想要它,所以如果玩家靠近他所做的任何一个边缘,玩家总会被镜头跟随。但我怎么能发现这个呢?理想情况下,我会在相机内部有一个坐标系,并通过检查X和Y值来检测它,但是我找不到在Camera窗口内有坐标系的方法。

关于如何处理此事的任何其他想法?

1 个答案:

答案 0 :(得分:1)

我实际上在等待回复的同时找到了解决方法哈哈。那么它是解决方案的开始,但我在第一次尝试时就跟着我的玩家。

基本上我只是制作了一个方法来移动MoveController类中的相机,这是我GameObjects的动作,每当我的玩家移动并且它基于更新时调用此方法它的移动方向。

该方法看起来与我的moveCamera方法完全相同,只是var保存了相机对象。所以在我的moveMob方法中,我有这个条件:

        if(mob instanceof Player){
            moveCameraPos(dir,(Player)mob,delta);
        }

然后这个方法看起来像这样:

public void moveCameraPos(int dir, Player p, int delta){
        switch(dir){

        default:
            break;
        case Play.UP:
            if(camera.posY>0)
                camera.posY -= (delta * .1f) * p.speed /2;
            break;
        case Play.DOWN:
            if(camera.posY < 735 - 490)
                camera.posY += (delta * .1f) * p.speed /2;
            break;
        case Play.LEFT:
            if(camera.posX > 0)
                camera.posX -= (delta * .1f) * p.speed /2;
            break;
        case Play.RIGHT:
            if(camera.posX < 1260 - 840)
                camera.posX += (delta * .1f) * p.speed /2;
            break;
        case Play.UPRIGHT:
            if(camera.posX>0 && camera.posY>0){ 
                camera.posY -= ((delta * .1f) * p.speed)/2;
                camera.posX += ((delta * .1f) * p.speed)/2;
            }
                break;
        case Play.UPLEFT:
            if(camera.posX>0 && camera.posY>0){ 
                camera.posY -= ((delta * .1f) * p.speed)/2;
                camera.posX -= ((delta * .1f) * p.speed)/2;
            }
            break;
        case Play.DOWNRIGHT:
            if(camera.posX < 1260 -840 && camera.posY<735-490){ 
                camera.posY += ((delta * .1f) * p.speed)/2;
                camera.posX += ((delta * .1f) * p.speed)/2;
            }
            break;  
        case Play.DOWNLEFT:
            if(camera.posX > 0 && camera.posY<735-490){ 
                camera.posY += ((delta * .1f) * p.speed)/2;
                camera.posX -= ((delta * .1f) * p.speed)/2;
            }
            break;
    }
}

我仍然对如何在摄像机中设置坐标系有疑问?