我知道有几个关于此的主题,但我仍然不知道如何让我的船发射子弹。我想在我的 MOUSEBUTTONDOWN 中添加从船上发射的子弹,同时播放音效。感谢您的帮助!
import sys, pygame, pygame.mixer
from pygame.locals import *
pygame.init()
size = width, height = 800, 600
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()
background = pygame.image.load("bg.png")
ship = pygame.image.load("ship.png")
ship = pygame.transform.scale(ship,(64,64))
shot = pygame.mixer.Sound("shot.wav")
soundin = pygame.mixer.Sound("sound.wav")
soundin.play()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
shot.play()
clock.tick(60)
mx,my = pygame.mouse.get_pos()
screen.blit(background,(0,0))
screen.blit(ship,(mx-32,500))
pygame.display.flip()
要做到这一点,您必须完成几个步骤。您将需要子弹的图片、存储子弹位置的方法、创建子弹的方法、渲染子弹的方法以及更新子弹的方法。您似乎已经知道如何导入图片,所以我将跳过该部分。
您可以通过多种方式存储信息。我将使用项目符号左上角的列表。使用 bullets = []
在最终循环之前的任意位置创建列表。
要创建项目符号,您需要使用鼠标的位置。在shot.play()
后添加bullets.append([event.pos[0]-32, 500])
,缩进等量。
要渲染子弹,您需要在游戏循环中添加一个 for 循环。在 screen.blit(background, (0, 0))
行之后,添加以下代码:
for bullet in bullets:
screen.blit(bulletpicture, pygame.Rect(bullet[0], bullet[1], 0, 0)
要更新子弹,您需要在游戏循环中的某处放置一些内容,如下所示:
for b in range(len(bullets)):
bullets[b][0] -= 10
最后,当子弹到达屏幕顶部时,您需要将其移除。在您刚刚创建的 for 循环之后添加它(迭代切片副本,因为在迭代期间不应修改列表):
for bullet in bullets[:]:
if bullet[0] < 0:
bullets.remove(bullet)
将这些全部放入您的代码后,它应该看起来像这样:
import sys, pygame, pygame.mixer
from pygame.locals import *
pygame.init()
size = width, height = 800, 600
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()
bullets = []
background = pygame.image.load("bg.png").convert()
ship = pygame.image.load("ship.png").convert_alpha()
ship = pygame.transform.scale(ship, (64, 64))
bulletpicture = pygame.image.load("You know what to do").convert_alpha()
shot = pygame.mixer.Sound("shot.wav")
soundin = pygame.mixer.Sound("sound.wav")
soundin.play()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
shot.play()
bullets.append([event.pos[0]-32, 500])
clock.tick(60)
mx, my = pygame.mouse.get_pos()
for b in range(len(bullets)):
bullets[b][0] -= 10
# Iterate over a slice copy if you want to mutate a list.
for bullet in bullets[:]:
if bullet[0] < 0:
bullets.remove(bullet)
screen.blit(background, (0, 0))
for bullet in bullets:
screen.blit(bulletpicture, pygame.Rect(bullet[0], bullet[1], 0, 0))
screen.blit(ship, (mx-32, 500))
pygame.display.flip()
如果您和我都正确地完成了所有操作,那么这应该会给您带来功能性子弹。如果您不明白发生了什么或者有什么不对,请不要犹豫,尽管问我任何问题。
请注意,images/pygame.Surfaces 应使用 convert
进行转换或 convert_alpha
方法来提高性能。