有几个步骤需要完成。您需要一张子弹的图片,一种存储子弹位置的方法,一种创建子弹的方法,一种呈现子弹的方法和一种更新子弹的方法。您似乎已经知道如何导入图片,因此我将跳过该部分。
有几种存储信息的方式。我将使用一个列表来存储子弹左上角的位置。在最终循环之前的任何位置创建列表,使用
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
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()
如果你和我都做得正确,这应该会给你带来有效的子弹。如果你不明白发生了什么或某些东西不起作用,请随时向我提问。
注意,图像/pygame.Surfaces 应使用
convert
或
convert_alpha
方法进行转换以提高性能。
bullets[b][0]-=10
更改为bullets[b][1]-=10
。请注意,您可以将-=更改为+=以使其飞向不同的方向,并且可以更改10以更改速度。在那行代码之后的for循环中,if语句将根据刚才讨论的内容进行更改。[0]应更改为在前一行的[b]之后的任何内容,并且仅在使用-=时应使用<。否则,请使用>。 - ThisIsAQuestionbullets.append([event.pos[0]-32, 500])
中,-32 是不必要的。将其删除后,子弹会在飞船中心而不是边缘创建。只是想让你知道。 - ThisIsAQuestionif bullet[0]<0:
中,如果你改变了 y 坐标,< 变成了 >,0 变成了屏幕在子弹移动维度上的尺寸,你已经将 [0] 改为 [1] 了吗?如果你已经这样做了但仍然无法正常工作,请将 for 循环中的所有新代码发送给我,我会帮你查看。 - ThisIsAQuestionfor bullet in bullets[:]:
。 - skrx