как сбросить бомбу в позицию персонажа в игре pygame - PullRequest
1 голос
/ 28 мая 2020

Я делаю игру на pygame, в которой персонаж в данный момент перемещается по экрану и может покупать предметы в магазине. Я хочу, чтобы персонаж мог сбрасывать бомбы, которые он покупает в магазине в месте нахождения игрока (мне нужно это исправить). Я прилагаю весь свой код вместе со снимками экрана. Любая помощь приветствуется, спасибо.

 import pygame

pygame.font.init()

width = 900
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')
bomb_pic = pygame.transform.scale(pygame.image.load('bomb.png'), (20,20))
# char_rect = char.get_rect()

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

bag = {'bomb': 0}
print(bag["bomb"])
class Button():
    def __init__(self, color, x, y, width, height, text=''):
        self.color = color
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.text = text

    def draw(self, win, outline=None):

        # Call this method to draw the button on the screen
        if outline:
            pygame.draw.rect(win, outline, (self.x - 2, self.y - 2, self.width + 4, self.height + 4), 0)

        pygame.draw.rect(win, self.color, (self.x, self.y, self.width, self.height), 0)

        if self.text != '':
            font = pygame.font.SysFont('comicsans', 20)
            text = font.render(self.text, 1, (0, 0, 0))
            win.blit(text, (
                self.x + (self.width / 2 - text.get_width() / 2), self.y + (self.height / 2 - text.get_height() / 2)))


def shop_run():
    shop_bomb = Button((0, 200, 0), 820, 150, 60, 20, text="Bomb_q")
    bright_green = (0, 255, 0)
    green = (0, 200, 0)
    shop_bomb.draw(screen)


def redrawGameWindow():
    global walkCount
    screen.fill([166, 166, 166])

    pygame.draw.rect(screen, (0, 0, 0), (800, 0, 100, 600))
    if x + char.get_width() < 60 and y + char.get_height() < 60:
        shop_run()

    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


    buy = pygame.key.get_pressed()
    if buy[pygame.K_SPACE] and bag["bomb"] >= 1:
        screen.blit(bomb_pic,(x,y))
    pygame.display.update()


def main():
    run = True
    # shopper()
    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 up

    global walkCount

    global bomb_pic
    while run:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False


            if x + char.get_width() < 60 and y + char.get_height() < 60:
                buy = pygame.key.get_pressed()
                if buy[pygame.K_q]:
                    bag["bomb"] += 1
                    print(bag["bomb"])


        redrawGameWindow()



        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[![enter image description here][1]][1]
            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

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


main()

the red background is the shop

the black box is the bomb which is currently appearing at (0, 0)

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Добавить список для бомб:

bombs = []

Добавить позицию бомбы в список, когда нажата пробел . Используйте событие l oop и событие KEYDOWN для создания бомб, потому что вы хотите драпировать только бомбу при нажатии клавиши, а не несколько бомб, когда она удерживается:

def main():
    global bombs

    while run:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

            if event.type == pygame.KEYDOWN:
                if event.key = pygame.K_SPACE and bag["bomb"] >= 1:
                    bombs.append((x, y))

            # [...]

Нарисуйте бомбы в redrawGameWindow в al oop:

def redrawGameWindow():
    # [...]

    for pos in bombs:
        screen.blit(bomb_pic, pos)
    pygame.display.update()
2 голосов
/ 28 мая 2020

Вы рисуете бомбу только тогда, когда нажимаете клавишу пробела. Вы должны рисовать его непрерывно. Вам необходимо добавить эти три элемента в свой код (а не непосредственно друг за другом, как показано здесь).

# Create a list to keep track on the bombs positions (do this **before** 
# the game loop). Could be a global variable if you want.
bomb_positions = [] 


# Add a bomb when you press space. Do this in the event loop and not with 
# 'pygame.key.get_pressed()', because that will add a new bomb every frame if 
# you hold down the spacebar.
for event in pygame.event.get():
    if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
        bomb_positions.append((x, y)) 


# Draw all the bombs at their position. If the list is empty, nothing will 
# be drawn.
for bomb_position in bomb_positions:
    screen.blit(bomb_pic, bomb_position)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...