以下是我记录的问题视频的链接:https://sendvid.com/rjpi6vnw 你会注意到,最初,我从tile(0,0)开始,然后在多次上下移动我的角色后,屏幕最多只能达到(1,0)。所以我丢失了一整行可玩地图。当我的屏幕调整自己时,我只会丢失部分地图。你马上理解我的意思。我有一个名为Player的类,其中有一些名为moveRight(),moveLeft(),moveUp()和moveDown()的方法。我排除了所有无用的课程和方法,以免浪费你的时间。这是我的moveDown()和moveUp()方法:
public void moveUp(){
locY1 -= defaultMoveAmount;
if(viewShouldMoveVertically(locX1, locY1) == true){ //locX1 and locY1 refers to the player's bounds location as set by setBounds()
Display.uni.moveMapDown(defaultMoveAmount); //Display.uni just means in the Display class
}
}
public void moveDown(){
locY1 += defaultMoveAmount;
if(viewShouldMoveVertically(locX1, locY1) == true){
Display.uni.moveMapUp(defaultMoveAmount); //defaultMoveAmount is the # of pixels the player moves each time the program updates
}
}
所以我有KeyListeners来决定何时调用这些方法。 viewShouldMoveVertically()方法如下:
public boolean viewShouldMoveVertically(int X1, int Y1){
if(Y1 < screenCenterY){ //screenCenterY is the number of vertical pixels on my screen/2
return false;
}
return true;
}
然后在Display类中调用moveMapUp()或moveMapDown()方法:
int backgroundX1 = 0;
int backgroundY1 = 0;
public void moveMapUp(int moveAmt){
backgroundY1 -= moveAmt;
background.setBounds(backgroundX1, backgroundY1, backgroundX2 , backgroundY2);
}
public void moveMapDown(int moveAmt){
backgroundY1 += moveAmt;
background.setBounds(backgroundX1, backgroundY1, backgroundX2 , backgroundY2);
}
因此,如果您无法在我发布的链接中观看视频,我将描述该问题。当我的角色靠近地图边缘移动时,我显然不希望相机显示地图之外的区域。所以相机停了下来,但我的角色可能会继续走到地图的边界。如果我的角色位于地图顶部的540像素范围内,则相机不会移动(我在1920x1080显示屏上运行)。这是有意的。当我从地图顶部移动超过540像素的角色时,相机现在会随着玩家一起移动,因为他在屏幕的中心。但问题在于,如果相机最终离开地图的顶部,那么我现在失去了#34; defaultMoveAmount&#34;当我再次回到顶部时,可视区域的像素。我似乎无法弄清楚如何解决这个问题。现在,您可能最终想知道:我在垂直移动时有相同的问题。它以相同的方式设置,因此没有必要让你们阅读额外的代码。在链接上查看视频时,我必须单击左下角的播放按钮,否则它会尝试向Chrome添加扩展程序或其他内容。我的程序问题的解决方案可能最终变得非常简单,但我似乎无法弄明白。我最终厌倦了它,并决定得到一点帮助比现在放弃更好。我是编程的初学者,因为我只有1年的AP Compute Science课程编程经验。我确定你可能会看到一些看似愚蠢的东西,我欢迎你提出任何建议或意见,但请注意我对这些东西还是比较新的。主要是动议。最后,由于诸如所需的图形之类的东西,我没有发布可编译的代码段。虽然我在这里,如果你有任何建议或好的参考,以确定一个角色是否在一个大的瓷砖状地图的区域内,如可以打开的门,我们将不胜感激。 / p>
答案 0 :(得分:0)
我已经解决了这个问题。这是我更新的viewShouldMoveVertically()方法:
public boolean viewShouldMoveVertically(int X1, int Y1){
if( Y1 <= screenCenterY && previousY1 > screenCenterY ){ //if just touched highest camera point from below
return true;
}else if( Y1 >= mapPixelTotalY-screenCenterY && previousY1 < mapPixelTotalY-screenCenterY ){ //if just touched lowest camera point from above
return true;
} else if( Y1 <= screenCenterY){ //if just touched highest camera point from above or is just above
return false;
} else if( Y1 >= mapPixelTotalY-screenCenterY ){ //If touched lowest camera point from below or is just below
return false;
}
return true;
}
事实证明,当玩家触摸“从下面的最高摄像机点”或“从上面拍摄的最高摄像机点”时,需要不同的结果。如果从下方触摸最高摄像头视图,则摄像头仍需再向上移动一次。但是当从上面触摸同一点时,相机不应该移动,因为播放器来自相机不会垂直移动的区域。您可以在代码中看到我的解决方案。另外,我添加了一个“previousY1”来记录最后一个Y1的值,以便我可以判断该玩家来自上方还是下方。