如何使用群组碰撞?

2023-12-06

所以我一直想知道如何使用 pygame groupcollide。我现在完全被难住了。因为我使用的是 collide_rect ,所以没问题。但对于 groupcollide 我似乎无法弄清楚如何调用该组内项目的属性。我不能进行碰撞,因为会有很多子弹。

def check_blast_collisions(player,bullet):
    hits = pg.sprite.groupcollide(player,bullet,False,True)
    for hit in hits:
        print (hits)
        if hit.vx == 20:
            player.vx += 40
        elif hit.vx == -20:
            player.vx += -40

这是我尝试使用 groupcollide 的片段。 我完成这个功能后,项目符号甚至不显示。 (子弹应该被称为爆炸,但我在这个函数中忘记了它。)

import pygame as pg

#settings

CAPTION = "Knockback Arena"
resolution = 1600,900
WIDTH = resolution[0]
HEIGHT = resolution[1]
FPS = 60

player_jump_height = 30
player_max_fall_speed = 30
player_fall_speed_increase = 2
player_lives = 5

shoot_cooldown = 500

#initialize pygame
pg.init()
pg.mixer.init()
pg.font.init
screen = pg.display.set_mode(resolution)
pg.display.set_caption(CAPTION)
clock = pg.time.Clock()

#sprites
class Platform(pg.sprite.Sprite):
    def __init__(self,x,y,width,height,r,g,b):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((width,height))
        self.image.fill((r,g,b))
        self.rect = self.image.get_rect()
        self.rect.center = (x,y)

class Player(pg.sprite.Sprite):
    def __init__(self,r,g,b,x,y):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((40, 100))
        self.image.fill((r,g,b))
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.startx = x
        self.starty = y
        self.vx = 0
        self.vy = 5
        self.vy_max = player_max_fall_speed
        self.vy_increase = player_fall_speed_increase
        self.lives = player_lives
        self.last_shot = 0
        self.facing_right = False
        self.facing_left = False

    def update(self):
        self.rect.x += self.vx
        self.rect.y += self.vy
        if self.vy >= self.vy_max:
            self.vy = self.vy_max
            self.vy_increase = 0
        if self.vy < self.vy_max:
            self.vy_increase = player_fall_speed_increase
        if self.rect.bottom < HEIGHT:
            self.vy += self.vy_increase
        if self.rect.top >= HEIGHT:
            self.rect.x = self.startx
            self.rect.y = self.starty
            self.lives -= 1
            if self.lives <= 0:
                self.kill()
        if self.rect.right >= WIDTH:
            self.rect.right = WIDTH
            self.vx = 0
        if self.rect.left <= 0:
            self.rect.left = 0
            self.vx = 0

    def jump(self):
        if self.rect.bottom >= main_platform.rect.top:
            self.vy -= player_jump_height
        if self.rect.bottom >= HEIGHT:
            self.vy -= player_jump_height

    def shoot(self):
        if pg.time.get_ticks() - self.last_shot >= shoot_cooldown:
            if self.facing_left == True:
                return "shoot_left"
            elif self.facing_right == True:
                return "shoot_right"
        else:
            return "cd_not_done"

class Blast(pg.sprite.Sprite):
    def __init__(self,player,direction):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((20,10))
        self.image.fill((0,255,255))
        self.rect = self.image.get_rect()
        self.rect.center = (player.rect.center)
        self.direction = direction
        if self.direction == 0:
            self.vx = -20
        elif self.direction == 1:
            self.vx = 20
    def update(self):
        self.rect.x += self.vx
        if self.rect.right < 0:
            self.kill()
        if self.rect.left > WIDTH:
            self.kill()

#functions
def check_for_collisions(player,platform):
    hits = pg.sprite.collide_rect(player,platform)
    if hits:
        if hits and player.vy > 0:
            player.rect.bottom = platform.rect.top
            player.vy = 0

def check_blast_collisions(player,bullet):
    hits = pg.sprite.groupcollide(player,bullet,False,True)
    for hit in hits:
        print (hits)
        if hit.vx == 20:
            player.vx += 40
        elif hit.vx == -20:
            player.vx += -40

font = pg.font.Font('font/Roboto-Light.ttf', 30)

all_sprites = pg.sprite.Group()
players = pg.sprite.Group()
platforms = pg.sprite.Group()
blasts = pg.sprite.Group()

main_platform = Platform(WIDTH/2,650,1000,100,0,200,0)
player_1 = Player(0,0,255,WIDTH/2 + -100,200)
player_2 = Player(255,0,0,WIDTH/2 + 100,200)

platforms.add(main_platform)
players.add(player_1)
players.add(player_2)
all_sprites.add(player_1)
all_sprites.add(player_2)
all_sprites.add(main_platform)

menu = True
run = True
while run:
    #check for closing window
    for event in pg.event.get():
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_w:
                player_1.jump()
            if event.key == pg.K_a:
                player_1.vx = -10
                player_1.facing_left = True
                player_1.facing_right = False
            elif event.key == pg.K_d:
                player_1.vx = 10
                player_1.facing_right = True
                player_1.facing_left = False

            if event.key == pg.K_UP:
                player_2.jump()
            if event.key == pg.K_LEFT:
                player_2.vx = -10
                player_2.facing_left = True
                player_2.facing_right = False
            elif event.key == pg.K_RIGHT:
                player_2.vx = 10
                player_2.facing_right = True
                player_2.facing_left = False

            if event.key == pg.K_j:
                if player_1.shoot() == "shoot_left":
                    b = Blast(player_1,0)
                    all_sprites.add(b)
                    blasts.add(b)
                elif player_1.shoot() == "shoot_right":
                    b = Blast(player_1,1)
                    all_sprites.add(b)
                    blasts.add(b)
            if event.key == pg.K_KP1:
                if player_2.shoot() == "shoot_left":
                    b = Blast(player_2,0)
                    all_sprites.add(b)
                    blasts.add(b)
                elif player_2.shoot() == "shoot_right":
                    b = Blast(player_2,1)
                    all_sprites.add(b)
                    blasts.add(b)

        elif event.type == pg.KEYUP:
            if event.key == pg.K_a:
                player_1.vx = 0
            if event.key == pg.K_d:
                player_1.vx = 0

            if event.key == pg.K_LEFT:
                player_2.vx = 0
            if event.key == pg.K_RIGHT:
                player_2.vx = 0
        if event.type == pg.QUIT:
            pg.quit()
            exit()

    #update all sprites
    all_sprites.update()
    check_for_collisions(player_1,main_platform)
    check_for_collisions(player_2,main_platform)
    check_blast_collisions(players,blasts)

    #draw sprites
    screen.fill((255,255,255))
    all_sprites.draw(screen)

    #draw other stuff
    p1lives = font.render(str(player_1.lives), False, (0,0,255))
    screen.blit(p1lives,(20,50))

    p2lives = font.render(str(player_2.lives), False, (255,0,0))
    screen.blit(p2lives,(1580,50))

    clock.tick(FPS)
    pg.display.flip()

这是完整的代码。 任何帮助深表感谢。谢谢。


你不能使用pygame.sprite.groupcollide()在这里,因为子弹与发射子弹的玩家发生碰撞。
你必须使用pygame.sprite.spritecollide(),一名玩家和对手的子弹。每个玩家调用一次。

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

如何使用群组碰撞? 的相关文章

  • Django:如何测试“HttpResponsePermanentRedirect”

    我正在为我的 django 应用程序编写一些测试 在我看来 它使用 HttpResponseRedirect 重定向到其他一些网址 那么我该如何测试呢 姜戈TestCase类有一个方法assertRedirects https docs d
  • 从正在运行的 python 脚本检测优化标志是否为 -O 或 -OO

    有时我想生成一个子进程 其优化标志与启动父进程时使用的优 化标志相同 我可以使用类似的东西 optimize not debug 但这样我就可以匹配两者 O and OO flags 是否有一些 python 内部状态包含该信息 经过一番深
  • python - 是否可以扩展 xml-rpc 可以序列化的事物集?

    我看到几个问题询问如何发送numpy ndarray通过 xml rpc 调用 这不能开箱即用 因为正如 xml rpc 中所述docs https docs python org 2 library xmlrpclib html 有一组固
  • python 中分割字符串以获得一个值?

    需要帮助 假设我在名为 input 的变量中有一个字符串 Sam Person name kind input split 通过执行上述操作 我得到两个具有不同字符串 Sam 和 Person 的变量 有没有办法只获取第一个值 name S
  • 可以在 TensorFlow 中使用排名相关作为成本函数吗?

    我正在处理偶尔充满异常值的极其嘈杂的数据 因此我主要依靠相关性来衡量我的神经网络的准确性 是否可以明确使用诸如等级相关性 斯皮尔曼相关系数 之类的东西作为我的成本函数 到目前为止 我主要依赖 MSE 作为相关性的代理 我现在面临三个主要障碍
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • Pandas重置索引未生效[重复]

    这个问题在这里已经有答案了 我不确定我在哪里误入歧途 但我似乎无法重置数据帧上的索引 当我跑步时test head 我得到以下输出 正如您所看到的 数据帧是一个切片 因此索引超出范围 我想做的是重置该数据帧的索引 所以我跑test rese
  • 如何限制Django CreateView中ForeignKey字段的选择?

    我有一个沿着这些思路的模型结构 models py class Foo models Model class Bar models Model foo models ForeignKey Foo class Baz models Model
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • 创建一个类似于 Tkinter 的表

    我希望创建类似于 Tkinter 中的表格的东西 但它不一定是这样的 例如 我想创建标题 Name1 Name2 Value 并在每个标题下面有几个空白行 然后 我希望稍后用我计算的值或名称的字符串值填充这些行 因此是标签 对于 Name2
  • 如何在 Python 中将彩色输出打印到终端?

    是否有与 Perl 等效的 Python 语言 print color red print
  • Matplotlib Scatter - ValueError:RGBA 序列的长度应为 3 或 4

    我正在尝试为我的功能绘制图表 但不断收到此错误 ValueError RGBA sequence should have length 3 or 4 每当我只有 6 种形状时 代码就可以完美运行 但现在我将其增加到 10 种 它就不起作用了
  • 如何有效地从 loadmat 函数生成的嵌套 numpy 数组中提取值?

    python中是否有更有效的方法从嵌套的python列表中提取数据 例如A array array 12000000 dtype object 我一直在使用A 0 0 0 0 当你有很多像 A 这样的数据时 这似乎不是一个有效的方法 我也用
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 如何通过字符串匹配加速 pandas 行过滤?

    我经常需要过滤 pandas 数据框df by df df col name string value 并且我想加快行选择操作 有没有快速的方法可以做到这一点 例如 In 1 df mul df 3000 2000 3 reset inde
  • Python组合目录中的所有csv文件并按日期时间排序

    我有 2 年的每日数据分成每月文件 我想将所有这些数据合并到一个按日期和时间排序的文件中 我正在使用的代码组合了所有文件 但不按顺序 我正在使用的代码 import pandas as pd import glob os import cs
  • 如何禁止 celery 中的 pickle 序列化

    Celery 默认使用 pickle 作为任务的序列化方法 如中所述FAQ http ask github com celery faq html isn t using pickle a security concern 这代表一个安全漏
  • 检查字符串是否只有字母和空格 - Python

    试图让 python 返回一个字符串仅包含字母和空格 string input Enter a string if all x isalpha and x isspace for x in string print Only alphabe
  • 异步和协程与任务队列

    我一直在阅读有关 python 3 中的 asyncio 模块的内容 以及更广泛地了解 python 中的协程的内容 但我不明白是什么让 asyncio 成为如此出色的工具 我的感觉是 你可以用协程做的所有事情 通过使用基于多处理模块 例如
  • 使用 Python 生成类似于 Messenger 或 kik 代码的圆形二维码

    我可以使用 Python 生成圆形 QR 码 就像 Facebook Messenger 或 kik 使用的那样吗 我访问了很多网站 但找不到这种类型的二维码 默认情况下 Python 生成方形 QR 码 但在我的项目中我想要圆形 QR 码

随机推荐

  • 我应该如何构建我的 Node/express/mongodb 应用程序?

    我只是好奇人们如何构建他们的 Node js 应用程序 通常我创建模型 视图 控制器 就这么简单 但我对 Node js 领域还算陌生 我正在尝试尽可能多地了解社区的运作方式 欢迎任何答案 谢谢 无论如何 我的实际设置是这样的 直到我找到
  • 如何以编程方式判断Word文档是否损坏?

    我有一个小的 C 应用程序 可以与 word 进行互操作 将一堆 word doc 文件转换为文本文件 并且在大多数情况下 这都可以正常工作 但是 如果文档已损坏 则 word 无法打开该文件并弹出一个对话框 这意味着我无法完全自动化此转换
  • 强制关闭 Android Activity 之前的回调?

    我希望在我的应用程序崩溃之前执行一些紧急清理代码 我尝试使用 onDestroy onFinal 和 Finalize 无济于事 这在 Android Activity 中可能吗 好吧 我建议您的应用程序一开始就不要崩溃 如果有什么东西可能
  • 有没有更好的方法来求数字乘法和求和?

    int N 2345 var digitArray N ToString ToCharArray int multiplicationSum 1 foreach char digit in digitArray multiplication
  • 如何标记因子但仍保留其原始水平值 - R

    我将这个问题分为两部分 第一部分是一般问题 第二部分是具体问题 首先 我想知道是否有一种可能的方法来标记数字因子但仍保留其原始数字级别 这特别令人困惑 因为我意识到当我们将标签参数传递给一个因子时 它就会变成该因子的级别 例如 x lt f
  • 我的网址是否以斜杠 (/) 结尾?我该如何使用 codeigniter 来做到这一点

    我正在尝试找出最合适的 从我读过的文章来看 似乎最好以斜杠结尾 url 所以而不是 http example url article 内容如下 http example url article 首先 我调整了 htaccess 以强制尾随斜
  • 在 Java 中组成 URL 或 URI 的惯用方法是什么?

    如何在 Java 中构建 URL 或 URI 有没有一种惯用的方法 或者可以轻松做到这一点的库 我需要允许从请求字符串开始 解析 更改各种 URL 部分 方案 主机 路径 查询字符串 并支持添加和自动编码查询参数 从 Apache HTTP
  • Node.js 开始读取文件的特定行

    在 Node js 上 我们可以使用以下命令逐行读取文件readline module var fs require fs var readline require readline var rl readline createInterf
  • Azure 广告在声明中返回角色,但 User.IsInRole 返回 false

    知道是什么原因造成的吗 我可以在 User Claims 中看到声明 我唯一能想到的是 来自 Azure Ad Roles 的声明返回的结果与 IsInRole 检查的内容不同 声明中显示的 CorpAdmin 角色 User IsInRo
  • 使用 ...(rest) 参数将参数从数组传递到 Actionscript 方法

    我的问题是这个问题的 Flex 换位 我可以将数组作为参数传递给 Java 中具有可变参数的方法吗 也就是说 我在一些 Actionscript 代码中有一个数组 我需要将数组中索引的每个对象传递到一个方法中method arguments
  • 从 ListView 的自定义适配器中的 URL 加载图像 (Android Studio)

    虽然位图似乎已正确获取 但变量 userBitmap 将保持为空 然而 当在我的平板电脑上向上或向下滚动时 新的列表行将包含图片 但它们都是相同的并且是错误的 真的 真的很困惑 我尝试了多种不同的方法从网络获取图像 任何帮助是极大的赞赏 我
  • 如何恢复初始 git 提交?

    我第一次提交到 git 存储库 然后我对这个承诺感到后悔并想恢复它 我尝试 git reset hard HEAD 1 我收到这条消息 fatal ambiguous argument HEAD 1 unknown revision or
  • Ajax,防止点击时出现多个请求

    当用户单击登录或注册按钮时 我试图阻止多个请求 这是我的代码 但它不起作用 第一次工作正常 然后返回 false do login click function e e preventDefault if this data request
  • C# - 从数据表中删除具有相同列值的行

    我有一个DataTable看起来像这样 ID Name DateBirth 1 aa 1 1 11 2 bb 2 3 11 2 cc 1 2 12 3 cd 2 3 12 这是删除具有相同 ID 的行的最快方法 以获得类似的结果 保留第一个
  • iterparse 无法解析某个字段,而其他类似的则可以

    我用Python的iterparse解析 nessus 扫描的 XML 结果 nessus 文件 对意外记录的解析失败 但类似的记录已被正确解析 XML 文件的一般结构是很多记录 如下所示
  • 不同的控制器有不同的布局文件

    如何使我的 ZF2 模块加载特定控制器的其他布局文件 考虑你有IndexController and AdminController在您的 ZF2 应用模块中和IndexController正在使用布局 phtml但你想用管理布局 phtm
  • 在目录中递归查找并替换文件名

    我想重命名以以下开头的文件夹中的所有文件123 xxx txt to xxx txt 例如我的目录有 123 xxx txt 123 yyy txt 123 zzz txt 我想将所有文件重命名为 xxx txt yyy txt zzz t
  • WKWebView 缩放以适合

    从 UIWebView 转移到 WKWebView 我无法弄清楚如何使用 WKWebView 大小上的 loadHTMLString 函数加载我正在加载的 HTML 以适应视图边界 我现在可以加载 html 但它超出了我视图的右侧和底部 如
  • Android:将视图拖到屏幕外

    我有一个活动 用户可以在一些按钮周围拖放 我所有的可拖动视图都在RelativeLayout为了拖动它们 我改变了它们的上边距和左边距 一切都很完美 除了当我将视图拖动到靠近屏幕的右侧和底部边缘时 它们会收缩而不是被绘制到屏幕之外 有什么方
  • 如何使用群组碰撞?

    所以我一直想知道如何使用 pygame groupcollide 我现在完全被难住了 因为我使用的是 collide rect 所以没问题 但对于 groupcollide 我似乎无法弄清楚如何调用该组内项目的属性 我不能进行碰撞 因为会有