как создать pygame "в игровых меню" - PullRequest
0 голосов
/ 28 мая 2020

Я делаю игру на 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()

1 Ответ

1 голос
/ 28 мая 2020

Полагаю, что-то вроде того, что есть в League of Legends? :) Вам нужно добавить функцию в ваш основной l oop, например:

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

В вашем основном l oop это будет выглядеть примерно так:

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

Внутри функции toggle_shop () я написал функцию 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".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...