python - 如何在pygame中创建子弹?

标签 python pygame

我知道有几个关于此的主题,但我仍然不知道如何让我的船发射子弹。我想在我的 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 方法来提高性能。

关于python - 如何在pygame中创建子弹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21567250/

相关文章:

pygame - 为什么屏幕在 PyGame 中不刷新?

python - 打开和关闭游标和连接的建议做法

c++ - Boost-python 如何将 C++ 类实例传递给 Python 类

python - 在 Github 页面上托管由 Pelican 驱动的博客

python - 使用 cx_Freeze 构建 msi : ValueError: FCI error 1

android - 如何在 android 设备上执行使用 pygame 制作的游戏?

python - 是否可以在浏览器中运行 pygame 或 pyglet ?

python - 对文件中的数据进行 scipy/numpy FFT

Python 3 删除文件字符串的一部分

python - Pygame 组更新不带参数