1.效果
遊戲地圖一般都是比窗口大的,所以需要地圖滾動:
2.算法
我們的已知條件:
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也是同理,就不再多說了。
3.代碼實現
給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啦~
本章完