现在,我正在开发一个包含3个类的小型RPG,并且能够拥有自己的用户名。我的主脚本有问题。问题是,粗体if
语句需要是一个while循环才能添加我的下一个部分,即主菜单。但是,当我尝试使用while关键字时,它会导致游戏停止响应。
提前感谢任何以任何方式提供帮助的人。
这是我的代码:
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
gameDisplay.fill(green)
while User_name == None:
User_name = Username.ask(gameDisplay,"username")
print User_name + "'s run/dio"
if Class_Choice == None:
Choice_wall().paint(gameDisplay)
Class_Choice = Choice_wall().Choice(pygame.mouse.get_pos(
[0],0,pygame.mouse.get_pressed()[0],0,0)
pygame.display.update()
clock.tick(30)
以下是功能:
def Choice(self, c1,c2 , p1,p2,p3):
while p1 == 0:
if 0 <= c1 <= 319 and p1 == 1 :
return "warrior"
elif 320 <= c1 <= 639 and p1 == 1:
return "archer"
elif 640 <= c1 <= 960 and p1 == 1:
return "mage"
def get_key():
while 1:
event = pygame.event.poll()
if event.type == KEYDOWN:
return event.key
else:
pass
def display_box(screen, message):
"Print a message in a box in the middle of the screen"
fontobject = pygame.font.Font(None,18)
pygame.draw.rect(screen, (0,0,0),
((screen.get_width() / 2) - 100,
(screen.get_height() / 2) - 10,
200,20), 0)
pygame.draw.rect(screen, (255,255,255),
((screen.get_width() / 2) - 102,
(screen.get_height() / 2) - 12,
204,24), 1)
if len(message) != 0:
screen.blit(fontobject.render(message, 1, (255,255,255)),
((screen.get_width() / 2) - 100, (screen.get_height() / 2) - 10))
pygame.display.flip()
def ask(screen, question):
"ask(screen, question) -> answer"
pygame.font.init()
current_string = []
display_box(screen, question + ": " + string.join(current_string,""))
while 1:
inkey = get_key()
if inkey == K_BACKSPACE:
current_string = current_string[0:-1]
elif inkey == K_RETURN:
break
elif inkey == K_MINUS:
current_string.append("_")
elif inkey <= 127:
current_string.append(chr(inkey))
display_box(screen, question + ": " + string.join(current_string,""))
return string.join(current_string,"")
答案 0 :(得分:1)
问题几乎可以肯定是Choice_Wall.Choice
方法中的循环:
while p1 == 0:
由于p1
永远不会在循环中发生变化(并且如果满足循环条件它将永远不会返回),如果该条件第一次出现True
,则总是会永远循环叫做。您可能需要将调用移动到循环内的pygame.mouse.get_pos
和pygame.mouse.get_pressed
,以便它有可能以您想要的方式工作。
另一种方法可能是完全删除内部循环,因为调用代码中的if Class_Choice == None
行将导致它在主循环的每次迭代中继续调用Choice
,直到做出选择。< / p>
与无限循环问题无关的一些进一步说明:创建一个Class_Wall
实例只需一次,而不是每个帧需要两次,这也更自然。当然,如果它不包含任何状态(只有一个或多个函数,就像你用于上面的用户名那样),你甚至可能根本不需要一个类。正如另一位用户评论的那样,如果您在代码中遵循更典型的命名约定,例如lowercase_with_underscores
的函数,方法和模块名称(保留CapitalizedNames
),则对其他人的理解非常有帮助。类)。