pygame網絡遊戲_4_4:人物行走_地圖滾動

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啦~

本章完

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章