准备文件
需要模块模块pygame
pygame简介
Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发的模块。
pygame的安装
使用命令 pip install pygame
所需素材(包括音频,图片素材):/s/1lq8CDvvhgymB_5h2wzKc8Q
密码:tebp
实现思路
原图
重要函数及部分代码展示
重要函数
启用pygame界面与音频组件组件,绘制一个480*700主界面:pygame.init()pygame.mixer.init()bg_size = width, height = 480, 700screen = pygame.display.set_mode(bg_size)
导入素材,以下为导入素材所用函数:
pygame.image.load(“图片路径”).convert_alpha() //以alpha通道导入图片,识别图片去白色背景,用于导入飞机子弹素材。
pygame.image.load(“图片路径”).convert() //常规导入图片,用于导入背景素材。
pygame.mixer.music.load(“图片路径”) //导入音乐素材。
pygame.mixer.music.set_volume() //设置声音大小。
创建飞机,子弹之类的对象并为其初始化,添加移动的方法,例:
import pygameclass MyPlane(pygame.sprite.Sprite):def __init__(self, bg_size):#初始化与导入素材passdef moveUp(self):#向上移动方法passdef moveDown(self):#向下移动方法passdef moveLeft(self):passdef moveRight(self):passdef reset(self):#重置即销毁方法pass
碰撞检测
pygame.sprite.spritecollide(素材1,素材2, False, pygame.sprite.collide_mask)
如果两个素材接触到则返回一个bool值False
详细代码见:链接:/s/19m0xiNEFfgNNfokydDGxRg
提取码:n09t
部分代码
# 检测子弹是否击中敌机for b in bullets:if b.active:b.move()screen.blit(b.image, b.rect)enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask)if enemy_hit:b.active = Falsefor e in enemy_hit:if e in mid_enemies or e in big_enemies:e.hit = Truee.energy -= 1if e.energy == 0:e.active = Falseelse:e.active = False
玩家飞机对象:
import pygame#继承pygame.sprite.Sprite类class MyPlane(pygame.sprite.Sprite):def __init__(self, bg_size):pygame.sprite.Sprite.__init__(self)#导入素材self.image1 = pygame.image.load("images/me1.png").convert_alpha()self.image2 = pygame.image.load("images/me2.png").convert_alpha()self.destroy_images = []self.destroy_images.extend([\pygame.image.load("images/me_destroy_1.png").convert_alpha(), \pygame.image.load("images/me_destroy_2.png").convert_alpha(), \pygame.image.load("images/me_destroy_3.png").convert_alpha(), \pygame.image.load("images/me_destroy_4.png").convert_alpha()])#获取图片边缘信息self.rect = self.image1.get_rect()self.width, self.height = bg_size[0], bg_size[1]self.rect.left, self.rect.top = \(self.width - self.rect.width) // 2, \self.height - self.rect.height - 60设置移动速度self.speed = 10#设置状态self.active = Trueself.invincible = Falseself.mask = pygame.mask.from_surface(self.image1)def moveUp(self):if self.rect.top > 0:self.rect.top -= self.speedelse:self.rect.top = 0def moveDown(self):if self.rect.bottom < self.height - 60:self.rect.top += self.speedelse:self.rect.bottom = self.height - 60def moveLeft(self):if self.rect.left > 0:self.rect.left -= self.speedelse:self.rect.left = 0def moveRight(self):if self.rect.right < self.width:self.rect.left += self.speedelse:self.rect.right = self.widthdef reset(self):self.rect.left, self.rect.top = \(self.width - self.rect.width) // 2, \self.height - self.rect.height - 60self.active = Trueself.invincible = True
结果演示
给出初步实现效果如下: