如何为弹跳球创建碰撞检测?

2024-03-03

我已经为三个沙滩球在屏幕上弹跳编写了一个动画(用Python)。我现在希望它们全部碰撞并能够相互弹开。我非常感谢您能提供的任何帮助。

import pygame
import random
import sys
class Ball:


    def __init__(self,X,Y):

        self.velocity = [1,1]
        self.ball_image = pygame.image.load ('Beachball.jpg'). convert()
        self.ball_boundary = self.ball_image.get_rect (center=(X,Y))
        self.sound = pygame.mixer.Sound ('Thump.wav')
        self.rect = self.ball_image.get_rect (center=(X,Y))

if __name__ =='__main__':

    width = 800
    height = 600
    background_colour = 0,0,0
    pygame.init()
    window = pygame.display.set_mode((width, height))
    pygame.display.set_caption("Bouncing Ball animation")
    num_balls = 3
    ball_list = []
    for number in range(num_balls):
        ball_list.append( Ball(random.randint(10, (width - 10)),random.randint(10, (height - 10))) )
    while True:
        for event in pygame.event.get():
                print event 
                if event.type == pygame.QUIT:
                        sys.exit(0)
        window.fill (background_colour)

        for ball in ball_list:
                if ball.ball_boundary.left < 0 or ball.ball_boundary.right > width:
                        ball.sound.play()
                        ball.velocity[0] = -1 * ball.velocity[0]
                if ball.ball_boundary.top < 0 or ball.ball_boundary.bottom > height:
                        ball.sound.play()
                        ball.velocity[1] = -1 * ball.velocity[1]

                ball.ball_boundary = ball.ball_boundary.move (ball.velocity)
                window.blit (ball.ball_image, ball.ball_boundary)
        pygame.display.flip()

任意形状的碰撞检测通常非常棘手,因为您必须弄清楚是否有任何像素发生碰撞。

使用圆圈实际上更容易。如果有两个半径为 r1 和 r2 的圆,如果圆心之间的距离小于 r1+r2,则发生碰撞。

两个中心 (x1,y1) 和 (x2,y2) 之间的距离可以计算并比较为:

d = sqrt((y2-y1) * (y2-y1) + (x2-x1) * (x2-x1));
if (d < r1 + r2) { ... bang ... }

或者,正如 jfclavette 指出的那样,平方根的成本很高,因此最好仅使用简单的运算进行计算:

dsqrd = (y2-y1) * (y2-y1) + (x2-x1) * (x2-x1);
if (dsqrd < (r1+r2)*(r1+r2)) { ... bang ... }

棘手的一点在于计算新的运动向量(给定对象(x,y)随时间变化的速率),因为您需要考虑当前的运动向量和接触点。

我认为作为第一次剪切,您应该先反转运动向量来测试碰撞检测是否有效。

然后问另一个问题 - 最好将各个问题具体化,以便得到有针对性的答案。

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

如何为弹跳球创建碰撞检测? 的相关文章

随机推荐

  • Coq 中的“错误:宇宙不一致”是什么意思?

    我正在努力通过软件基础 http www cis upenn edu bcpierce sf current 目前正在做教堂数字的练习 这是自然数的类型签名 Definition nat forall X Type X gt X gt X
  • Google Finance,如何获取 JSON 数据流?

    我之前试图解释这一点 但显然失败了 因此 如果您打开了谷歌金融图表 例如 http www google com finance q INDEXNASDAQ IXIC http www google com finance q INDEXN
  • 将 HTTP 响应正文解析为 XML

    我使用此代码执行 HTTP 请求并解析 XML 响应 using HttpWebResponse resp req GetResponse as HttpWebResponse if resp StatusCode HttpStatusCo
  • R中基于移动时间窗口连接数据

    我有每小时记录一次的天气数据 以及每 4 小时记录一次的位置数据 X Y 我想知道 X Y 位置的温度是多少 天气数据并不完全相同 因此 我为每个位置编写了这个循环 以扫描天气数据 查找日期 时间中的 最接近 并提取该时间的数据 问题是我编
  • prolog 如何使用 succ 运行递归查询?

    有人可以向我解释一下为什么这个序言查询会这样工作吗 定义是 add 0 Y Y add succ X Y succ Z add X Y Z 鉴于这种 add succ succ succ 0 succ succ 0 R 这是查询的轨迹 Ca
  • 如何根据数据属性内对象的属性选择元素?

    如果我的标记如下所示 div div div div div div 如果我只有键 bar 或 foo 我将如何使用 JQuery 选择特定元素 我可以取出每一行的整个对象并迭代它以查找匹配项 但如果有更有
  • Pdfplumber 无法识别表 python [重复]

    这个问题在这里已经有答案了 我使用 Pdfplumber 提取第 2 页第 3 部分的表格 通常 但它只适用于某些 pdf 其他则不起作用 对于失败的 pdf 文件 似乎 Pdfplumber 读取的是按钮表而不是我想要的表 我怎样才能拿到
  • Windows 如何更改或插入物理扇区到另一个文件中?

    我有 20 个文件 其中数据结构在 NTFS 中与 4k 扇区对齐 我想合并所有文件无需复制任何数据 目标是编写一种通过直接更改 NTFS 虚拟集群和物理集群来工作的插入 API 目标是从 50GB 块中获得大小为 1TB 的文件 而无需复
  • 将值传递给 Sql 中的空值列

    我有一个Sections表 在该表中我有列SectionId CourseId Name Capacity 这里CourseId是一个空值列 它的外键在这里聚焦于Course表 这个CourseId列是一个新添加了一个 我正在尝试向此表添加
  • 关闭 SVG 标签,显式关闭还是自动关闭?

    我正在验证我的代码 并收到以下错误Tag cannot be self closing Use an explicit closing tag 在 IE 中作为我的 svg 路径 因为它是自动关闭的
  • 时髦的 haskell 惰性列表隐式递归

    在 Haskell 中 由于懒惰 您可以构建无限列表 Prelude gt let g 4 g Prelude gt g 0 4 Prelude gt take 10 g 4 4 4 4 4 4 4 4 4 4 现在 当我尝试构建这样的列表
  • python 中的无循环 3D 矩阵乘法

    我希望在 python numpy 中执行以下操作 Matrix A is M x N x R Matrix B is N x 1 x R 矩阵乘法 AB C 其中 C 是 M x 1 x R 矩阵 本质上 A 的每个 M x N 层 其中
  • 了解 Perl 正则表达式修饰符 /m 和 /s [重复]

    这个问题在这里已经有答案了 我一直在阅读带有修饰符 s m 和 g 的 perl 正则表达式 我知道 g 是全局匹配 它将是贪婪搜索 但我对修饰符 s 和 m 感到困惑 谁能用代码示例解释 s 和 m 之间的区别 以展示它们有何不同 我尝试
  • 如何从 MVC 控制器在 debian linux 中打印 pdf

    AsP NET MVC 4 应用程序使用 Mono 在 Debian Squeeze Linux 中运行 控制器使用下面的代码从 html 创建 pdf 文件 如何将 pdf 文件打印到连接到服务器的三星打印机 有一些可执行文件可以用于此目
  • Select2 - formatNoMatches 上的链接

    我在用着Select2 http ivaynberg github com select2 来增强我的
  • 在 Python 中验证 HTML/RDFa

    编写可以验证 HTML 尤其是使用嵌入式 RDFa 的 python 模块的最佳方法是什么 我熟悉 validator w3 org 并且有兴趣编写一个执行类似功能的自定义验证器 但针对使用 RDFa 作为元素元数据的不同标准 有哪些值得查
  • (NextAuth) 类型错误:类型“{}”上不存在属性“会话”

    我在 NextJs 项目上使用 NextAuth 时收到错误 Type error Property session does not exist on type 我正在添加session按照此处的建议将属性添加到我的 app tsx 中
  • 四组设计模式如何融入 MVC 范式?

    我仔细考虑过设计模式一段时间以来 我刚刚开始考虑如何真正开始将其中一些更有意地融入到我的开发工作中 然而 我仍然对他们在本书开头对 MVC 的处理以及它与本书其余部分的关系感到困惑 我使用过的大多数框架 Spring Yii ASP NET
  • AWS Cognito - JavaScript 中的开发人员身份验证(浏览器)

    我在浏览器脚本中获取凭据时遇到问题 身份验证服务器返回 cognito identityId 和 cognito token 然后我设置了一个Cookie cookie cognitoidentityId cookie cognito to
  • 如何为弹跳球创建碰撞检测?

    我已经为三个沙滩球在屏幕上弹跳编写了一个动画 用Python 我现在希望它们全部碰撞并能够相互弹开 我非常感谢您能提供的任何帮助 import pygame import random import sys class Ball def i