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)