如何从本地创建全局变量并存储其先前的值?

2024-04-18

在我的 pygame 游戏中,我希望子弹能够检测到它何时位于给定的命中框中。为此,我需要从本地创建一个全局变量。但是,每次出现新对象时,全局变量都会更新为新的碰撞盒。这不允许我跟踪之前的碰撞箱并检测子弹何时位于屏幕上的旧对象内。我该如何防止这种情况?我应该如何存储 a 的先前值?

这是我定义碰撞盒和对象的其他功能的类。

class Enemy:
    def __init__(self, y, width, height):
        self.width = width
        self.height = height
        self.vel = 1.5
        self.y = y
        self.x = random.randrange(screen_width - 64 * 2)
        self.index = random.choice(number)
        self.hitboxes = [(self.x + 68, self.y + 68, self.width - 10, self.height - 14),
                         (self.x + 38, self.y + 47, self.width + 20, self.height - 5),
                         (self.x + 18, self.y + 12, self.width + 32, self.height + 30),
                         (self.x + 20, self.y + 32, self.width + 16, self.height + 5),
                         (self.x + 4, self.y + 7, self.width - 24, self.height - 31)]  # hitbox list
        self.hitbox = self.hitboxes[self.index]  # selecting hitbox from list  

    def draw(self, win):
        win.blit(asteroids[self.index], (self.x, self.y))
        pygame.draw.rect(win, (255, 0, 0), self.hitbox, 2)

这里是问题所在的主循环(阅读代码中的注释)

asteroids = [pygame.image.load('rock0.png'), pygame.image.load('rock1.png'), pygame.image.load('rock2.png'),
             pygame.image.load('rock3.png'), pygame.image.load('rock4.png')]

number = [0, 1, 2, 3, 4]

asteroids_on_screen = []

rock = Enemy(-140, 64, 64)

run = True
clock = pygame.time.Clock()
while run:
    last = pygame.time.get_ticks()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == my_event_id:
            x = random.randrange(screen_width - 64 * 2)
            index = random.choice(number)
            asteroids_on_screen.append(Enemy(rock.y, rock.width, rock.height))
    global a  # if I define a as a global here I will be able to detect
              # when the bullet is within the hitbox of the 
              # newest added object, since a gets updated for each 
              # object that enters the screen, but not the other ones.
    for a in asteroids_on_screen:
        if -141 < a.y < 500:
            a.y += a.vel
            a.hitbox = (a.hitbox[0], a.hitbox[1] + a.vel, a.hitbox[2], a.hitbox[3])
        else:
            asteroids_on_screen.pop(asteroids_on_screen.index(a))

    for bullet in bullets:
        if bullet.x + bullet.width < a.hitbox[0] + a.hitbox[2] and bullet.x - bullet.width > a.hitbox[0]:
            if bullet.y - bullet.height < a.hitbox[1] + a.hitbox[3] and bullet.y + bullet.height > a.hitbox[1]:
                rock.hit()
                bullets.pop(bullets.index(bullet))
        if 0 < bullet.y < 500:
            bullet.y -= bullet.vel
        else:
            bullets.pop(bullets.index(bullet))

只需使用嵌套循环即可。你必须针对每颗小行星检查每颗子弹:

# move the asteroids
for a in asteroids_on_screen:
    if -141 < a.y < 500:
        a.y += a.vel
        a.hitbox = (a.hitbox[0], a.hitbox[1] + a.vel, a.hitbox[2], a.hitbox[3])
    else:
        asteroids_on_screen.pop(asteroids_on_screen.index(a))

# hit test for each combination of asteroid and bullet
for a in asteroids_on_screen:
    for bullet in bullets:
        if bullet.x + bullet.width < a.hitbox[0] + a.hitbox[2] and bullet.x - bullet.width > a.hitbox[0]:
            if bullet.y - bullet.height < a.hitbox[1] + a.hitbox[3] and bullet.y + bullet.height > a.hitbox[1]:
                rock.hit()
                bullets.pop(bullets.index(bullet))

# move the remaining bullets
for bullet in bullets:
    if 0 < bullet.y < 500:
        bullet.y -= bullet.vel
    else:
        bullets.pop(bullets.index(bullet))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从本地创建全局变量并存储其先前的值? 的相关文章

随机推荐

  • 如何设置 pexpect ssh 会话的列宽?

    我正在编写一个简单的 python 脚本来通过 SSH 连接到 SAN 运行一组命令 最终 每个命令将与时间戳一起记录到单独的日志中 然后退出 这是因为我们连接的设备不支持证书 ssh 连接 并且当前固件版本没有良好的日志记录功能 我似乎遇
  • SAS Do 循环:在循环内使用循环变量来创建滞后变量

    我想创建包含给定变量的滞后值的变量 以实现大量滞后 我怎么能这样做呢 我尝试以下操作 data out set in do i 1 to 50 let j i lag j Lag j x end run 如何获取循环变量i进入宏变量j或者如
  • 在 Python 中使用多处理创建超时函数

    我正在尝试使用多处理库在 Python 2 7 11 在 Windows 上 中创建超时函数 我的基本目标是 如果函数超时 则返回一个值 如果函数未超时 则返回实际值 我的方法如下 from multiprocessing import P
  • 当结果少于scrollSize设置时,Scroll SearchResponse不可迭代

    我有一个这样的循环 while true scrollResp client prepareSearchScroll scrollResp getScrollId setScroll new TimeValue 600000 execute
  • 从 CREATE TABLE SQL 生成图形模式表示

    我有一个包含许多 CREATE TABLE 语句的 sql 文件 没有参考规范 MyISAM 的东西 但我喜欢创建不同的表框 然后手动组成表关系 我正在使用Mac 有免费的程序可以做到这一点吗 是的MySQL工作台 http dev mys
  • 关于堆栈分配,Go 中什么被视为“小”对象?

    代码 func MaxSmallSize a make int64 8191 b make int64 8192 a b 然后运行go build gcflags m 2 gt 1检查内存分配详细信息 结果 mem go 10 can in
  • 处理 read_html 对空网页的错误响应

    尝试抓取网页标题 但在名为 tweg com 的网站上遇到问题 library httr library rvest page url lt tweg com page get lt GET page url from httr pg lt
  • 即使在模拟器上,“adb root”命令也会返回“adbd 无法在生产版本中以 root 身份运行”?

    我正在尝试运行adb root模拟器上的命令 这是我连接的唯一设备 adb devices List of devices attached emulator 5554 device 但是 我收到以下错误消息 adb root adbd c
  • 如何将 Objective C 静态库导入到 Swift Framework 中?

    我正在编写一个动态框架 Proto framework 对于 Swift 中的 OS X 我想包含静态库中的代码 libstat a 这是用 Objective C 编写的 这是我得到的 Dynamic swift in Proto fra
  • Django,访问 PostgreSQL 序列

    在 Django 应用程序中 我需要创建一个订单号 如下所示 yyyymmddnnnn 其中 yyyy 年 mm 月 dd 日 nnnn 是 1 到 9999 之间的数字 我想我可以使用 PostgreSQL 序列 因为生成的数字是原子的
  • 如何取消订阅 C# 中特定类的事件的所有处理程序?

    基本前提 我有一个房间 当头像 进入 房间内的所有头像时 它会发布一个事件 当头像离开房间时 我希望它删除该房间的所有订阅 在将头像添加到新房间并订阅新房间的活动之前 如何才能最好地从房间中的所有活动中取消头像 代码是这样的 class R
  • 什么时候关闭光栅化步骤才有意义?

    在 vulkan 中 有一个创建管道所需的结构 名为VkPipelineRasterizationStateCreateInfo 在这个结构体中有一个名为rasterizerDiscardEnable 如果该成员设置为VK TRUE那么在光
  • 如何在 IE 的新选项卡中显示 PDF 而不下载它

    看来 IE 不允许直接打开 blob 您必须使用 msSaveOrOpenBlob 但有什么办法可以以某种方式将其转换吗 我确实需要将 PDF 显示到 IE 的新选项卡中而不下载它 或者至少用户不应该进行交互并且看不到它被下载到例如系统临时
  • 子集和问题

    最近我对子集和问题感兴趣 即在超集中找到零和子集 我在SO上找到了一些解决方案 此外 我还遇到了一个特定的问题solution http www skorks com 2011 02 algorithms a dropbox challen
  • 在多个子文件夹中搜索文件的VBA宏

    我有宏 如果我放入文件的单元格 E1 名称 则通过 C Users Marek Desktop Makro 目录进行宏搜索 找到它并将所需的值放入带有宏的原始文件的特定单元格中 是否可以在没有特定文件夹位置的情况下完成这项工作 我需要一些可
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • 将集合从后台工作者 DoWork 传递到后台工作者已完成并执行 foreach

    我的目标是 用户在组合框中键入完整或部分计算机名 按钮单击事件启动后台工作人员将计算机名传递给 DoWork 方法 DoWork 方法在 ActiveDirectory 中搜索计算机名并将集合传递给 WorkerCompleted 方法 W
  • 动态IP地址的用户可以被阻止吗?

    现在我正在尝试构建一些东西 我的客户想要阻止某些向 Web 服务发出许多请求的 IP 地址 现在我想知道的是 如果我用动态 IP 地址阻止用户 他不能重置调制解调器并重新开始吗 你是对的 如果IP是动态的 尽管路由器重置可能不会立即改变它
  • sybase @@error 捕获错误的替代方法

    通常我会遇到这样的错误 EXECUTE STATEMENT SELECT ERR CODE ERROR 它处理简单的错误 如下面的查询 ERROR 返回值 insert into tab1 values 1 error attempt to
  • 如何从本地创建全局变量并存储其先前的值?

    在我的 pygame 游戏中 我希望子弹能够检测到它何时位于给定的命中框中 为此 我需要从本地创建一个全局变量 但是 每次出现新对象时 全局变量都会更新为新的碰撞盒 这不允许我跟踪之前的碰撞箱并检测子弹何时位于屏幕上的旧对象内 我该如何防止