Съемка нескольких пуль в Pygame - PullRequest
1 голос
/ 17 апреля 2020

Я делаю простую вариацию космических захватчиков, используя pygame. Вот некоторый рабочий код:

import pygame, random, time, tkinter
pygame.init()

def main():
    X = 672
    Y = 500

win = pygame.display.set_mode((X,Y))
pygame.display.set_caption('Space Invaders')



class player(object):
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.lives = 3
        self.vel = 5
        self.points = 0
        self.explosionYN = False
        self.explosionCount = 0
        self.highScore = int(text)
    def explosion(self, win):
        if self.explosionYN:
            win.blit(explosion[self.explosionCount], (self.x-20, self.y-30, 100, 100))
            self.explosionCount += 1
        if not self.explosionYN:
            self.explosionCount = 0
        if self.explosionCount + 1 > 6:
            self.explosionYN = False
            self.explosionCount = 0
    def move(self, win):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.x > -1:
            self.x -= self.vel
        if keys[pygame.K_RIGHT] and self.x < 623:
            self.x += self.vel
        if keys[pygame.K_q]:
            if self.x >= 623:
                self.x = 0
            if self.x < 0:
                self.x = 623

class invader(object):
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 1
    def reset(self, win):
        self.y = 0
        self.x = random.randint(5, (X-35))

class bullet(object):
    def __init__(self, x, y, width, height):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.vel = 0
    def shoot(self, win):
        laser.play(0)
        self.x = ship.x + 22
        self.y = ship.y
        self.vel = 15
    def reset(self, win):
        self.vel = 0
        self.y = 510


ship = player(X//2 - (0.5*52), 435, 52, 52)
alien = invader(random.randint(0,707),0,31,25)
bullet = bullet(750, 510, 5, 7)



while run:
    pygame.time.delay(25)

    alien.y += alien.vel
    bullet.y -= bullet.vel

    if alien.y > 500:
        ship.explosionYN = True
        ship.explosion(win)
        loseLife.play(0)
        if ship.explosionCount+ 1 >= 6:
            win.fill((0,0,0))
            pause()
            ship.lives -= 1
            alien.reset(win)
        elif ship.lives <= 1:
            test()

    if bullet.y <= 0:
        bullet.reset(win)

    alien1 = pygame.draw.rect(win, (0,0,0), (alien.x,alien.y,31,25))
    bullet1 = pygame.draw.rect(win, (0,100,255), (bullet.x, bullet.y, bullet.width, bullet.height))

    if pygame.Rect.colliderect(alien1, bullet1):
        ship.points += 1
        if ship.highScore < ship.points:
            ship.highScore += 1
        bullet.reset(win)
        kill.play(0)
        alien.y = 0
        alien.reset(win)
        alien.vel += 0.5
        ship.vel += 0.25

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

            pygame.quit()
            quit()

    keys = pygame.key.get_pressed()
    ship.move(win)
    if keys[pygame.K_SPACE] or keys[pygame.K_UP]:
        bullet.shoot(win)
    if keys[pygame.K_p]:
        pause()

    drawGame()

main()

Я пропустил некоторый код, который я не считаю релевантным

Проблема в том, что может отображаться только одна пуля на экране одновременно. Поэтому я попробовал это вместо этого.

 if keys[pygame.K_SPACE] or keys[pygame.K_UP]:
        bullet1 = pygame.draw.rect(win, (#stuff))
        bullet.shoot(win)

Но теперь пуля вообще не показывается. Буквально ничего не происходит. Я посмотрел на некоторые другие посты, но, поскольку я новичок в Pygame, я не могу сделать из них голову или хвост. ( Multiple Bullets pygame )

Что такое простой и эффективный способ быть в состоянии показать несколько пуль на Pygame? спасибо.

1 Ответ

1 голос
/ 17 апреля 2020

Типичный способ сделать это - создать список пуль.

bullets = []

Затем при запуске пули вы добавляете ее в список

bullets.append(Bullet(750, 510, 5, 7))

И внутри в то время как l oop, вы будете обновлять и перерисовывать каждую пулю по очереди, используя для l oop, чтобы перебрать каждую пулю

for bullet in bullets:
    bullet.y -= bullet.vel # Move Bullet
    # Draw bullet
    # Check for collision with player/enemy

Это, очевидно, не полный список кода, но, надеюсь, это достаточно, чтобы начать.

Вам также придется создавать список врагов, если вы хотите создать клон космических захватчиков.

Вы можете найти недавно вышедшую книгу "Код классики" из Raspberry Pi Foundation полезна тем, что объясняет, как создавать классические игры c с использованием Pygame. Это бесплатная загрузка (или вы можете купить печатную копию)

Редактировать: Подумайте о том, чтобы следовать руководству по стилю Python PEP-8 и переименовать ваши классы в заглавные буквы. Например,

class bullet():

должно быть

class Bullet():

Это поможет при любой путанице между переменной bullet и классом с тем же именем.

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