如何在pygame中创建子弹? [复制]

2024-02-24

我知道有几个关于此的主题,但我仍然不知道如何让我的船发射子弹。我想添加到我的 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 = [].

要创建项目符号,您需要使用鼠标的位置。加入bullets.append([event.pos[0]-32, 500]) after shot.play(),缩进相同的数量。

要渲染子弹,您将在游戏循环中添加一个 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 http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert or convert_alpha提高性能的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在pygame中创建子弹? [复制] 的相关文章

随机推荐

  • 构建 VLC 时需要 NDKv8b 或更高版本

    我已经在 android 中构建了 VLC 并使用代码实现 jack export ANDROID SDK android sdk jack export ANDROID NDK android ndk r9d jack export PA
  • 设置 UITableViewCell 的动态高度,其中仅包含图像(可变高度)

    我有一个 UITableView 其单元格仅包含可变高度的图像 我根据图像动态设置行高 它不能完美工作 滚动时的图像有时会重叠 这是代码 NSInteger numberOfSectionsInTableView UITableView t
  • Symfony2 中的路由

    如何在 Symfony2 中设置默认路由 在 Symfony1 中它看起来像这样 homepage url param module default action index default symfony url symfony acti
  • 是什么阻止我在我的开发盒上专门使用 IIS Express?

    我只阅读了一些有关 IIS Express 的内容 并且正在阅读并立即安装 看来我应该能够正确卸载 IIS 并在 Visual Studio 2010 SP1 中开发 调试基于 Web 服务器的技术时使用 IIS Express 这是一个明
  • Facebook 不从 og:image 加载图像

    它已经可以工作了 但今天我很惊讶 当我尝试分享链接时 Facebook 没有显示来自 og image 元标记的图像 from 脸书调试器 http developers facebook com tools debug og object
  • 使用 Google 脚本永久删除我的电子邮件的脚本

    Gmail Users Messages remove userId id 是如何工作的 电子邮件的 ID 是什么 永久删除电子邮件的正确功能是什么 就我而言 我想立即明确地删除所有已发送的电子邮件 这是我从某人那里获取的一些代码 只是带有
  • Python 和“re”

    我在 python 中关于 Regex 的教程解释了如何在 python 中使用 re 模块 我想从 A 标签中获取 URL 因此知道 Regex 我编写了正确的表达式 并在我选择的正则表达式测试应用程序中对其进行了测试并确保它工作了 当放
  • 如何在 OSX Catalina (10.15) 中使用 Wireshark 捕获 USB 流量

    我正在尝试让 Wireshark USB 捕获工作 显然 Catalina 之前的技巧就是调出界面 以便 Wireshark 可以看到它 https forums developer apple com thread 95380 https
  • ggplot2 具有多个参数的绘图函数

    我得到了这个功能 change lt function score d k p k score 1 1 k d p 我想在一个图中绘制该函数对于一系列参数 d 和 p 的所有结果 在 r 基数中 就是这样 parameters lt c 1
  • Django:如何重定向到表单起源的页面

    在我的 Django 应用程序中 我有多个页面显示一个链接 该链接加载一个显示表单的新页面 提交表单后 重定向到访问该表单的原始页面的最简洁方法是什么 原始页面 gt 表单页面 gt 原始页面 使用下一个变量似乎不太优雅 因为我必须将其设置
  • 证书基本约束的路径长度

    对于 CA 类型的基本约束 路径长度为 0 和 None 是否相同 澄清一下 路径长度为 0 是否意味着 CA 不能颁发证书 而路径长度为 none 是否意味着它可以颁发无限数量的证书 取自RFC 5280 https www rfc ed
  • 为什么人们在 PHP 框架中使用单例

    好吧 伙计们 我很难理解为什么需要单例 让我们举一个真实的例子 我有一个 CMS 框架我需要一个记录一些信息的类 让我们继续使用 PHP Example class Logger private logs array public func
  • 插入特定行数

    我正在尝试插入特定数量的行 现在我正在使用下面的代码插入 4 行 我正在尝试编写一行代码 该代码将根据特定单元格中的数字插入特定数字或行 例如 如果我想插入 4 行 并且单元格 A2 是我可以更改要添加的行数的单元格 那么我将使用什么代码根
  • ld:找不到 -lgcc_s.10.5 Xcode 的库

    ld library not found for lgcc s 10 5 collect2 ld returned 1 exit status Command Developer Platforms iPhoneSimulator plat
  • 为什么消费者在使用 Java 客户端 API 在 DC/OS 上消费来自 Kafka 的消息时会挂起?

    我在 AWS 上的 DC OS Mesos 集群上安装了 Kafka 启用三个代理并创建一个名为 topic1 的主题 dcos kafka topic create topic1 partitions 3 replication 3 然后
  • 从 ES6 map() 函数返回多个值

    假设我有这样的事情 let values 1 2 3 4 let newValues values map v gt return v v console log newValues 1 4 9 16 非常简单 现在 如果我想为每个对象返回
  • 如何使用 useEffect 设置参数并避免无限渲染?

    我在用着react navigation我有一个动态标题 所以我使用setParams并将其放在标题中 const MyComponent navigation gt useEffect gt const setParams state n
  • 为什么属性名称不能是 Python 关键字?

    Python 中对属性访问的语法有限制 至少在 CPython 2 7 2 实现中 gt gt gt class C object pass gt gt gt o C gt gt gt o x 123 Works gt gt gt o if
  • 如何对列表中第一个值相同的元组求和?

    我有一个元组形式的股票和头寸列表 正值表示买入 负值表示卖出 例子 p AAPL 50 AAPL 50 RY 100 RY 43 如何对股票头寸求和以获得当前持有量 result AAPL 0 RY 57 这个怎么样 您可以阅读有关coll
  • 如何在pygame中创建子弹? [复制]

    这个问题在这里已经有答案了 我知道有几个关于此的主题 但我仍然不知道如何让我的船发射子弹 我想添加到我的 MOUSEBUTTONDOWN 中 当音效播放时 从船上发射子弹 谢谢您的帮助 import sys pygame pygame mi