转载:python中的pygame编写飞机大战(二)滚动背景

作者:还在琢磨 
来源:CSDN 
原文:https://blog.csdn.net/mbl114/article/details/78074760 
版权声明:本文为博主原创文章,转载请附上博文链接!

我们要实现飞机在场景中飞行的效果,我们可以选择背景地图滚动,相对来衬托飞机在移动。如何实现背景的滚动效果,我们可选取两张图片,两张图片交替向下移动,当某张图片完全移动到屏幕外侧,那么马上再次设置为开始位置,重新开始移动。图示入下:

这里有两张一模一样的图片,这两张图片比较特殊,也就是图片的下边界和图片的上边界可以完美的无缝的对接在一起,好似一张图片一样。我们将这两张图片一张放在场景上外侧,另一张则占满整个屏幕,效果如下:

这样两张图片同时向下移动,当下面一张图片移动出下边界的屏幕,那么就重新将其设置到开始位置,这样就实现了地图的无限滚动。

理解基本实现思路,我们看看代码实现,地图类实现如下:
--------------------- 

这样两张图片同时向下移动,当下面一张图片移动出下边界的屏幕,那么就重新将其设置到开始位置,这样就实现了地图的无限滚动。

理解基本实现思路,我们看看代码实现,地图类实现如下:

# 地图
class GameBackground(object):
    # 初始化地图
    def __init__(self, scene):
        # 加载相同张图片资源,做交替实现地图滚动
        self.image1 = pygame.image.load("res/img_bg_level_3.jpg")
        self.image2 = pygame.image.load("res/img_bg_level_3.jpg")
        # 保存场景对象
        self.main_scene = scene
        # 辅助移动地图
        self.y1 = 0
        self.y2 = -self.main_scene.size[1]
 
    # 计算地图图片绘制坐标
    def action(self):
        self.y1 = self.y1 + 1
        self.y2 = self.y2 + 1
        if self.y1 >= self.main_scene.size[1]:
            self.y1 = 0
        if self.y2 >= 0:
            self.y2 = -self.main_scene.size[1]
 
    # 绘制地图的两张图片
    def draw(self):
        self.main_scene.scene.blit(self.image1, (0, self.y1))
        self.main_scene.scene.blit(self.image2, (0, self.y2))

地图制作好之后,将地图对象加入到游戏场景中:

# 主场景中增加如下代码,一个用来绘制,一个用来计算坐标,分工明确
class MainScene(object):
    # 初始化主场景
    def __init__(self):
        # 创建地图对象
        self.map = GameBackground(self)
 
 
    # 绘制
    def draw_elements(self):
        self.map.draw()
 
    # 动作
    def action_elements(self):
        self.map.action()

我们在GameScene类中创建了map对象,并分别在绘制函数中调用了map的绘制函数,在action函数中,调用了map计算坐标的函数。

注:

这个class GameBackground(object)类用的地图是和窗口大小一致的,如果不一致,就会错了。我自己改了下代码。适用于何种大小的地图。另外加载图像可能会提示错误,原因很多,加pygame.init()试一试,有些是路径不对,windows的路径是  "\"  ,代码里的路径是  "/",还有也可以用  pygame.image.load('./imags/bg1.jpg')  这种添加了 “./” 前缀的,windows外的系统也能认识。代码如下:
 

class GameBackground(object):
    # 初始化地图
    def __init__(self, scene):
        # 加载相同或者不同两种张图片资源,做交替实现地图滚动
        self.image1 = pygame.image.load("images/bg1.jpg")
        self.image2 = pygame.image.load("images/bg1.jpg")
        # 保存场景对象
        self.main_scene = scene
        # 辅助移动地图
        self.image1_rect = self.image1.get_rect()
        self.image2_rect = self.image2.get_rect()
        # self.main_scene.size[1]保存的是游戏窗口的高度 rect属性里是有 height参数的
        # 但编辑器不会自动显示,我也是在调试的时候才发现。
        self.y1 = self.main_scene.size[1] - self.image1_rect.height
        self.y2 = self.y1 - self.image2_rect.height
 
    # 计算地图图片绘制坐标
    def action(self):
        self.y1 = self.y1 + 1
        self.y2 = self.y2 + 1
        #第一张图超出屏幕了,就接到第二张图的后面,以此类推。
        if self.y1 >= self.main_scene.size[1]:
            self.y1 = self.y2 - self.image1_rect.height
        if self.y2 >= self.main_scene.size[1]:
            self.y2 = self.y1 - self.image2_rect.height
 
    # 绘制地图的两张图片
    def draw(self):
        self.main_scene.scene.blit(self.image1, (0, self.y1))
        self.main_scene.scene.blit(self.image2, (0, self.y2))

猜你喜欢

转载自blog.csdn.net/hailler1119/article/details/88089379