微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

你如何删除pygame中的不同场景?

如何解决你如何删除pygame中的不同场景?

对于我的程序,我正在尝试创建一个多项选择游戏。

我想删除代码中的一个场景。这包括难度屏幕。

难度屏幕:

enter image description here

下面显示了我的代码的相关部分。

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 举报,一经查实,本站将立刻删除。