2

我希望标题没有让这篇文章比现在更混乱。如果我确切地告诉你我到目前为止所做的事情,我遇到的问题可能会得到更好的解释:

游戏

我做了一个非常简单的 2D 游戏,基本原理是,玩家使用键盘输入(上、下、左、右箭头)在 2D 地图上移动,这个游戏有点像口袋妖怪视图,视图是从顶部看的,只需对每个键盘输入使用以下代码即可设置他的速度:

 if(input.isKeyDown(Input.KEY_DOWN)){
    bucky = movingDown;
    buckyPositionY -= 2;
    if(buckyPositionY<-550){//this is used to stop player from leaving the map
        buckyPositionY += 2;}}

其他 3 个键盘输入也是如此。

问题

我已经制作了玩家可以四处移动的游戏,但问题是我在地图上有物体,而我的玩家只是穿过它们,所以我需要设置碰撞,我知道如何使用矩形设置碰撞方法,但问题实际上是制作矩形。我知道这是一项简单的任务,但是在这个游戏中,每当我将 Rectangle 向下放置时,它就会在我移动我的播放器时移动,我通过使用以下代码绘制矩形来测试这一点:

g.fillRect(0,0,100,100);

那是我地图上障碍物的坐标,当我绘制矩形时,它出现在屏幕的左上角,当我移动播放器时,它会停留在那里(它会一直移动以停留在左上角),现在是对我来说是个大问题,因为如果我的矩形在移动,我的碰撞应该如何工作。我认为发生这种情况的原因是因为我的地图非常大,这意味着我没有显示完整的东西,而是将我的玩家放在屏幕的中心,当他移动屏幕时,屏幕也会随着他移动以显示其余部分地图。

编码

这是我的游戏类中的代码,其中包含渲染、初始化和更新等方法,但我认为解决此问题所需的唯一代码是渲染方法和变量,所以它们在这里(如果需要完整代码请告诉我)

变量

 Animation bucky, movingUp, movingDown, movingLeft, movingRight
Image worldMap;
boolean quit = false;
int[] duration = {200, 200};
int buckyPositionX = 0;
int buckyPositionY = 0;
int shiftX = buckyPositionX + 320;
int shiftY = buckyPositionY + 160;

渲染方法

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

if(quit==true){
    g.drawString("Resume(R)", 250, 100);
    g.drawString("Main(M)", 250, 150);
    g.drawString("Quit Game(Q)", 250, 200);      
    if(quit==false){
        g.clear();
    }}}

很抱歉这个帖子太长了,如果您能花时间帮助我并回答我的问题,我将不胜感激。

谢谢你。

4

2 回答 2

2

Java 的二维绘图方法相对于屏幕绘制,而不是相对于地图。

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html#fillRect

如果要相对于地图位置进行绘制,则需要根据玩家在地图上的位置偏移矩形的位置。由于您的角色动画始终位于屏幕的中心,因此您需要根据 Bucky 在地图上的位置偏移任何其他动画。所以你的矩形图需要看起来像:

g.fillRect(0 + buckyPositionX, 0 + buckyPositionY, 100, 100);

更好的解决方案是在地图上跟踪相机位置,然后绘制与相机相关的所有内容,包括您的角色。这使您可以自由地在游戏过场动画等中进行操作。

于 2012-12-29T18:08:13.777 回答
1

正如我所说,矩形(障碍物)正在移动,因为绘图坐标是相对于屏幕定义的,而不是游戏地图。那就是当角色移动并且您重新绘制游戏地图时,矩形仍然绘制在 (0,0) 处,即屏幕的左上角。

这里有一些建议。

  • Image为游戏地图使用单独的屏幕外。图像大小将与游戏地图的大小相同。
  • 通过使用获取此图像的图形上下文,应在此图像上绘制矩形(障碍物)和不包括字符的其他内容getGraphics
  • drawImage(Image img, int dstx1, int dsty1, int dstx2, int dsty2, int srcx1, int srcy1, int srcx2, int srcy2, ImageObserver observer)最后,当角色移动时,您使用方法在屏幕上绘制图像的一部分。此方法的说明可在此处获得。您必须从角色的位置计算要绘制图像的哪个部分

要记住的一点是角色只能在屏幕上绘制,而不是在游戏地图上Image。绘制游戏地图图像后,应在屏幕上绘制角色。

于 2012-12-29T17:50:35.313 回答