pygame飞机大战用精灵组(sprite)的层(layer)编写(二)动态背景图的加载
动态背景的实现原理还是和以前一样。
前面的文章有介绍
https://blog.****.net/hailler1119/article/details/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)简单多了吧。