在Pygame中射击多发子弹

DJ_

我使用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上显示多个子弹的简单有效方法是什么?谢谢。

scotty3785

完成此操作的典型方法是创建项目符号列表。

bullets = []

然后,当您发射子弹时,将其添加到列表中

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

在while循环中,您将使用for循环依次更新和重绘每个项目符号,以迭代每个项目符号

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

显然这不是完整的代码清单,但希望它足以使您入门。

如果您想创建一个太空入侵者克隆,您最终还必须创建一个敌人列表。

您可能会发现Raspberry Pi Foundation发行的新书“ Code the Classics”很有帮助,因为它解释了如何使用Pygame创建一些经典游戏。它是免费下载(或您可以购买印刷版)

编辑:考虑遵循Python样式指南PEP-8,并将类重命名为标题大小写。例如

class bullet():

应该

class Bullet():

这将有助于避免变量bullet和同名类之间的混淆

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章