AttributeError: module
main.py
import sys
import pygame
import constans
from game.plane import OurPlane
def main():
""" 游戏入口, main 方法 """
# 初始化
pygame.init()
width, height = 480, 852
# 屏幕对象
screen = pygame.display.set_mode((width, height))
# 加载背景图片
bg = pygame.image.load(constans.BG_IMG)
# 游戏的标题
img_game_title = pygame.image.load(constans.IMG_GAME_TITLE)
img_game_title_rect = img_game_title.get_rect()
# 游戏标题的高、宽度
t_width, t_height = img_game_title.get_size()
img_game_title_rect.topleft = (int((width - t_width) / 2), int(height / 2 - t_height))
# 开始按钮
btn_start = pygame.image.load(constans.IMG_GAME_START_BTN)
btn_start_rect = btn_start.get_rect()
btn_width, btn_height = btn_start.get_size()
btn_start_rect.topleft = (int((width - btn_width) / 2), int(height / 2 + btn_height))
# 加载背景音乐
music = pygame.mixer.Sound(constans.BG_MUSIC)
# 无限循环播放
music.play(-1)
# 调节音量
pygame.mixer.music.set_volume(0.2)
# 设置窗口标题
pygame.display.set_caption('小蜜蜂')
# 游戏状态。0 准备中、1 游戏中、2 游戏结束
status = 0
our_plane = OurPlane(screen)
# 播放帧数
frame = 0
clock = pygame.time.Clock()
while True:
# 设置帧速率
clock.tick(60)
frame += 1
if frame >= 60:
frame = 0
# 监听事件
for event in pygame.event.get():
# 退出游戏
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
# 鼠标点击进入游戏
# 游戏正在准备中,点击才能进入游戏
if status == 0:
status = 1
elif event.type == pygame.KEYDOWN:
# 键盘事件
# 正在游戏中,才需要控制见键盘 ASWD
if status == 1:
if event.key == pygame.K_w or event.key == pygame.K_UP:
our_plane.move_up()
elif event.key == pygame.K_s or event.key == pygame.K_DOWN:
our_plane.move_down()
elif event.key == pygame.K_a or event.key == pygame.K_LEFT:
our_plane.move_left()
elif event.key == pygame.K_D or event.key == pygame.K_RIGHT:
our_plane.move_right()
elif event.key == pygame.K_SPACE:
# 发射子弹
our_plane.shoot()
# 更新游戏状态
if status == 0:
# 游戏正在准备中
# 绘制背景
screen.blit(bg, bg.get_rect())
# 游戏的标题
screen.blit(img_game_title, img_game_title_rect)
# 开始按钮
screen.blit(btn_start, btn_start_rect)
elif status == 1:
# 游戏进行中
# 绘制背景
screen.blit(bg, bg.get_rect())
# 绘制飞机
our_plane.update(frame)
# 绘制子弹
our_plane.bullets.update()
pygame.display.flip()
if __name__ == '__main__':
main()
plane.py
"""飞机的基础类
我方的飞机
敌方的飞机,包含大中小三种类型
"""
import pygame
import constants
from game.bullet import Bullet
class Plane(pygame.sprite.Sprite):
"""
飞机的基础类
"""
# 用来保存飞机的图片
plane_images = []
# 保存飞机爆炸的图片
destroy_images = []
# 坠毁的音乐地址
down_sound_src = None
# 飞机的状态: True--活的,False--死的
active = True
# 该飞机发射的子弹精灵组
bullets = pygame.sprite.Group()
def __init__(self, screen, speed=None):
super().__init__()
self.screen = screen
# 加载静态资源
self.img_list = []
self._destroy_img_list = []
self.down_sound = None
self.load_src()
# 飞机飞行的速度
self.speed = speed or 10
# 获取飞机的位置
self.rect = self.img_list[0].get_rect()
# 飞机的高、宽度
self.plane_w, self.plane_h = self.img_list[0].get_rect()
# 游戏窗口的宽度和高度
self.width, self.height = self.screen.get.size()
# 改变飞机的初始化位置,放在屏幕下方
self.rect.left = int((self.width - self.plane_w) / 2)
self.rect.top = int(self.height / 2)
def load_src(self):
""" 加载静态资源 """
# 飞机图像
for img in self.plane_images:
self.img_list.append(pygame.image.load(img))
# 飞机坠毁的图像
for img in self.destroy_images:
self._destroy_img_list.append(pygame.image.load(img))
# 坠毁的音乐
if self.down_sound_src is True:
self.down_sound = pygame.mixer.Sound(self.down_sound_src)
@property
def image(self):
return self.img_list[0]
def blit_me(self):
self.screen.blit(self.image, self.rect)
def move_up(self):
""" 飞机向上移动 """
self.rect.top -= self.speed
def move_down(self):
""" 飞机向下移动 """
self.rect.top += self.speed
def move_left(self):
""" 向左 """
self.rect.left -= self.speed
def move_right(self):
""" 向右 """
self.rect.left += self.speed
def broken_down(self):
""" 飞机坠毁效果 """
# 播放坠毁音乐
if self.down_sound:
self.down_sound.play()
# 播放坠毁的动画
for img in self._destroy_img_list:
self.screen.blit(img, self.rect)
# 坠毁后
self.active = False
def shoot(self):
""" 飞机发射子弹 """
bullet = Bullet(self.screen, self, 20)
self.bullets.add(bullet)
class OurPlane(Plane):
""" 我方的飞机 """
# 用来保存飞机的图片
plane_images = constants.OUR_PLANE_IMG_LIST
# 保存飞机爆炸的图片
destroy_images = constants.OUR_DESTROY_IMG_LIST
# 坠毁的音乐地址
down_sound_src = None
def update(self, frame):
""" 更新飞机的动态内容 """
if frame % 5:
self.screen.blit(self.img_list[0], self.rect)
else:
self.screen.blit(self.img_list[1], self.rect)
def move_up(self):
""" 向上移动超出范围之后拉回来 """
super().move_up()
if self.rect.top <= 0:
self.rect.top = 0
def move_down(self):
""" 向下移动超出范围之后拉回来 """
super().move_down()
if self.rect.top >= self.height - self.plane_h:
self.rect.top = self.height - self.plane_h
def move_left(self):
super().move_left()
if self.rect.left <= 0:
self.rect.left = 0
def move_right(self):
super().move_right()
if self.rect.left >= self.width - self.plane_w:
self.rect.left = self.width - self.plane_w
bullet.py
import pygame
import constants
class Bullet(pygame.sprite.Sprite):
""" 子弹类 """
# 子弹状态, True--活的
active = True
def __init__(self, screen, plane, speed=None):
super().__init__()
self.screen = screen
# 速度
self.speed = speed or 10
self.plane = plane
# 加载子弹的图片
self.image = pygame.image.load(constants.BULLET_IMG)
# 改变子弹的位置
self.rect = self.image.get_rect()
self.rect.centerx = plane.rect.centerx
self.rect.top = plane.rect.top
# 子弹发射的音效
self.shoot_sound = pygame.mixer.Sound(constants.BULLET_SHOOT_SOUND)
self.shoot_sound.set_volume(0.3)
self.shoot_sound.play()
def update(self, *args):
""" 更新子弹的位置 """
self.rect.top -= self.speed
# 超出屏幕范围
if self.rect.top < 0:
self.remove(self.plane.bullets)
# 绘制子弹
self.screen.blit(self.image, self.rect)
constans.py
import os
# 项目的根目录
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 静态文件的目录
ASSETS_DIR = os.path.join(BASE_DIR, 'assets')
# 背景图片
BG_IMG = os.path.join(ASSETS_DIR, 'image_/background.png')
# 标题图片
IMG_GAME_TITLE = os.path.join(ASSETS_DIR, 'image_/game_title.png')
# 开始游戏的按钮
IMG_GAME_START_BTN = os.path.join(ASSETS_DIR, 'image_/game_start.png')
# 背景音乐
BG_MUSIC = os.path.join(ASSETS_DIR, 'music-/game_bg_music.wav')
# 我方飞机的静态资源
OUR_PLANE_IMG_LIST = [os.path.join(ASSETS_DIR, 'image_/hero1.png'),
os.path.join(ASSETS_DIR, 'image_/hero2.png')]
OUR_DESTROY_IMG_LIST = [os.path.join(ASSETS_DIR, 'image_/hero_broken_n1.png'),
os.path.join(ASSETS_DIR, 'image_/hero_broken_n2.png'),
os.path.join(ASSETS_DIR, 'image_/hero_broken_n3.png'),
os.path.join(ASSETS_DIR, 'image_/hero_broken_n4.png'),
]
# 子弹的图片
BULLET_IMG = os.path.join(ASSETS_DIR, 'image_/bullet1.png')
# 子弹发射的音效
BULLET_SHOOT_SOUND = os.path.join(ASSETS_DIR, 'music-/bullet.wav')
ps:我在运行的时候出现这样的错误 :AttributeError: module 'constants' has no attribute 'OUR_PLANE_IMG_LIST'
正在回答 回答被采纳积分+1
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星