飞机无法移动,报错

来源:3-5 飞机大战项目飞机移动控制

慕粉232102761

2019-10-14 09:11:45

"""
飞机的基类
我方的飞机  敌方的小型飞机   敌方的中型飞机  敌方的大型飞机
"""
import pygame
import constants


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._destory_img_list = []
       self.down_sound = None
       self.load_src()
       # 飞机飞行的速度
       self.peed = speed or 10
       # 获取飞机的位置
       self.rect =self.img_list[0].get_rect()

   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._destory_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.top -= self.speed
   def move_down(self) :
       #  飞机向下移动
       self.rect.top += self.speed
   def move_left(self):
       # 飞机向左移动
       self.rect.let -= self.speed
   def move_right(self):
       #飞机向右移动
       self.rect.left +=self.speed

   def broken_down(self):
       """飞机坠毁"""
       # 1、 播放坠毁音乐
       if self.down_sound:
           self.down_sound.play()
       # 2、 播放坠毁的动画
       for img in self._destory_img_list:
           self.screen.blit(img, self.rect)
       # 3、坠毁后
       self.active = False




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)

写回答

3回答

时间,

2019-10-14

同学,你好。

1、同学在__init__初始化时,写的是peed,因此在下面方法中调用时是找不到speed的。

http://img.mukewang.com/climg/5da4104a0951f40a04880330.jpg

2、飞机向左移动时,应是rect.left

http://img.mukewang.com/climg/5da410f309daf47203890111.jpg

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

0

慕粉232102761

提问者

2019-10-14

main.py 



import sys
import pygame
import constants
from game.plane import OurPlane


def main():
   """
   游戏入口,main方法
   :return:
   """
   # 初始化
   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()
   btn_width, btn_height = btn_start.get_size()
   btn_start_rect.topleft = (int((width - btn_width) / 2), int(height / 2 + btn_height))

   # 加载背景音乐
   pygame.mixer.music.load(constants.BG_MUSIC)
   pygame.mixer.music.play(-1)  # 无限循环播放
   pygame.mixer.music.set_volume(0.05)  # 设置音量

   # 游戏状态
   status = 0  # 准备中;1、游戏中;2、游戏结束
   our_plane = OurPlane(screen)

   frame = 0 # 播放帧数
   clock = pygame.time.Clock()

   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:
               # 键盘事件
               # 游戏正在进行中, 才需要控制键盘 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()

       # 更新游戏的状态
       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)

       # 更新屏幕
       pygame.display.flip()

if __name__ == '__main__':
   main()

0

慕粉232102761

提问者

2019-10-14

运行后:报错


Traceback (most recent call last):

  File "F:/py-learn/chapter06/mian.py", line 100, in <module>

    main()

  File "F:/py-learn/chapter06/mian.py", line 78, in main

    our_plane.move_right()

  File "F:\py-learn\chapter06\game\plane.py", line 68, in move_right

    self.rect.left +=self.speed

AttributeError: 'OurPlane' object has no attribute 'speed'


0

0 学习 · 8160 问题

查看课程