首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >物理引擎(碰撞检测C#,GDI+)

物理引擎(碰撞检测C#,GDI+)
EN

Stack Overflow用户
提问于 2017-01-08 22:55:45
回答 4查看 1K关注 0票数 1

我目前正在C#中使用GDI+开发2D游戏引擎,并且已经达到了添加简单碰撞检测的程度。

到目前为止,我可以使用以下代码检查我的玩家是否与另一个游戏对象相交:

代码语言:javascript
运行
AI代码解释
复制
public static bool IntersectGameObject(GameObject a, GameObject b)
{
    Rectangle rect1 = new Rectangle((int)a.Position.X, (int)a.Position.Y, a.Sprite.Bitmap.Width, a.Sprite.Bitmap.Height);
    Rectangle rect2 = new Rectangle((int)b.Position.X, (int)b.Position.Y, b.Sprite.Bitmap.Width, b.Sprite.Bitmap.Height);

    return rect1.IntersectsWith(rect2);
}

这太棒了,我很高兴我走了这么远,但是我想知道我的玩家是否与游戏对象的顶部、底部、左边或右侧相交,这样我就可以阻止我的玩家朝那个方向移动。他与一堵墙相撞。我该怎么做呢?有人能帮我吗?)

顺便说一句,游戏对象有位图,都是32 * 32像素,所以我不需要每个像素碰撞

(预先谢谢:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-09 00:11:09

计算两个矩形是否相交只是几个比较问题(我知道您已经在使用IntersectsWith):

代码语言:javascript
运行
AI代码解释
复制
if (Left > other.Right) return false;
if (Right < other.Left) return false;
if (Top > other.Bottom) return false;
if (Bottom < other.Top) return false;
return true;

为了确定碰撞的方向,你必须考虑到这样的可能性:

  • 一个矩形完全包含另一个矩形(无方向碰撞)
  • 它可能会产生一个“加号”数字(在各个方向相撞)。
  • 矩形的一个角可以与另一个角相交(两个方向碰撞)。

无论如何,要确定它是否在左侧发生了碰撞:

代码语言:javascript
运行
AI代码解释
复制
if (Right > other.Left && Right < other.Right && Left < other.Left)
{
    // the right side of "this" rectangle is INSIDE the other
    // and the left side of "this" rectangle is to the left of it
}

最后但并非最不重要的一点是,如果您正在逐帧计算此帧,则有可能一个对象“跳过”另一个对象。对于更现实的物理,你必须跟踪时间,并计算它何时会与矩形(每边)相交。

票数 3
EN

Stack Overflow用户

发布于 2017-01-10 04:27:27

如果您正在逐帧处理,一个很好的选择可能是存储上一个位置P0x,P0y和当前位置P1x,P1y

然后,你可以计算一个向量Vx,Vy,你可以计算交点Ix,Iy。这样你就能得到更精确的碰撞信息。

票数 1
EN

Stack Overflow用户

发布于 2017-01-08 23:10:03

如果你需要碰撞检测,你需要一个刚体,你通常用物理来移动刚体。据我所见,上面的代码片段可能会出现问题。如果你用变换移动它们,你应该标记为是运动学的。这意味着它不会被物理所动,而是会被变换所动。

一个运动刚体,你想要移动,应该做在FixedUpdate期间,以适当地应用碰撞。

如果你想知道你撞到哪一边,你可以用光线投射到物体上。

这个代码片段给出了一个例子,它显示了您可以在碰撞时执行的光线投射。最终,您使用的是哪个游戏引擎?

代码语言:javascript
运行
AI代码解释
复制
//this ray will generate a vector which points from the center of 
 //the falling object TO object hit. You subtract where you want to go from where you are

 Ray MyRay = ObjectHit.position - ObjectFalling.position;


 //this will declare a variable which will store information about the object hit
 raycasthit MyRayHit; 

 //this is the actual raycast
 raycast(MyRay, out MyRayHit);

 //this will get the normal of the point hit, if you dont understand what a normal is 
 //wikipedia is your friend, its a simple idea, its a line which is tangent to a plane

 vector3 MyNormal = MyRayHit.normal;

 //this will convert that normal from being relative to global axis to relative to an
 //objects local axis

 MyNormal = MyRayHit.transform.transformdirection(MyNormal);

 //this next line will compare the normal hit to the normals of each plane to find the 
 //side hit

 if(MyNormal == MyRayHit.transform.up)
 {
 you hit the top plane, act accordingly
 }
 //important note the use of the '-' sign this inverts the direction, -up == down. Down doesn't exist as a stored direction, you invert up to get it. 

 if(MyNormal == -MyRayHit.transform.up)
 {
 you hit the bottom plane act accordingly
 }
 if(MyNormal == MyRayHit.transform.right)
 {
 hit right
 }
 //note the '-' sign converting right to left
 if(MyNormal == -MyRayHit.transform.right)
 {
 hit left
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41542507

复制
相关文章
php使用Symfony EventDispatcher 组件
大家好,这篇文章将通过我在实际开发工作中的例子,来介绍Symfony的EventDispatcher组件的使用及实现原理。
OwenZhang
2021/12/08
2.1K0
数据实时反馈技术
其实不知道怎么起这个标题,这是一个这样的场景,在开发后台管理系统,尤其是实时监控系统的时候,往往需要展示数据的不断更新变化。常用的技术就是轮询,或者使用websocket进行长连接实时通讯。我们知道webpack在调试模式的时候有个热更新功能,它是通过服务器数据推送功能实现的。就是所谓的Server-Sent Events(SSE).
我不是码神
2022/07/28
1.1K0
数据实时反馈技术
Yahoo 书签系统使用 Php 语言的 symfony 框架
根据Yahoo 技术工程师 Michael Salisbury  介绍,Yahoo 书签使用 symfony 框架开发完成,他们选择 symfony 的理由如下:
田春峰-JCJC错别字检测
2019/02/14
1K0
nginx配置Symfony
server { listen 80; server_name blog.phpfs.com; root /data/web; rewrite ^/a
苦咖啡
2018/04/28
1.7K0
Symfony是什么
众所周知前面有说到PHP的七大框架,接下来就来说说Symfony框架,希望说的对大家有所帮助。
叫我可儿呀
2019/11/26
2.2K0
Symfony是什么
Aerospike在实时竞价广告中的应用
首先要介绍的是,什么是实时竞价广告?如图11-9所示 图11-9 实时竞价广告模式 与广告业务相关的术语 首先介绍几个与广告业务相关的术语: RTB(RealTime Bidding)实时竞价:一种利用第三方技术在数以百万计的网站上针对每一个用户展示行为进行评估以及出价的竞价技术。与大量购买投放频次不同,实时竞价规避了无效的受众到达,针对有意义的用户进行购买。它的核心是DSP平台(需求方平台),RTB对于媒体来说,可以带来更多的广告销量、实现销售过程自动化及减低各项费用的支出。而对于广告商和代理公司来说
企鹅号小编
2018/01/22
1.7K0
Aerospike在实时竞价广告中的应用
Flink在实时在实时计算平台和实时数仓中的企业级应用小结
在过去的这几年时间里,以 Storm、Spark、Flink 为代表的实时计算技术接踵而至。2019 年阿里巴巴内部 Flink 正式开源。整个实时计算领域风起云涌,一些普通的开发者因为业务需要或者个人兴趣开始接触Flink。
王知无-import_bigdata
2021/04/21
1.5K0
Flink在实时在实时计算平台和实时数仓中的企业级应用小结
goto语法在PHP中的使用
在C++、Java及很多语言中,都存在着一个神奇的语法,就是goto。顾名思义,它的使用是直接去到某个地方。从来代码的角度来说,也就是直接跳转到指定的地方。我们的PHP中也有这个功能,我们先来看看它是如何使用的:
硬核项目经理
2020/01/02
2.8K0
谈谈JSONAPI在PHP中的应用
现在服务端程序员的主要工作已经不再是套模版,而是编写基于 JSON 的 API 接口。可惜大家编写接口的风格往往迥异,这就给系统集成带来了很多不必要的沟通成本,如果你有类似的困扰,那么不妨关注一下 JSONAPI,它是一个基于 JSON 构建 API 的规范标准,一个简单的 API 接口大致如下所示:
LA0WAN9
2021/12/14
9580
谈谈JSONAPI在PHP中的应用
trait能力在PHP中的使用
相信大家对trait已经不陌生了,早在5.4时,trait就已经出现在了PHP的新特性中。当然,本身trait也是特性的意思,但这个特性的主要能力就是为了代码的复用。
硬核项目经理
2020/03/12
2.1K0
在 Linux 中实时监控日志文件
当你在你的 Linux 桌面、服务器或任何应用中遇到问题时,你会首先查看各自的日志文件。日志文件通常是来自应用的文本和信息流,上面有一个时间戳。它可以帮助你缩小具体的实例,并帮助你找到任何问题的原因。它也可以帮助从网络上获得援助。
用户9042463
2021/09/26
2.7K0
Symfony 服务容器入门
本文是依赖注入(Depeendency Injection)系列教程的第 3 篇文章,本系列教程主要讲解如何使用 PHP 实现一个轻量级服务容器,教程包括:
柳公子
2018/09/17
3.4K0
1024中的各种AI含义反馈
总的来说,1024 作为计算机科学中的一个重要数字,代表了计算机存储和网络通信等方面的基本单位,在计算机科学中具有广泛的应用和重要的意义。
红目香薰
2023/10/23
2830
实时检测神经振荡可实现行为相关的神经反馈
Real-time detection of neural oscillation bursts allows behaviourally relevant neurofeedback
脑机接口社区
2020/07/01
4360
Symfony 3 框架+Elasticsearch
目录src/AppBundle/Controller/SearchController.php
Stanley Sun
2019/09/23
8080
在UWP应用中调用Windows 10 Feedback Hub发送用户反馈
我们的应用上架后,有非常多的途径可以让用户发送反馈,比如留下邮箱、商店评论,甚至自己写个API来收集反馈。但其实,Windows 10的Feedback Hub也是可以为我们所用的。
Edi Wang
2019/07/08
2.3K0
在UWP应用中调用Windows 10 Feedback Hub发送用户反馈
Redis 在PHP中的使用笔记
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/details/79403675
泥豆芽儿 MT
2018/09/11
1.1K0
Redis 在PHP中的使用笔记
PHP弱类型在CTF中的应用
PHP作为世界上最好的语言(然而人生苦短,我用python),在CTF web题中大放异彩,深受出题人的喜爱。P神在对web题出题套路总结的第三条指出,出题人喜欢花式玩弄php的特性,包括弱类型、反序列化、\0截断、iconv截断。那么今天我们就php弱类型这一特性,总结一下相关出题的套路。 在Bugku WEB Write Up(二)《矛盾》这题中我们已经初步领略了PHP弱类型的魅力 也明白了为什么“test”会等于0 这里再举几个例子,加深一下理解 “1test”与1相比较时,会先将“1test”转
企鹅号小编
2018/02/28
4.2K0
PHP弱类型在CTF中的应用
在PHP中,cookie和session的使用
cookie简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据。一般情况下,Cookie通过HTTP headers从服务端返回到客户端。多数web程序都支持Cookie的操作,因为Cookie是存在于HTTP的标头之中,所以必须在其他信息输出以前进行设置,类似于header函数的使用限制。 PHP工作原理:PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在$_COOKIE的全局变量之中,因此我们可以通
思梦php
2018/03/09
4.3K0
在PHP中,cookie和session的使用
[MongoDB] 使用PHP在MongoDB中搜索的实现
条件操作符用于比较两个表达式并从mongoDB集合中获取数据。 MongoDB中条件操作符有: (>) 大于 - $gt (<) 小于 - $lt (>=) 大于等于 - $gte (<= ) 小于等于 - $lte MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式,使用PCRE (Perl Compatible Regular Expression) 作为正则表达式语言。 MongoDB OR 条件语句使用了关键字 $or
唯一Chat
2020/02/25
5.5K0

相似问题

Java9 HttpClient SSLHandshakeException

11

在HttpClient中模拟F#时参数计数失配异常

18

使用httpclient时系统异常

22

StringConcatFactory -Java9中的异常

30

带有sendAsyncMulti / multiResponseAsync的Java9 HttpClient

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档