Pygame高级滚动地图

2 投票
1 回答
675 浏览
提问于 2025-04-18 10:36

我正在开发一个类“恶搞”的游戏,已经成功实现了一个跟随玩家的摄像头,这个摄像头只显示玩家周围的环境,并且固定在窗口的一侧。

问题是,当玩家靠近地图的边缘时,屏幕上会出现一片黑色的空白区域。就像这样:

游戏摄像头

我该如何让摄像头“卡住”在边缘,不再往外移动呢?

为了绘制地图:

  • 我获取了摄像头的矩形位置 [左上角和右下角];
  • 把它转换成世界坐标;
  • 对这个区域进行遍历,也使用了一个枚举器;
  • 进行了光照/可见区域的计算,使用了X和Y;
  • 然后用枚举器的 'i' 和 'j' 在屏幕上绘制。

这是我的代码:

topleft = Map.toWorld(camera.rect.topleft)
bottomright = Map.toWorld(camera.rect.bottomright)
for i, x in enumerate(xrange(topleft[0], bottomright[0])):
    for j, y in enumerate(xrange(topleft[1], bottomright[1])):
        tile = mymap.tileAt(x, y)
        object = [obj for obj in Object.OBJECTS if obj.pos == (x,y)]
        if tile:
            lit = field_of_view.lit(x, y)
            visited = field_of_view.visited(x, y)
            graphic = tile.graphic
            if lit:
                color = tile.color
            elif visited:
                color = GRAY
            else:
                color = BLACK
            renderedgraphic = myfont.render(ch, 1, graphic)
            screen.blit(renderedgraphic, Map.toScreen((i + 1, j)))
        if object:
            Draw.drawObject(object[0], Map.toScreen((i + 1, j)))

我整整一天都在为这个问题苦恼,这就是我目前的进展。

我在这里看到一个例子,但我无法将代码适配到我的游戏,因为它使用了精灵。

1 个回答

1

我想你的相机对象和玩家没有任何关联。

在角落停下相机是没问题的。你可以用一个大矩形来表示整个地图,然后调用 cameraRect.clamp_ip(mapRect) 来限制相机的范围。

真正的问题是如何让相机把玩家放在中心位置。用上面那个简单的检查,玩家可能会一直待在相机的角落里。

如果你让相机尽量跟随玩家,那就可以解决这个问题。下面是一些伪代码:

Check if player is not in the center of camera
    Check direction of player movement - if moving towards the center of camera
        do nothing
Else
    Check direction of player movement
    Try to move camera

撰写回答