关于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、在飞机向下或向右移动时,使用的方法不对。同学在主程序所在的文件中导入了plane中的Our_Plane,在飞机类中导入了WarPlane()类,造成了循环引用。
应先得到飞机的宽高及游戏窗口的宽和高,当bottom的值大于两者的差值时,将bottom的值重新赋值。向右移动同理。
2、同学在更新我方飞机位置时,飞机位置始终在左上角位置,位置没有变化
可以在Our_Plane()类中定义update方法,在main()方法中调用即可
3、赋值应该使用"="
建议同学再重新听下"飞机大战项目飞机移动控制"课程,课程中有详细讲解其实现方式。
如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星