如何解决你如何删除pygame中的不同场景?
难度屏幕:
import pygame
pygame.init()
import pygame.freetype
import random
X = 1275
Y = 775
green = (50,205,50)
blue = (0,205)
screen = pygame.display.set_mode((X,Y))
font100 = pygame.font.SysFont(None,100)
class SimpleScene:
FONT = None
def __init__(self,next_scene,*text):
self.background = pygame.Surface((1275,775))
self.background.fill(pygame.Color('white'))
y = 200
if text:
if SimpleScene.FONT == None:
SimpleScene.FONT = pygame.freetype.SysFont(None,32)
for line in text:
SimpleScene.FONT.render_to(self.background,(220,y),line,pygame.Color('black'))
SimpleScene.FONT.render_to(self.background,y - 1),pygame.Color('black'))
y += 50
self.next_scene = next_scene
self.additional_text = None
def start(self,text):
self.additional_text = text
def draw(self,screen):
screen.blit(self.background,(0,0))
if self.additional_text:
y = 180
for line in self.additional_text:
SimpleScene.FONT.render_to(screen,(120,pygame.Color('black'))
SimpleScene.FONT.render_to(screen,(119,pygame.Color('white'))
y += 50
def update(self,events,dt):
for event in events:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
return (self.next_scene,None)
class GameState:
def __init__(self,difficulty):
self.difficulty = difficulty
def pop_question(self):
q = self.questions[0]
self.current_question = q
return q
class SettingScene:
def __init__(self):
self.background = pygame.Surface((1275,775))
self.background.fill(pygame.Color('white'))
if SimpleScene.FONT == None:
SimpleScene.FONT = pygame.freetype.SysFont(None,32)
SimpleScene.FONT.render_to(self.background,50),'Select your difficulty level',pygame.Color('black'))
SimpleScene.FONT.render_to(self.background,49),pygame.Color('black'))
self.rects = []
# CHANGE
for n in range(4):
rect = pygame.Rect(50,(n * 70) + 100,500,50)
self.rects.append(rect)
def start(self,*args):
pass
def draw(self,0))
n = 1
for rect in self.rects:
if rect.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(screen,pygame.Color('darkgrey'),rect)
pygame.draw.rect(screen,rect,5)
# CHANGE
SimpleScene.FONT.render_to(screen,(rect.x + 30,rect.y + 15),str(n),pygame.Color('black'))
SimpleScene.FONT.render_to(screen,(rect.x + 29,rect.y + 14),pygame.Color('black'))
n += 1
def update(self,dt):
for event in events:
if event.type == pygame.MOUSEBUTTONDOWN:
n = 1
for rect in self.rects:
if rect.collidepoint(event.pos):
return ('GAME',GameState(n))
n += 1
class GameScene:
def __init__(self):
if SimpleScene.FONT == None:
SimpleScene.FONT = pygame.freetype.SysFont(None,32)
self.rects = []
for n in range(4):
rect = pygame.Rect(420,(n * 70) + 300,gamestate):
self.background = pygame.Surface((1275,775))
self.background.fill(pygame.Color('white'))
def draw(self,0))
n = 0
for rect in self.rects:
if rect.collidepoint(pygame.mouse.get_pos()):
pygame.draw.rect(screen,5)
def update(self,dt):
for event in events:
if event.type == pygame.MOUSEBUTTONDOWN:
n = 1
for rect in self.rects:
if rect.collidepoint(event.pos):
self.gamestate.answer(n)
class QuitScene:
def __init__(self):
if SimpleScene.FONT == None:
SimpleScene.FONT = pygame.freetype.SysFont(None,32)
def start(self,775))
self.background.fill(pygame.Color('white'))
self.gamestate = gamestate
def draw(self,0))
def update(self,dt):
for event in events:
if event.type == pygame.MOUSEBUTTONDOWN:
quit()
def main():
pygame.init()
screen = pygame.display.set_mode((1275,775))
clock = pygame.time.Clock()
dt = 0
scenes = {
'TITLE': SimpleScene('SETTING','You have chosen category 1: Introduction to Programming ','','press [SPACE] to start'),'SETTING': SettingScene(),'GAME': GameScene(),'QUIT': QuitScene(),}
scene = scenes['TITLE']
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
game = scene.update(events,dt)
if game:
next_scene,state = game
if next_scene:
scene = scenes[next_scene]
scene.start(state)
scene.draw(screen)
pygame.display.flip()
dt = clock.tick(60)
if __name__ == '__main__':
main()
如果有删除此场景的任何解决方案,请分享。我尝试了可能删除部分代码的方法,但没有任何效果。谢谢。
解决方法
要“移除”旧屏幕,您必须用一种颜色填充整个屏幕。 Pygame
就是这样处理的,当您在每个屏幕的每个 self.background.fill(pygame.Color('white'))
方法上调用 start
时,您已经在这样做了。
因此,在绘制新屏幕之前,您必须使用函数 Surface.fill(在您的示例中,self.background
被初始化为 Surface:self.background = pygame.Surface((1275,775))
)。
其他屏幕不会在当前屏幕的背景中,因为 Pygame 只会绘制您当前看到的屏幕。
,通常在 python 中,您可以使用 arm64_v8a
取消对变量的签名,至少在我使用的版本中可以,在 pygame 中执行此操作。可能会弄乱一些内部值,但您可以通过退出然后重新启动显示模块来解决此问题。
我不确定这是否可行,但这是我会尝试的方法。
实际上,我会尝试找到一种方法来在一个窗口中执行我想要的操作,但是您可能有充分的理由想要一个新窗口。 抱歉,如果我误解了您的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。