import gc
import random
import pygame
# Sprite 精灵
from pygame.rect import Rect
import Constants
class HeroPlane(pygame.sprite.Sprite):
def __init__(self, screen):
# 这个精灵的初始化方法 必须调用
pygame.sprite.Sprite.__init__(self)
# 图片
self.image = pygame.image.load('./feiji/feiji.png')
# 根据图片image获取矩形的对象
self.rect = self.image.get_rect() # rect属性:矩形
self.rect.topleft = [512 / 2 - 100 / 2, 600] # 矩形左上角坐
# 窗口
self.screen = screen
# 速度
self.speed = 10
# 根据图片获取mask,属性,方便检测,非透明区域的碰撞
self.mask = pygame.mask.from_surface(self.image)
# 存放子弹的精灵组
self.bullets = pygame.sprite.Group()
# 定义飞机的血量
self.blood_value = 10
# 标记敌机是否挂掉
self.is_remove = False
# 显示爆炸图片的索引 从0开始
self.mIndex = 0
# 存爆炸图片的列表
self.bomb_mImages = []
for v in range(1, 14):
# 每一个存2次 多显示一次,效果更好些
self.bomb_mImages.append(pygame.image.load("./feiji/image " + str(v) + ".png"))
self.bomb_mImages.append(pygame.image.load("./feiji/image " + str(v) + ".png"))
def key_control(self):
"""
按键的监听 用来改变飞机坐标
"""
# 监听键盘事件 键盘一直按下
key_pressed = pygame.key.get_pressed() # 注意这种方式是能够检测到连续按下的,比之前的版本要新
# 改变飞机坐标 512, 768
if key_pressed[pygame.K_w] or key_pressed[pygame.K_UP]:
if self.rect.top < 0:
pass
else:
self.rect.top -= self.speed
if key_pressed[pygame.K_s] or key_pressed[pygame.K_DOWN]:
if self.rect.bottom > 768:
pass
else:
self.rect.bottom += self.speed
if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
if self.rect.left < 0:
pass
else:
self.rect.left -= self.speed
if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
if self.rect.right > 512:
pass
else:
self.rect.right += self.speed
if key_pressed[pygame.K_SPACE]:
# 按下空格键
# print('发射子弹')
# 创建三个散弹对象
bullet1 = Bullet(self.screen, self.rect.left, self.rect.top, 1)
bullet2 = Bullet(self.screen, self.rect.left, self.rect.top, 2)
bullet3 = Bullet(self.screen, self.rect.left, self.rect.top, 3)
# 把三个子弹添加到精灵组
self.bullets.add(bullet1, bullet2, bullet3)
def bomb(self):
"""显示爆炸图片"""
self.screen.blit(self.bomb_mImages[self.mIndex], (self.rect.left, self.rect.top))
# 索引+1 下次显示下一张
self.mIndex += 1
print('self.mIndex', self.mIndex)
if self.mIndex >= len(self.bomb_mImages):
# 如果下标已经到最后 代表爆炸结束
# 下标重置 mVisible重置
self.mIndex = 0
# 爆炸结束返回True
return True
# 调用飞机的更新方法
def update(self):
# 判断飞机挂掉
if self.is_remove:
print('挂掉')
# 执行爆炸,并判断爆炸是否结束
if self.bomb():
print('玩家飞机爆炸结束')
# 移出窗口,坐标在窗口外就可以
self.rect.topleft = [-200, -200]
else:
self.key_control()
self.display()
def display(self):
"""显示飞机到窗口,显示子弹等"""
# 显示飞机
self.screen.blit(self.image, self.rect)
# 更新子弹坐标
self.bullets.update()
# 把所有的子弹全部添加到屏幕
self.bullets.draw(self.screen)
def kill_(self, kill_value=10):
"""飞机被打中,每次减10 如果碰到敌机-100"""
self.blood_value -= kill_value
print('被打中,血量剩%s' % self.blood_value)
if self.blood_value <= 0:
self.blood_value = 0 # 如果是负值就显示0
# 标记飞机挂掉
self.is_remove = True
# 开启游戏到期时
pygame.time.set_timer(Constants.game_over_id, 1000) # 开启游戏倒计时
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, screen, x, y, path_num):
"""
:param screen: 屏幕对象
:param x: 飞机的左上角x坐标
:param y: 飞机的左上角y坐标
:param path_num: 子弹的弹道序号,目前是三层散弹, 记作1,2,3
"""
pygame.sprite.Sprite.__init__(self)
# 图片
self.image = pygame.image.load('./feiji/zidan.png')
self.rect = self.image.get_rect() # rect属性:矩形
self.rect.topleft = [x + 38, y - 10] # 矩形左上角坐
# 窗口
self.screen = screen
# 速度
self.speed = 25
# 根据图片获取mask,属性,方便检测,非透明区域的碰撞
self.mask = pygame.mask.from_surface(self.image)
# 子弹的弹道序号
self.path_num = path_num
def update(self):
# 修改子弹y坐标
self.rect.top -= self.speed
if self.rect.top < -22:
# 如果子弹移出屏幕上方,则销毁子弹对象
self.kill()
if self.path_num == 1:
pass
elif self.path_num == 2:
# 如果等于2就是散弹中左侧子弹
self.rect.left -= 10
elif self.path_num == 3:
# 如果等于3就是散弹中右侧子弹
self.rect.right += 10
# 敌方飞机
class EnemyPlane(pygame.sprite.Sprite):
"""敌方飞机"""
rect: Rect
# 类属性 存放所有敌机对象的子弹的精灵组
all_bullets = pygame.sprite.Group()
def __init__(self, screen):
pygame.sprite.Sprite.__init__(self)
# 敌方飞机的图片
self.image = pygame.image.load('./feiji/img-plane_4.png') # 51*39
# 获取矩形区域
self.rect = self.image.get_rect()
# 敌机初始坐标 水平位置随机,上下位置在最顶部
self.rect.topleft = [random.randint(0, 512), 0]
# 飞机的速度
self.speed = 5
# 记录当前的窗口对象
self.screen = screen
# 飞机左右飞的方向 一开始向右
self.direction = 'right'
# 根据图片获取mask,属性,方便检测,非透明区域的碰撞
self.mask = pygame.mask.from_surface(self.image)
# 装子弹的列表
self.bullets = pygame.sprite.Group()
# 标记敌机是否被击中
self.is_remove = False
# 显示爆炸图片的索引 从0开始
self.mIndex = 0
# 存爆炸图片的列表
self.bomb_mImages = []
for v in range(1, 14):
# 每一个存2次 多显示一次,效果更好些
self.bomb_mImages.append(pygame.image.load("./feiji/image " + str(v) + ".png"))
self.bomb_mImages.append(pygame.image.load("./feiji/image " + str(v) + ".png"))
def display(self):
"""显示飞机到窗口"""
self.screen.blit(self.image, self.rect)
# 所有子弹更新坐标
self.bullets.update()
# 所有子弹贴到屏幕
self.bull
没有合适的资源?快使用搜索试试~ 我知道了~
用python基础实现飞机大战游戏.zip
共114个文件
png:59个
py:33个
xml:7个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 141 浏览量
2021-11-12
17:28:39
上传
评论
收藏 9.81MB ZIP 举报
温馨提示
使用python基础实现飞机大战游戏。使用前请下载 pygame( pip install pygame)
资源推荐
资源详情
资源评论
收起资源包目录
用python基础实现飞机大战游戏.zip (114个子文件)
.gitignore 184B
飞机大战.iml 431B
feiji.iml 398B
img_bg_level_1.jpg 388KB
img_bg_level_3.jpg 358KB
bg_test.jpg 208KB
img_bg_level_2.jpg 190KB
img_bg_level_5.jpg 74KB
img_bg_level_4.jpg 55KB
Jamesketed.mp3 3.65MB
bg2.ogg 824KB
feiji22.png 123KB
eff3.png 89KB
eff4.png 72KB
eff2.png 71KB
image 5.png 28KB
image 6.png 25KB
image 12.png 23KB
image 11.png 23KB
image 10.png 23KB
image 8.png 23KB
eff1.png 23KB
image 9.png 23KB
image 7.png 22KB
image 2.png 21KB
image 3.png 21KB
image 1.png 21KB
feiji.png 20KB
hero2.png 19KB
666.png 16KB
image 14.png 16KB
image 13.png 16KB
feiji3.png 14KB
image 4.png 14KB
bomb-2.png 13KB
bomb-3.png 11KB
bomb-4.png 10KB
bomb-5.png 9KB
bomb-1.png 8KB
start.png 8KB
img-plane_4.png 6KB
img-plane_6.png 6KB
img-plane_2.png 6KB
bomb-6.png 6KB
zidan2.png 6KB
img-plane_1.png 6KB
img-plane_3.png 6KB
img-plane_5.png 6KB
hero1.png 6KB
img-plane_7.png 6KB
zidan1.png 5KB
bullet_6.png 5KB
bullet_8.png 5KB
bullet_14.png 5KB
bullet_10.png 5KB
bullet_2.png 5KB
bullet_11.png 5KB
bullet_3.png 5KB
hero_bullet_7.png 4KB
bullet_7.png 4KB
zidan.png 4KB
bullet_12.png 4KB
bullet_4.png 4KB
snipaste20181119_105002.png 4KB
bullet_13.png 4KB
bullet_5.png 4KB
bomb-7.png 4KB
bullet_9.png 4KB
bullet_1.png 4KB
buttonPost.png 3KB
030倒计时.py 19KB
test碰撞停止.py 19KB
029玩家飞机_显示血量和分数.py 18KB
028玩家飞机_背景图.py 16KB
027玩家飞机_爆炸声音.py 15KB
026玩家飞机_爆炸效果.py 14KB
025子弹打中敌机_爆炸效果.py 13KB
024子弹打中敌机.py 11KB
023定时器.py 11KB
021敌机发射子弹.py 9KB
022多驾敌机.py 9KB
020添加敌机.py 8KB
018添加子弹.py 7KB
019优化代码添加管理类.py 6KB
015飞机大战_精灵和精灵组碰撞.py 5KB
013飞机大战_小球移动2.py 5KB
014飞机大战_精灵和精灵组碰撞.py 4KB
017抽取飞机精灵类.py 3KB
011飞机大战_小球移动.py 2KB
010飞机大战_键盘监听.py 2KB
012飞机大战_小球移动2.py 2KB
016移动飞机.py 2KB
003飞机大战_显示背景图.py 2KB
004飞机大战_显示背景图.py 2KB
005飞机大战_绘制直线.py 1KB
006飞机大战_绘制矩形.py 1KB
009飞机大战_绘制多边形.py 1KB
008飞机大战_绘制椭圆.py 1KB
007飞机大战_绘制圆形.py 1KB
002飞机大战_显示背景图.py 905B
共 114 条
- 1
- 2
资源评论
liu_zhen_qun
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功