python - 为什么我的循环布尔值一直被设置回 True?
问题描述
所以我正在编写一个游戏,这是我第一次使用类。我有一个类,它具有用于背景不同方面的不同字段和用于不同背景的对象。我有一个用于开始屏幕的 while 循环。这可行,但是当我单击播放时,假设将 start 设置为 False 并停止循环,但是当我按下它时,它会设置为 False 一次并直接返回 True 继续循环。我总是使用 print 来查看布尔值是什么。
我在代码顶部定义 start = True
import pygame
import sys
pygame.init()
start = True
screen_width = 900
screen_height = 507
center_x = screen_width/2
center_y = screen_height/2
screen = pygame.display.set_mode((screen_width, screen_height))
clock = pygame.time.Clock()
FPS = 100
WHITE = (255,255,255)
bgx = 0
bgx2 = screen_width
main_bg = pygame.image.load("mainmenu.jpg")
main_bg2 = pygame.image.load("mainmenu.jpg")
first_bg = pygame.image.load("firstlvl.png")
first_bg2 = pygame.image.load("firstlvl.png")
second_bg = pygame.image.load("secondlvl.jpg")
second_bg2 = pygame.image.load("secondlvl.jpg")
third_bg = pygame.image.load("thirdlvl.jpg")
third_bg2 = pygame.image.load("thirdlvl.jpg")
#for i in range(1,7):
#pygame.mixer.music.load("music"+str(i)+".mp3")
class layout:
#""" This class makes the layout of each screen (including buttons, music and background)"""
def __init__(self, background, background2, back_button, pause_button, play_button):
self.bg = background
self.bg2 = background2
self.backbut = back_button
self.pausebut = pause_button
self.playbut = play_button
def create_screen(self):
screen.fill(WHITE)
global bgx, bgx2
bgx -= 3
bgx2 -= 3
screen.blit(self.bg, [bgx,0])
screen.blit(self.bg2, [bgx2,0])
if bgx + screen_width == 0:
bgx = screen_width
elif bgx2 + screen_width == 0:
bgx2 = screen_width
if self.playbut == True:
butimg = pygame.image.load("playbutton.png")
butrect = pygame.Rect(center_x-(358/2),center_y-(146/2),358,146)
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if butrect.collidepoint(event.pos):
start = False
print (start)
screen.blit(butimg,butrect)
if self.backbut == True:
butimg2 = pygame.image.load("backbut.png")
butimg2 = pygame.transform.scale(butimg2, (62, 62))
butrect2 = pygame.Rect(10,screen_height-72,62,62)
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if butrect2.collidepoint(event.pos):
pass
screen.blit(butimg2,butrect2)
if self.pausebut == True:
pass
pygame.display.flip()
main_screen = layout(main_bg, main_bg2, False, False, True)
icon_select = layout(main_bg, main_bg2, True, False, False)
lvl_select = layout(main_bg, main_bg2, True, False, True)
lvl_1 = layout(first_bg, first_bg2, False, True, False)
lvl_2 = layout(second_bg, second_bg2, False, True, False)
lvl_3 = layout(third_bg, third_bg2, False, True, False)
while start:
print (start)
for event in pygame.event.get():
if event.type == pygame.QUIT:
start = False
pygame.quit()
sys.exit()
main_screen.create_screen()
clock.tick(FPS)
pygame.quit()
sys.exit
enter code here
解决方案
在您的函数 create_screen() 中,您需要添加一行global start
告诉 python 解释器该变量是在不同的范围内定义的。
推荐阅读
- javascript - Document.selector.innerHTML 仅在刷新页面后有效
- flutter - Fluttter 作为 Root 页面导航到页面
- amazon-dynamodb - Appsync“批量创建”解析器给出“映射模板”错误
- azure - azure front door - 为什么我们需要向后端池添加多个后端
- android - Pixel 2 设备中的临时文件夹
- node.js - 在 pg-promise 中编写子查询的好方法
- mysql - 单词末尾的未知字符
- jquery - 如何使用 Angular 更新 jquery 代码中的数据绑定?
- php - 如何将php变量放入css
- cypress - Cypress 测试在代码中间停止执行