我正在制作一个2D游戏(非基于平铺),并希望让我的相机跟随我的角色。以下是游戏的实施方式:
游戏是基于像素的,因此它的外观如下:
如您所见,窗口大小为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窗口内有坐标系的方法。
关于如何处理此事的任何其他想法?
答案 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;
}
}
我仍然对如何在摄像机中设置坐标系有疑问?