我更喜欢libgdx开发人员,但我在一段时间内遇到了一个问题,所以我决定在这里问一下。
我使用FillViewport,TiledMap,Scene2d和OrtographicCamera。我希望相机跟随我的播放器实例,但是定义了边界(等于mapsize)。这意味着相机永远不会离开地图,所以当玩家到达地图的一端时,相机会停止跟随并且他会到达屏幕边缘。也许听起来很复杂,但很简单,我相信你知道我的意思,它在每场比赛中使用过。
我计算了4个值:
minCameraX = camera.viewportWidth / 2;
minCameraY = camera.viewportHeight / 2;
maxCameraX = mapSize.x camera.viewportWidth / 2;
maxCameraY = mapSize.y - camera.viewportHeight / 2;
我删除了没有必要的东西,如单位转换,camera.zoom等。然后我像这样设置相机位置:
camera.position.set(Math.min(maxCameraX, Math.max(posX, minCameraX)), Math.min(maxCameraY, Math.max(posY, minCameraY)), 0);
(posX,posY是玩家位置),基本上将摄像机设置为玩家位置,但如果它设置为高或低,则将其设置为在右轴之前定义的最大值或最小值。 (我也尝试MathUtils.clamp(),它的工作原理相同。
到目前为止,一切都很完美。宽高比改变时出现问题。默认我使用1280x768,但我的手机有1280x720。由于FillViewport的工作方式,屏幕的底部和顶部边缘被切断了。因为我的地图的那部分被切断了。
我尝试修改最大值和最小值,计算比率差异并将其添加到计算中,更改相机大小,不同视口和其他一些内容但没有成功。
你能帮忙吗? 感谢答案 0 :(得分:0)
我从上面的评论中尝试了noone和Tenfour04的解决方案。两者都不完美,但我觉得我很满意:
没有人:
camera.position.x = MathUtils.clamp(camera.position.x, screenWidth/2 + leftGutter, UnitConverter.toBox2dUnits(mapSize.x) - screenWidth/2 + rightGutter);
camera.position.y = MathUtils.clamp(camera.position.y, screenHeight/2 + bottomGutter, UnitConverter.toBox2dUnits(mapSize.y) - screenHeight/2 - topGutter);
但它只适用于小范围的分辨率。对于纵横比与默认值大不相同的奇怪分辨率,我在边框后看到了白色条纹。这意味着整个边界都是打印机,边界之外的世界的某些部分。我不知道为什么
Tenfour04: 我将视口更改为ExtendViewport。没有什么是切断的,但在不同的宽高比中,我也可以看到界外的世界。
两者的解决方案是清除与边界相同颜色的屏幕和水平分离的背景,这两种情况都给出了令人满意的效果。
它有一些局限性。由于边界是世界的一部分(平铺块),当它具有相同的颜色时它是可以的。如果边框具有不同的颜色,则在边框外呈现一种颜色不会成为解决方案。
谢谢没有人和Tenfour04,我仍然愿意接受建议:)
以下是一些截图: https://www.dropbox.com/sh/00h947wkzo73zxa/AAADHehAF4WI8aJ8bu4YzB9Va?dl=0
答案 1 :(得分:0)
为什么不使用FitViewport而不是FullViewport?那样它就不会切断你的屏幕,对吧?
答案 2 :(得分:0)
现在有点迟了,但我有一个解决方案,没有妥协!
此处宽度和高度是世界大小(以像素为单位)。我在FillViewport上使用这个代码,一切都很棒!
float playerX = player.getBody().getPosition().x*PPM;
float playerY = player.getBody().getPosition().y*PPM;
float visibleW = viewport.getWorldWidth()/2 + (float)viewport.getScreenX()/(float)viewport.getScreenWidth()*viewport.getWorldWidth();//half of world visible
float visibleH = viewport.getWorldHeight()/2 + (float)viewport.getScreenY()/(float)viewport.getScreenHeight()*viewport.getWorldHeight();
float cameraPosx=0;
float cameraPosy=0;
if(playerX<visibleW){
cameraPosx = visibleW;
}
else if(playerX>width-visibleW){
cameraPosx = width-visibleW;
}
else{
cameraPosx = playerX;
}
if(playerY<visibleH){
cameraPosy = visibleH;
}
else if(playerY>height-visibleH){
cameraPosy = height-visibleH;
}
else{
cameraPosy = playerY;
}
camera.position.set(cameraPosx,cameraPosy,0);
camera.update();