如何解决Pygame 开始按钮菜单
几天前我开始制作我的第一个专业pygame(之前没有做过任何pygame),所以我第一次制作了主菜单,用于实际游戏,然后是游戏,所以我有2个文件在那个项目中(主菜单和游戏)。 但是几秒钟后我意识到我不知道如何通过单击“开始”按钮从主菜单开始游戏。所以我需要一些帮助......
import pygame
import pygame.freetype
from pygame.sprite import Sprite
from pygame.rect import Rect
from enum import Enum
from pygame.sprite import RenderUpdates
BLUE = (106,159,181)
WHITE = (255,255,255)
def create_surface_with_text(text,font_size,text_rgb,bg_rgb):
""" Returns surface with text written on """
font = pygame.freetype.SysFont("Courier",bold=True)
surface,_ = font.render(text=text,fgcolor=text_rgb,bgcolor=bg_rgb)
return surface.convert_alpha()
class UIElement(Sprite):
""" An user interface element that can be added to a surface """
def __init__(self,center_position,text,bg_rgb,action=None):
"""
Args:
center_position - tuple (x,y)
text - string of text to write
font_size - int
bg_rgb (background colour) - tuple (r,g,b)
text_rgb (text colour) - tuple (r,b)
action - the gamestate change associated with this button
"""
self.mouse_over = False
default_image = create_surface_with_text(
text=text,font_size=font_size,text_rgb=text_rgb,bg_rgb=bg_rgb
)
highlighted_image = create_surface_with_text(
text=text,font_size=font_size * 1.2,bg_rgb=bg_rgb
)
self.images = [default_image,highlighted_image]
self.rects = [
default_image.get_rect(center=center_position),highlighted_image.get_rect(center=center_position),]
self.action = action
super().__init__()
@property
def image(self):
return self.images[1] if self.mouse_over else self.images[0]
@property
def rect(self):
return self.rects[1] if self.mouse_over else self.rects[0]
def update(self,mouse_pos,mouse_up):
""" Updates the mouse_over variable and returns the button's
action value when clicked.
"""
if self.rect.collidepoint(mouse_pos):
self.mouse_over = True
if mouse_up:
return self.action
else:
self.mouse_over = False
def draw(self,surface):
""" Draws element onto a surface """
surface.blit(self.image,self.rect)
class Player:
""" Stores information about a player """
def __init__(self,score=0,lives=3,current_level=1):
self.score = score
self.lives = lives
self.current_level = current_level
def main():
pygame.init()
screen = pygame.display.set_mode((800,600))
game_state = GameState.TITLE
while True:
if game_state == GameState.TITLE:
game_state = title_screen(screen)
if game_state == GameState.NEWGAME:
player = Player()
game_state = play_level(screen,player)
if game_state == GameState.NEXT_LEVEL:
player.current_level += 1
game_state = play_level(screen,player)
if game_state == GameState.QUIT:
pygame.quit()
return
def title_screen(screen):
start_btn = UIElement(
center_position=(400,400),font_size=30,bg_rgb=BLUE,text_rgb=WHITE,text="Start",action=GameState.NEWGAME,)
quit_btn = UIElement(
center_position=(400,500),text="Quit",action=GameState.QUIT,)
buttons = RenderUpdates(start_btn,quit_btn)
return game_loop(screen,buttons)
def play_level(screen,player):
return_btn = UIElement(
center_position=(140,570),font_size=20,text="Return to main menu",action=GameState.TITLE,)
nextlevel_btn = UIElement(
center_position=(400,text=f"Next level ({player.current_level + 1})",action=GameState.NEXT_LEVEL,)
buttons = RenderUpdates(return_btn,nextlevel_btn)
return game_loop(screen,buttons)
def game_loop(screen,buttons):
""" Handles game loop until an action is return by a button in the
buttons sprite renderer.
"""
while True:
mouse_up = False
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.MOUSEBUTTONUP and event.button == 1:
mouse_up = True
screen.fill(BLUE)
for button in buttons:
ui_action = button.update(pygame.mouse.get_pos(),mouse_up)
if ui_action is not None:
return ui_action
buttons.draw(screen)
pygame.display.flip()
class GameState(Enum):
QUIT = -1
TITLE = 0
NEWGAME = 1
NEXT_LEVEL = 2
if __name__ == "__main__":
main()
谢谢你的建议!!!!
解决方法
我有两个想法:
第一: 只需导入它。当您导入它时,它将被执行。
import importlib
importlib.import("name of you file without extension") # i dont know the command
第二: 使用
exec()
exec(open("filename.py").read())
或
with open("file.py","r") as f:
exec(f.read())
ywc
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。