如何创建 pygame "in game menus"



我正在制作一个pygame游戏,目前一个角色在屏幕上移动。我希望角色站在商店顶部时能够购买物品。我希望当角色位于商店顶部时出现类似屏幕的菜单。我还希望游戏的其余部分在后台继续,以防我决定添加一些敌人。shop_items是应该为游戏内菜单运行的函数,显示可用的项目。我在下面提供了整个代码。任何帮助不胜感激,谢谢。

import pygame
pygame.font.init()
width = 800
height = 600
screen = pygame.display.set_mode([width, height])
walkRight = [pygame.image.load('R1.png'), pygame.image.load('R2.png'), pygame.image.load('R3.png'), pygame.image.load('R4.png'), pygame.image.load('R5.png'), pygame.image.load('R6.png'), pygame.image.load('R7.png'), pygame.image.load('R8.png'), pygame.image.load('R9.png')]
walkLeft = [pygame.image.load('L1.png'), pygame.image.load('L2.png'), pygame.image.load('L3.png'), pygame.image.load('L4.png'), pygame.image.load('L5.png'), pygame.image.load('L6.png'), pygame.image.load('L7.png'), pygame.image.load('L8.png'), pygame.image.load('L9.png')]
char = pygame.image.load('standing.png')

x = 50
y = 50
width = 40
height = 60
vel = 5
isJump = False
jumpCount = 10
left = False
right = False
down = False
up = False
walkCount = 0
shop = pygame.transform.scale(pygame.image.load("shop.png"), (60,60))
clock = pygame.time.Clock()
FPS = 60

def shop_items():
if x + char.get_width() < 60 and y + char.get_height() < 60:
screen.fill([0,0,0])
def redrawGameWindow():
global walkCount
screen.fill([166, 166, 166])  
screen.blit(shop, (0,0))
if walkCount + 1 >= 27:
walkCount = 0
if left:  
screen.blit(walkLeft[walkCount//3], (x,y))
walkCount += 1 
elif right:
screen.blit(walkRight[walkCount//3], (x,y))
walkCount += 1
elif down:
screen.blit(char,(x,y))
walkcount = 0
elif up :
screen.blit(char, (x,y))
walkcount = 0
else:
screen.blit(char, (x, y))
walkCount = 0
pygame.display.update() 

def main():
run = True
pygame.display.set_caption("bomb-mania")

global x
global y
global width
global height
global vel
global isJump
global jumpCount
global left
global right
global down
global walkCount    
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and x > vel-15:
x -= vel
left = True
right = False
down = False
up = False

elif keys[pygame.K_RIGHT] and x < 800 - vel - width:
x += vel
left = False
right = True
down = False
up = False
elif keys[pygame.K_DOWN] and y < 600 - height:
y += vel
left = False
right = False
down = True
up = False

elif keys[pygame.K_UP] and y > vel-15:
y -= vel
left = False
right = False
down = False
up = True
else:
left = False
right = False
down = False
up = False
walkCount = 0
if x + char.get_width() < 60 and y + char.get_height() < 60:
# print("reached")
shop_items()

redrawGameWindow()
clock.tick(FPS)
pygame.display.flip()

main()

我假设他们像英雄联盟中那样的东西? :) 你需要在主循环中添加一个函数,如下所示:

shop = False
def toggle_shop():
if player.rect.colliderect(shop.rect) and key_pressed():
if shop:
shop = True
else:
shop = False

def display_shop():
# Run code to display your shop

在您的主循环中,它看起来像这样:

shop = False
main():
toggle_shop()
if shop:
display_shop()
...

在 toggle_shop(( 函数内部,我编写了 I key_pressed(( 函数。如果你需要这方面的帮助,pygame有一个很棒的功能叫做pygame.event: https://www.pygame.org/docs/ref/event.html 使用此行:

events = pygame.event.get()
for event in events:
if event.type == pygame.KEYDOWN:
# Test which key was pressed

希望这有帮助,祝你好运!

在回答后续问题时,请看第四行和第五行:

shop = pygame.transform.scale(pygame.image.load("shop.png"), (60,60))
toggle_shop = False
def toggle_shop():
shop_rect = shop.get_rect()  # This will return a pygame.Rect object
if player.rect.colliderect(shop_rect) and key_pressed():  # Alter this line accordingly- shop_rect rather than shop.rect
if toggle_shop:
toggle_shop = True
else:
toggle_shop = False

还有一点需要注意 - 通常,将变量命名为与函数相同的名称并不是好的做法。也许将"toggle_shop"布尔变量更改为"shop_state"或"shop_active"。

最新更新