首页 > 解决方案 > 当我在pygame中不按住空格键时,如何制作连续移动的子弹?

问题描述

import pygame
# initialize the pygame
pygame.init()

# create the screen
screen = pygame.display.set_mode((800, 600))

# Title and icon
pygame.display.set_caption("Space Invaders")
icon = pygame.image.load('Invader2.xcf')
pygame.display.set_icon(icon)

# Player
playerImg = pygame.image.load('Player.xcf')
player_big = pygame.transform.scale(playerImg, (48, 48))
playerX = 370
playerY = 480
vel = 0.15

# Player Bullets
playerBulletImg = pygame.image.load('Player_bullet.xcf')
playerBulletX = playerX + 16
playerBulletY = playerY + 10
bulletVel = 0.3


def player(x, y):
    screen.blit(player_big, (playerX, playerY))


def bullet(x, y):
    screen.blit(playerBulletImg, (playerBulletX, playerBulletY))


# Game Loop
running = True


while running:

    # RGB
    screen.fill((18.8, 83.5, 78.4))

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

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT] and playerX > 0:
        playerX -= vel
        playerBulletX -= vel
    if keys[pygame.K_RIGHT] and playerX < 800 - 48:
        playerX += vel
        playerBulletX += vel
    if keys[pygame.K_SPACE]:
        playerBulletY -= 0.5
    if playerBulletY == 0:
        playerBulletY = 480
    bullet(playerBulletX, playerBulletY)
    player(playerX, playerY)

    pygame.display.update()

你好!我是一个刚开始使用 Pygame 的初学者。我正在制作 Space Invaders / Galaga 类型的游戏。当我按下空格键时,子弹会沿着 y 轴上升,但只有当我按住它时。我希望子弹继续向上移动屏幕,即使我没有按住空格键。此外,另一个问题是,当子弹在空中时,它仍然遵循玩家的 x 值。因此,当子弹射出时,它会根据玩家所在的位置四处移动。

标签: pythonpygame

解决方案


你应该将你的游戏作为一个类运行它更容易用你可以改变你的 b.move 到其他地方的类来编写 pygame

import pygame
# initialize the pygame
pygame.init()

# create the screen
screen = pygame.display.set_mode((800, 600))

# Title and icon
pygame.display.set_caption("Space Invaders")
icon = pygame.image.load('Invader2.xcf')
pygame.display.set_icon(icon)

# Player

class Player:
    def __init__(self):
        self.Img = pygame.image.load('Player.xcf')
        self.big = pygame.transform.scale(playerImg, (48, 48))
        self.x = 370
        self.y = 480
        self.vel = 0.15
    
    def draw(self,screen):
        screen.blit(self.big, (self.x, self.y))


class Bullet:
    def __init__(self):
        self.Img = pygame.image.load('Player_bullet.xcf')
        self.x = playerX + 16
        self.y = playerY + 10
        self.vel = 0.3

    def draw(screen):
        screen.blit(self.Img, (self.y, self.y))

    def move():
        self.y -= self.vel

def draw(p,b):
    p.draw()
    for i in b:
        i.draw()

# Game Loop


def main():
    running = True
    p = Player()
    b = []
    while running:
        screen.fill((18.8, 83.5, 78.4))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        keys = pygame.key.get_pressed()

        if keys[pygame.K_LEFT] and p.x > 0:
            p.x -= p.vel
        if keys[pygame.K_RIGHT] and p.x < 800 - 48:
            p.x += p.vel
        if keys[pygame.K_SPACE]:
           b.append(Bullet())
        draw(p,b)
        for bullet in b:
             bullet.move()

        pygame.display.update()

推荐阅读