关于NameError: name 'Our_Plane' is not defined

关于NameError: name 'Our_Plane' is not defined

"""游戏主程序"""
from game.plane import *
from constants import *

import sys
import pygame


class WarPlane(object):
   """游戏入口"""

   def __init__(self):

       # 初始化游戏
       pygame.init()
       # 屏幕大小
       self.size = self.width, self.height = 480, 852
       # 获取屏幕对象
       self.screen = pygame.display.set_mode(self.size)
       # 设置窗口标题
       pygame.display.set_caption('飞机大战')
       # 加载背景音乐
       BG_MUSIC()
       # 计数器
       self.clock = pygame.time.Clock()
       self.count = 0
       # 游戏状态,0准备中,1游戏中,2游戏结束
       self.status = 0

       # 开始按钮初始位置
       self.START_rect = START.get_rect()
       # 开始按钮宽度高度
       self.START_Width, self.START_Height = START.get_size()
       # 开始按钮放置位置
       self.START_rect.left = (self.width - self.START_Width) / 2
       self.START_rect.top = self.height / 2 + self.START_Height

       # 飞机大战图片放置位置
       self.PLANE_WAR_rect = PLANE_WAR.get_rect()
       self.PLANE_WAR_rect.centerx = self.START_rect.centerx
       self.PLANE_WAR_rect.top = self.START_rect.top - 3.3 * self.START_Height

       # 实例化我放飞机
       self.our_plane = Our_Plane(self.screen, 20)

   # 放置图片
   def screen_blit(self, img):
       return self.screen.blit(img, img.get_rect())

   def main(self):

       """游戏主程序"""
       while True:

           """事件"""
           for event in pygame.event.get():
               # 关闭程序事件
               if event.type == pygame.QUIT:
                   pygame.quit()
                   sys.exit()

               elif event.type == pygame.MOUSEBUTTONDOWN:
                   if self.status == 0:
                       self.status = 1

               elif event.type == pygame.KEYDOWN:
                   if self.status == 1:
                       if event.key == pygame.K_UP or event.key == pygame.K_w:
                           self.our_plane.move_up()
                       elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
                           self.our_plane.move_bottom()
                       elif event.key == pygame.K_LEFT or event.key == pygame.K_a:
                           self.our_plane.move_left()
                       elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                           self.our_plane.move_right()

           # 计数器超过60重置
           self.count += 1
           if self.count >= 60:
               self.count == 0
           # 设置帧数
           self.clock.tick(60)

           # 准备阶段
           if self.status == 0:
               # 放置背景图片
               self.screen_blit(READY_BG)
               # 放置开始按钮
               self.screen.blit(START, self.START_rect)
               # 放置飞机大战图片
               self.screen.blit(PLANE_WAR, self.PLANE_WAR_rect)

           # 游戏阶段
           if self.status == 1:
               # 放置背景图片
               self.screen_blit(READY_BG)
               # 我方飞机动态
               if self.count % 5 == 0:
                   self.screen_blit(OUR_PLANE1)
               else:
                   self.screen_blit(OUR_PLANE2)

           # 更新游戏
           pygame.display.flip()


if __name__ == '__main__':
   WarPlane().main()


#分割线---------------------------------------------------------------------------

"""飞机类"""

from main import WarPlane
from constants import *

import pygame


class Plane(pygame.sprite.Sprite):
   """飞机基类"""
   # 飞机图片
   plane_live = []
   # 飞机坠毁图片
   plane_die = []
   # 飞机坠毁音乐
   plane_die_sound = None
   # 精灵组
   bullets = pygame.sprite.Group()

   def __init__(self, screen, speed=5):
       super().__init__()
       # 屏幕对象
       self.screen = screen
       # 飞机初始速度,默认10
       self.speed = speed
       self.rect = self.plane_live[0].get_rect()

   # 飞机向上移动
   def move_up(self):
       self.rect.top -= self.speed
       if self.rect.top < 0:
           self.rect.top = 0

   # 飞机向下移动
   def move_bottom(self):
       self.rect.bottom += self.speed
       if self.rect.bottom > WarPlane().height:
           self.rect.bottom = WarPlane().height

   # 飞机向左移动
   def move_left(self):
       self.rect.left -= self.speed
       if self.rect.left < 0:
           self.rect.left = 0

   # 飞机向右移动
   def move_right(self):
       self.rect.right += self.speed
       if self.rect.right > WarPlane().width:
           self.rect.right = WarPlane().width


class Our_Plane(Plane):
   """我方飞机类"""
   # 飞机图片
   plane_live = [OUR_PLANE1, OUR_PLANE2]
   # 飞机坠毁图片
   plane_die = []
   # 飞机坠毁音乐
   plane_die_sound = None


#分割线----------------------------------------------------------

"""常量"""
import os
import pygame

# 获取当前文件的文件夹路径
chapter12 = os.path.dirname(os.path.abspath(__file__))
# chapter12文件夹下assets文件夹下images
assets_images = os.path.join(chapter12, 'assets', 'images')
# chapter12文件夹下assets文件夹下sounds
assets_sounds = os.path.join(chapter12, 'assets', 'sounds')


# 定义获取图片对象函数,路径为charter12/assets/images下的图片文件
def images(img):
   return pygame.image.load(os.path.join(assets_images, img))


"""以下为常量"""
# 我方飞机图片,2张
OUR_PLANE1 = images('hero1.png')
OUR_PLANE2 = images('hero2.png')

# 背景图片,准备中和结束时
READY_BG = images('background.png')
OVER_BG = images('game_over.png')

# 飞机大战图片
PLANE_WAR = images('game_title.png')
# 开始按钮
START = images('game_start.png')


# 背景音乐
def BG_MUSIC():
   pygame.mixer.music.load(os.path.join(assets_sounds, 'game_bg_music.mp3'))
   pygame.mixer.music.play(-1)
   pygame.mixer.music.set_volume(0.2)

报错,不知道什么原因,求助
C:\Users\86151\Desktop\Desktop\chapter12\venv\Scripts\python.exe C:/Users/86151/Desktop/Desktop/chapter12/main.py
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
  File "C:/Users/86151/Desktop/Desktop/chapter12/main.py", line 119, in <module>
    WarPlane().main()
  File "C:/Users/86151/Desktop/Desktop/chapter12/main.py", line 81, in main
    self.our_plane.move_right()
  File "C:\Users\86151\Desktop\Desktop\chapter12\game\plane.py", line 48, in move_right
    if self.rect.right > WarPlane().width:
  File "C:\Users\86151\Desktop\Desktop\chapter12\main.py", line 48, in __init__
    self.our_plane = Our_Plane(self.screen, 20)
NameError: name 'Our_Plane' is not defined

Process finished with exit code 1


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学,你好。

1、在飞机向下或向右移动时,使用的方法不对。同学在主程序所在的文件中导入了plane中的Our_Plane,在飞机类中导入了WarPlane()类,造成了循环引用。

应先得到飞机的宽高及游戏窗口的宽和高,当bottom的值大于两者的差值时,将bottom的值重新赋值。向右移动同理。

http://img1.sycdn.imooc.com//climg/5df75a4709d3fcdf06510111.jpg

http://img1.sycdn.imooc.com//climg/5df75a390987fae306080208.jpg


http://img1.sycdn.imooc.com//climg/5df75a39096288db05760181.jpg

2、同学在更新我方飞机位置时,飞机位置始终在左上角位置,位置没有变化

http://img1.sycdn.imooc.com//climg/5df75bc409845ede03700125.jpg

可以在Our_Plane()类中定义update方法,在main()方法中调用即可

http://img1.sycdn.imooc.com//climg/5df75be609e3bd6106610356.jpg

http://img1.sycdn.imooc.com//climg/5df75c1c09ca473e03600203.jpg

3、赋值应该使用"="

http://img1.sycdn.imooc.com//climg/5df75d4d091486db02600191.jpg

建议同学再重新听下"飞机大战项目飞机移动控制"课程,课程中有详细讲解其实现方式。

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

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师