小学课后服务 Python少儿编程 进阶篇:12-飞机大战3 课件 (16张PPT)

资源下载
  1. 二一教育资源

小学课后服务 Python少儿编程 进阶篇:12-飞机大战3 课件 (16张PPT)

资源简介

(共16张PPT)
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
少儿编程课
飞机大战3
本节我们来继续完善这个小游戏,增加陨石掉落和发射子弹等功能
陨石精灵的添加
和飞机精灵一样,我们同样通过精灵类来创建陨石精灵
1
创建陨石精灵类、定义初始化方法
2
设定陨石随机出现的位置
这里先使用红色方块代替陨石
# 陨石精灵
class Meteorite(pygame.sprite.Sprite):
def __init__(self):
# 初始化
pygame.sprite.Sprite.__init__(self)
# 定义陨石的图形
self.image = pygame.Surface((30, 40))
# 定义陨石的颜色为红色
self.image.fill((255, 0, 0))
# 获取陨石的长方形
self.rect = self.image.get_rect()
# 设置陨石出现的x轴坐标:随机出现在0~屏幕宽度‐陨石本身宽度的位置
self.rect.x = random.randrange(WIDTH - self.rect.width)
# y轴坐标
self.rect.y = random.randrange(-100, -40)
3
设定陨石的飞行速度
self.speedy = random.randrange(1, 8)
# x轴速度
self.speedx = random.randrange(-3, 3)
4
增加update方法,指定陨石运行规则
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
陨石精灵编写完成之后,添加到精灵组,这里为什么要使用精灵组呢?
只有一个飞机精灵时,我们调用它的update方法并画到屏幕需要这样做
而如果有很100个飞机精灵,同时还有很多陨石精灵,那么……
统一渲染
统一更新update
如果我们使用精灵组
player.update()
screen.blit(player.image, player.rect)
如果有三个飞机精灵
精灵组
player.update()
screen.blit(player.image, player.rect)
player.update()
screen.blit(player.image, player.rect)
player.update()
screen.blit(player.image, player.rect)
将创建好的精灵添加到精灵组之后,我们就可以:
现在我们就创建全部精灵组,统一管理飞机和陨石
定义全部精灵组,加入飞机与陨石
# 定义玩家飞机对象
player = Player()
# 定义全部精灵组
all_sprites = pygame.sprite.Group()
# 将飞机加入精灵组
all_sprites.add(player)
# 定义8个陨石并加入到精灵组all_sprites
for i in range(8):
met = Meteorite()
all_sprites.add(met)
这段代码创建了一个精灵组,并将飞机精灵和创建的8个陨石精灵都添加到了精灵组中
1
2
在死循环中,调用精灵组的update方法
all_sprites.update()
all_sprites.draw(screen)
3
将所有精灵绘制到屏幕中
使用精灵组之后,不需要去调用每一个精灵update方法,也不必把每一个精灵都blit到屏幕上,只需要对精灵组进行操作就可以统一管理。
运行程序,观察陨石掉落效果:
观察效果可以看到,陨石只出现了8个,过后不在生成新的陨石,如何让陨石一直产生呢?
1
在陨石掉落出屏幕之后,使其回到初始位置即可
2
在update方法中增加如下判断
if self.rect.top > HEIGHT + 10 or self.rect.left < -30 or self.rect.right > WIDTH + 30:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
运行程序,陨石雨效果如下:
子弹精灵的添加
1
创建子弹精灵类,定义初始化方法
飞机和陨石群的效果都已制作完成,现在为飞机添加发射子弹的功能
2
设置子弹的位置为传入的x和y、设置子弹移动速度
# 子弹
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((10, 20))
self.image.fill((255, 255, 0))
self.rect = self.image.get_rect()
self.rect.bottom = y
self.rect.centerx = x
# 设置子弹的速度,子弹是从下往上的,所以为负
self.speedy = -10
1
在飞机精灵类中添加发射子弹的方法
3
添加update方法,使子弹移动
飞机和陨石群的效果都已制作完成,现在为飞机添加发射子弹的功能
2
在死循环的事件中设置子弹发射的时机,例如按下空格键时
def update(self):
self.rect.y += self.speedy
# 添加射击的功能
def shoot(self):
# 定义子弹
bullet = Bullet(self.rect.centerx, self.rect.top)
# 将子弹加入全部精灵组和子弹精灵组
all_sprites.add(bullet)
发射子弹是飞机的行为,所以在飞机精灵类中定义射击功能。
if event.key == pygame.K_SPACE:
player.shoot()
该方法首先产生一颗子弹,然后将子弹加入精灵组。
在死循环中由于调用了all_sprites的update方法,子弹就会自动运行。
效果演示与移动出屏幕外的子弹处理
2
运行程序,按空格键
1
为了节省内存,在子弹的update方法中添加删除功能
if self.rect.bottom < 0:
self.kill()
总结
Summary
Pygame精灵类

Pygame精灵组的使用

Thanks!

展开更多......

收起↑

资源预览