项目源码地址:https://github.com/zxf20180725/pygame-jxzj,求赞求星星~
工作太忙啦,没啥时间更新博客,大家有什么疑问,欢迎加q群讨论,刚创的:812095339
游戏地图一般都是比窗口大的,所以需要地图滚动:
我们的已知条件:
1.地图图片的宽和高,用surface的get_width()和get_height()方法即可获得
2.游戏窗口的宽和高,我们创建的时候指定了宽高是640*480
3.角色相对于地图左上角的坐标role_x,role_y
我们要求的是:
地图的绘图坐标x,y
地图滚动其实就是分三种情况:1.角色在地图的最左边 2.角色在地图的中间 3.角色在地图的最右边
在1、3种情况时,地图是不会动的。
下面看看第一种情况,角色在地图的最左边:
橙色的线是窗口的平分线。
当role_x<窗口宽/2时,就属于这种情况。这时地图的x就为0
第二种情况,角色在地图的最右边:
当 role_x>地图宽-窗口宽/2 时,就属于这种情况。这时,地图的x就为-(地图宽-窗口宽)
第三种情况,角色在地图中间:
当role_x不属于上面两种情况时,就是第三种情况。
这时,地图x为-(role_x-窗口宽/2)
上面只讨论的role_x,那么role_y也是同理,就不再多说了。
给GameMap类添加一个roll方法:
def roll(self, role_x, role_y, WIN_WIDTH=640, WIN_HEIGHT=480):
"""
地图滚动
:param role_x: 角色相对于地图的坐标
:param role_y:
"""
# print(role_x, role_y)
if role_x < WIN_WIDTH / 2:
self.x = 0
elif role_x > self.bottom.get_width() - WIN_WIDTH / 2:
self.x = -(self.bottom.get_width() - WIN_WIDTH)
else:
self.x = -(role_x - WIN_WIDTH / 2)
if role_y < WIN_HEIGHT / 2:
self.y = 0
elif role_y > self.bottom.get_height() - WIN_HEIGHT / 2:
self.y = -(self.bottom.get_height() - WIN_HEIGHT)
else:
self.y = -(role_y - WIN_HEIGHT / 2)
然后在逻辑更新中调用它就好了:
self.game_map.roll(self.role.x, self.role.y)
def update(self):
while True:
self.clock.tick(self.fps)
# 逻辑更新
self.role.logic()
self.event_handler()
self.game_map.roll(self.role.x, self.role.y)
# 画面更新
self.game_map.draw_bottom(self.screen_surf)
self.role.draw(self.screen_surf, self.game_map.x, self.game_map.y)
self.game_map.draw_top(self.screen_surf)
# self.game_map.draw_grid(self.screen_surf)
pygame.display.update()
ok啦~
本章完