Java游戏,背景的矩形正在移动

时间:2012-12-29 17:21:30

标签: java awt java-2d coordinate-systems rectangles

我希望这个标题不会使这个帖子比现在更加混乱。如果我告诉你到目前为止我做了什么,我可能会更好地解释我遇到的问题:

游戏

我制作了一个非常简单的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个键盘输入也是如此。

问题

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

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

这是我地图上障碍物的坐标,当我画出它出现在我屏幕左上角的矩形时,当我移动我的播放器时它停留在那里(它继续移动留在左上角的cornor),现在这对我来说是一个大问题,因为如果我的矩形在移动,我的碰撞应该如何起作用。我认为发生这种情况的原因是因为我的地图非常大,这意味着我只是把我的玩家放在我的屏幕中心而不是显示完整的东西,当他移动屏幕时,他也随身携带显示剩余的地图。

守则

这是我的游戏类中的代码,它有渲染,初始化和更新等方法,但我认为修复此问题所需的唯一代码是渲染方法和变量,所以这里它们是(如果完整的话)代码是必须的,请告诉我)

变量

 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();
    }}}

我很抱歉这个帖子太长了,如果你能请花时间帮助我并回答我的问题我会非常感激。

谢谢。

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:1)

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

以下是一些建议。

  • 使用单独的屏幕外Image作为游戏地图。图像大小为 与游戏地图大小相同。
  • 矩形(障碍物)&amp;通过使用getGraphics
  • 获取此图像的图形上下文,应在此图像上绘制除字符之外的其他内容
  • 最后,当角色移动时,您使用drawImage(Image img, int dstx1, int dsty1, int dstx2, int dsty2, int srcx1, int srcy1, int srcx2, int srcy2, ImageObserver observer)方法在屏幕上绘制部分图像。这种方法的解释是可用的here。您必须根据角色的位置计算要绘制的图像部分

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