pygame网络游戏_4_4:人物行走_地图滚动

项目源码地址:https://github.com/zxf20180725/pygame-jxzj,求赞求星星~

工作太忙啦,没啥时间更新博客,大家有什么疑问,欢迎加q群讨论,刚创的:812095339

1.效果

游戏地图一般都是比窗口大的,所以需要地图滚动:

 

2.算法

我们的已知条件:

1.地图图片的宽和高,用surface的get_width()和get_height()方法即可获得

2.游戏窗口的宽和高,我们创建的时候指定了宽高是640*480

3.角色相对于地图左上角的坐标role_x,role_y

 

我们要求的是:

地图的绘图坐标x,y

 

地图滚动其实就是分三种情况:1.角色在地图的最左边 2.角色在地图的中间 3.角色在地图的最右边

在1、3种情况时,地图是不会动的。

 

下面看看第一种情况,角色在地图的最左边:

 

pygame网络游戏_4_4:人物行走_地图滚动_第1张图片

橙色的线是窗口的平分线。

当role_x<窗口宽/2时,就属于这种情况。这时地图的x就为0

 

第二种情况,角色在地图的最右边:

pygame网络游戏_4_4:人物行走_地图滚动_第2张图片

当 role_x>地图宽-窗口宽/2 时,就属于这种情况。这时,地图的x就为-(地图宽-窗口宽)

 

第三种情况,角色在地图中间:

pygame网络游戏_4_4:人物行走_地图滚动_第3张图片

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

本章完

你可能感兴趣的:(python游戏开发实战)