pygame飞机大战用精灵组(sprite)的层(layer)编写(二)动态背景图的加载

动态背景的实现原理还是和以前一样。

前面的文章有介绍

https://mp.csdn.net/postedit/88911974

为了个整个项目配套搭建,还是一步一步介绍一下。

因为很多地方要用到pygame.math.Vector2D 这个类,它

提供两个数字,对应与坐标x,y刚好,能进行加减乘除运算,能进行角度计算等,十分实用,就直接在setting.py里简化了成了vect

创建一个背景的sprite类,从上往下滚动背景图,要实现第二张图的对接,需要传递一个坐标参数,用了一张上下连在一起可以无缝对接的图,如果要实现多种图的连续,需要把图存在一个images[] list类型里,全局变量,传递图片index和pos俩个参数也能实现。

用spite类,必须实现精灵类的初始化和设置 self.image self.rect 这两个变量。

用到层的概念,在添加两个

self._layer = -1

层的 赋值是int就行,背景图的一般在底层,其他的图基本都覆盖在它上面,所以设置成 -1,其他sprite图只要是正数就肯定不会被它覆盖了。

self.groups =  allgroup, backgroundgroup #(顺序随意)

背景的组 属于 allgroup和backgroundgroup,相当于在allgroup和backgroundgroup两个组里添加(add)了这个类,以后只要调用allgroup或backgroundgroup的显示,更新函数就会自动调用backgroud类的相应函数了。

初设化里把self.groups添加进去。

传递位置参数,默认self.parent的用法见update()函数。

class Background(pygame.sprite.Sprite):
    """
        generate a Background sprite for the background, 
           to demonstrate vertical scrolling.background slide from top to bottom
           parameter: vect_pos must use in pygame.math.Vector2D type
    """

    def __init__(self, vect_pos):
        self._layer = -1
        self.groups = allgroup, backgroundgroup
        pygame.sprite.Sprite.__init__(self, self.groups)  # THE Line
        self.image = pygame.image.load('images/bg0.jpg').convert_alpha()
        # self.image.convert_alpha()
        self.rect = self.image.get_rect()
        self.pos = vect_pos
        self.rect.x = self.pos.x
        self.rect.y = self.pos.y
        self.parent = False

初设化完成。进行图片更新。重写sprited的update()函数。

改变图像的y 坐标,让图像从上往下移动

图像左上角坐标离开底部后,即产生新图像,无缝对接。

当前图像超过屏幕时,自毁,不然加载多了,会卡卡卡

    def update(self):
        self.rect.y += 1
        if self.rect.y > SCENEHEIGHT:
            #kill了以后,还是能继续下面的print()的。
            self.kill()
        # create new background if necessary
        # 下面这段代码真是精彩,背景图有两张,例如bg1,bg2,均默认parent= Flase
        # bg1需要加第二张bg2时(self.rect.y>=0)时,第一张bg1的parent = Ture,此时还没达到bg1的kill的判定
        # 能继续运行,但不能再产生新图。
        # 新生成的背景图bg2,默认parent = False,代替了第一张bg1的功能,进行下面的代码的判定,条件满足时
        # 能继续产生新背景图bg3,产生bg3后,bg2的parent= True,不能在产生新图,bg3的parent=Falses ……
        # 可以用print(self.parent,self.rect.y)来查看运行状态,同时存在两个图片
        # print(self.parent, self.rect.y)
        if not self.parent:
            if self.rect.y >= 0:
                self.parent = True
                Background(vect(0, -SCENEHEIGHT))

背景图实现了。测试下效果

只需要两行代码,两行就够了哦。

加载背景的类

from background import *

另一行

在class MainScene(object):的初始化类里

      Background(vect(0,0))

建立一个背景类。就一个类,就懒得设置赋值了。

后面的就交给allgroup去发挥了。

运行一下,效果就来了。

用层(layer)控制比组(group)简单多了吧。

调试图

猜你喜欢

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