Pygame高级滚动地图
我正在开发一个类“恶搞”的游戏,已经成功实现了一个跟随玩家的摄像头,这个摄像头只显示玩家周围的环境,并且固定在窗口的一侧。
问题是,当玩家靠近地图的边缘时,屏幕上会出现一片黑色的空白区域。就像这样:
我该如何让摄像头“卡住”在边缘,不再往外移动呢?
为了绘制地图:
- 我获取了摄像头的矩形位置 [左上角和右下角];
- 把它转换成世界坐标;
- 对这个区域进行遍历,也使用了一个枚举器;
- 进行了光照/可见区域的计算,使用了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