Events 键盘事件-Pygame

Events 键盘事件-Pygame,events,python-3.x,keyboard,pygame,Events,Python 3.x,Keyboard,Pygame,有人知道我怎样才能做到只有按下空格键,我的代码才能发射子弹吗?现在,任何一个键都会让我的角色射出子弹,但如果可能的话,我想更改它,以下是我目前的代码: import pygame, sys, random pygame.init() screen_width = 800 screen_height = 600 screen = pygame.display.set_mode([screen_width, screen_height]) all_sprites_list = pygame.sp

有人知道我怎样才能做到只有按下空格键,我的代码才能发射子弹吗?现在,任何一个键都会让我的角色射出子弹,但如果可能的话,我想更改它,以下是我目前的代码:

import pygame, sys, random

pygame.init()

screen_width = 800
screen_height = 600
screen = pygame.display.set_mode([screen_width, screen_height])
all_sprites_list = pygame.sprite.Group()
block_list = pygame.sprite.Group()
bullet_list = pygame.sprite.Group()
BLACK    = (   0,   0,   0)
WHITE    = ( 255, 255, 255)
background = pygame.image.load('space.jpg')
pygame.display.set_caption("Alien Invasion!")
explosion = pygame.mixer.Sound('explosion.wav')
score = 0

class Block(pygame.sprite.Sprite):
    def __init__(self, color):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load("spaceship.png")
        self.rect = self.image.get_rect()

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.x=0
        self.y=0
        self.image = pygame.image.load("alien.png")
        self.rect = self.image.get_rect()

    def update(self):

        pos = pygame.mouse.get_pos()
        self.rect.x = pos[0]

    def render(self):

        if (self.currentImage==0):
            screen.blit(self.image, (self.x, self.y))

class Bullet(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("bullet.png")
        self.rect = self.image.get_rect()

    def update(self):

        self.rect.y -= 3

for i in range(30):
    block = Block(BLACK)
    block.rect.x = random.randrange(screen_width)
    block.rect.y = random.randrange(330)
    block_list.add(block)
    all_sprites_list.add(block)

player = Player()

all_sprites_list.add(player)

done = False

clock = pygame.time.Clock()

player.rect.y = 480

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

        elif event.type == pygame.KEYDOWN:
            bullet = Bullet()
            bullet.rect.x = player.rect.x
            bullet.rect.y = player.rect.y
            all_sprites_list.add(bullet)
            bullet_list.add(bullet)

    all_sprites_list.update()

    for bullet in bullet_list:

        block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True)

        for block in block_hit_list:
            explosion.play()
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)
            score += 10

        if bullet.rect.y < -10:
            bullet_list.remove(bullet)
            all_sprites_list.remove(bullet)

    font = pygame.font.Font(None, 36)
    text = font.render("Score: " + str(score), True, WHITE)
    textpos = text.get_rect(centerx=screen.get_width()/12)

    screen.blit(background, (0,0))

    screen.blit(text, textpos)

    all_sprites_list.draw(screen)

    pygame.display.update()

    clock.tick(80)

pygame.quit()

然而,由于某些原因,它似乎无法正常工作:(我是python新手,因此非常感谢您的帮助!

对!所以,首先要做的事情

要通过按空格键发射子弹,您需要添加以下内容:

elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
    bullet = Bullet()
    bullet.rect.x = player.rect.x
    bullet.rect.y = player.rect.y
    all_sprites_list.add(bullet)
    bullet_list.add(bullet)    
上述解决方案将通过按空格键生成子弹

如果您想通过按空格键发射一颗子弹,则需要 创建一个
k_空间
变量,该变量将在上述事件中设置为
True
,并在循环结束时设置为
False

因此,要执行上述操作,您必须更改一些内容:)

您可以将其更改为:

if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
    done = True
这将安全地退出您的程序:)

希望有帮助

干杯

亚历克斯

(编辑)

好吧!只需将两个退出事件分开,就可以顺利进行:)

最后:)如果你想让子弹正好从飞船的中央发射, 只需在k_空间检查中添加以下代码:

    if k_space:
        bullet = Bullet()
        bullet.rect.x = player.rect.center[0] - bullet.rect.width/2
        bullet.rect.y = player.rect.center[1] - bullet.rect.height/2
        all_sprites_list.add(bullet)
        bullet_list.add(bullet)
呸!希望这有助于配偶:)


干杯

对!所以首先要做的事

要通过按空格键发射子弹,您需要添加以下内容:

elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
    bullet = Bullet()
    bullet.rect.x = player.rect.x
    bullet.rect.y = player.rect.y
    all_sprites_list.add(bullet)
    bullet_list.add(bullet)    
上述解决方案将通过按空格键生成子弹

如果您想通过按空格键发射一颗子弹,则需要 创建一个
k_空间
变量,该变量将在上述事件中设置为
True
,并在循环结束时设置为
False

因此,要执行上述操作,您必须更改一些内容:)

您可以将其更改为:

if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
    done = True
这将安全地退出您的程序:)

希望有帮助

干杯

亚历克斯

(编辑)

好吧!只需将两个退出事件分开,就可以顺利进行:)

最后:)如果你想让子弹正好从飞船的中央发射, 只需在k_空间检查中添加以下代码:

    if k_space:
        bullet = Bullet()
        bullet.rect.x = player.rect.center[0] - bullet.rect.width/2
        bullet.rect.y = player.rect.center[1] - bullet.rect.height/2
        all_sprites_list.add(bullet)
        bullet_list.add(bullet)
呸!希望这有助于配偶:)


干杯

哇!非常感谢您的回复@Alex,我应用了您所有的更改,并按照您所说的那样工作,但有一件愚蠢的事情,我忘了提到我希望通过退出键和点击右上角的x来关闭窗口?这可能吗?另外,目前子弹没有从我的玩家精灵的中间位置退出,而是从左侧发射,有什么办法可以改变吗?如果没有,非常感谢,我真诚地感谢您的反馈:)嗯,我遵循了您的更新建议,但现在当我运行它时,一个黑色窗口会弹出一小段时间,然后立即关闭?:(知道为什么会发生这种情况吗?我可能犯了一个错误,下面是我的更新代码:再次感谢您的回复@Alex!使用
k_space
标志不会改变任何事情。无论您是在
for
循环中还是在它之后创建
Bullet
实例。哇!非常感谢您的回复。)y@Alex,我应用了你所有的更改,它按照你说的那样工作,但有一件愚蠢的事,我忘了提到我希望通过退出键和点击右上角的x来关闭窗口?这可能吗?而且,目前子弹没有从我的玩家精灵的中心位置退出,而是从左侧发射,我有什么办法可以改变这一点吗?如果没有,非常感谢,我真诚地感谢你的反馈:)嗯,我遵循了你的更新建议,但现在当我运行它时,一个黑色窗口会弹出一小段时间,然后立即关闭?:(知道为什么会发生这种情况吗?我可能犯了一个错误,下面是我的更新代码:再次感谢您的回复@Alex!使用
k_space
标志不会改变任何事情。无论您是在
for
循环中还是之后创建
Bullet
实例。
    if k_space:
        bullet = Bullet()
        bullet.rect.x = player.rect.center[0] - bullet.rect.width/2
        bullet.rect.y = player.rect.center[1] - bullet.rect.height/2
        all_sprites_list.add(bullet)
        bullet_list.add(bullet)