请帮解答下问题在哪
请问一下如果不封装war文件,代码如下为什么无法正常运行r.broken_down(),
main.py
import pygame,sys
import constants
from game.plane import Plane, OurPlane , SmallEnemyPlane
def main():
"""游戏入口"""
#初始化
pygame.init()
width,height = 480,852
#屏幕对象
screen = pygame.display.set_mode((width,height))
#设置标题
pygame.display.set_caption('飞机大战')
#加载背景图片
bg = pygame.image.load(constants.BG_IMG)
#游戏标题
img_game_title = pygame.image.load(constants.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(constants.IMG_GAME_START_BTN)
btn_start_rect = btn_start.get_rect()
b_width,b_height = btn_start.get_size()
btn_start_rect.topleft =(int((width-b_width)/2),int(height/2+b_height))
#加载背景音乐
pygame.mixer_music.load(constants.BG_MUSIC)
# 循环播放
pygame.mixer_music.play(-1)
#调整音量
pygame.mixer_music.set_volume(0.2)
#游戏状态 (准备中为0,游戏中为1,游戏结束为2)
status = 0
small_enemies = pygame.sprite.Group()
enemies = pygame.sprite.Group()
our_plane = OurPlane(screen,20)
frame = 0 #播放帧数
clock = pygame.time.Clock()
#一架飞机可以属于多个精灵组
for i in range(6):
plane = SmallEnemyPlane(screen,4)
plane.add(small_enemies,enemies)
while True:
clock.tick(60)
frame += 1
if frame >= 60:
frame = 0
#1监听事件
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:
#键盘事件
#游戏正在游戏中
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(enemies)
#绘制敌方飞机
small_enemies.update()
pygame.display.update()
if __name__ == '__main__':
main()
plane.py
import random
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.enemies = enemies
# 加载静态资源
self.img_list = []
self._destroy_img_list = []
self.down_sound_src = 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_size()
#游戏窗口的尺寸
self.width,self.height = self.screen.get_size()
# 改变飞机初始位置
self.rect.x = int((self.width - self.plane_w) / 2)
self.rect.y = 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:
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.y -= self.speed
def move_down(self):
'''向下移动'''
self.rect.y += self.speed
def move_left(self):
'''向左移动'''
self.rect.x -= self.speed
def move_right(self):
'''向右移动'''
self.rect.x += self.speed
def broken_down(self):
"""飞机坠毁"""
# 1.播放坠毁音乐
if self.down_sound:
self.down_sound.play()
# 2.播放坠毁动画
for img in self._destroy_img_list:
self.screen.blit(img, self.rect)
# 3坠毁后
self.active = False
def shoot(self):
'''发射子弹'''
bullet = Bullet(self.screen,self,30)
self.bullets.add(bullet)
class OurPlane(Plane):
'''我方飞机'''
# 飞机的图片
plane_images = [constants.OUR_PLANE_IMG_1, constants.OUR_PLANE_IMG_2]
# 飞机爆炸的图片
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.y <= 0:
self.rect.y = 0
def move_down(self):
'''向下移动,控制不超出边境'''
super().move_down()
if self.rect.y >= self.height - self.plane_h :
self.rect.y = self.height - self.plane_h
def move_left(self):
'''向左移动,控制不超出边境'''
super().move_left()
if self.rect.x <= 0:
self.rect.x = 0
def move_right(self):
'''向右移动,控制不超出边境'''
super().move_right()
if self.rect.x >= self.width - self.plane_w:
self.rect.x = self.width - self.plane_w
class SmallEnemyPlane(Plane):
"""敌方小型飞机"""
# 飞机的图片
plane_images = [constants.SMALL_ENEMY_PLANE_IMG]
# 飞机爆炸的图片
destroy_images = constants.SMALL_ENEMY_DESTROY_IMG_LIST
# 飞机爆炸的音效地址
down_sound_src = constants.SMALL_ENEMY_PLANE_DOWN_SOUND
def __init__(self,screen,speed):
super().__init__(screen,speed)
#每生成一架新的小型飞机,随机出现位置
self.rect.x = random.randint(0,self.width - self.plane_w)
self.rect.y = random.randint(-5*self.plane_h,-self.plane_h)
def update(self, *args):
'''更新飞机移动'''
super().move_down()
#画在屏幕上
self.blit_me()
#超出范围
if self.rect.y >= self.height:
self.active = False
#self.kill()
self.reset()
def reset(self):
'''重置飞机'''
self.active = True
#改变飞机位置
self.rect.x = random.randint(0, self.width - self.plane_w)
self.rect.y = random.randint(-5 * self.plane_h, -self.plane_h)
def broken_down(self):
"""飞机爆炸"""
super().broken_down()
self.reset()
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.enemies = enemies
#速度
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.y = plane.rect.y
#发射音效
self.shoot_sound = pygame.mixer.Sound(constants.BULLET_SOUND)
self.shoot_sound.set_volume(0.3)
self.shoot_sound.play()
def update(self, enemies):
'''更新子弹位置'''
self.rect.y -= self.speed
#超出屏幕
if self.rect.y < 0:
self.remove(self.plane.bullets)
#绘制子弹
self.screen.blit(self.image,self.rect)
#碰撞检测
rest = pygame.sprite.spritecollide(self,enemies,False)
for r in rest:
#1.子弹消失
print(r)
self.kill()
#2.飞机爆炸
r.broken_down()
#3.统计成绩
正在回答
同学,你好。
关于该问题所触发的错误,请附上以下两项信息,从而方便我们定位问题,更快为你解决:
(1)错误信息(pycharm中的错误信息)
(2)项目结构的截图信息(完整)
或者你可在问答区按照上述要求重新提问。
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星