java - 如何使用 java.awt.geom.Area 中的区域进行碰撞检测?
问题描述
我正在使用创建游戏java.awt
,并且想知道如何使用Area
s 进行高级碰撞检测。在我的游戏中,每个实体都有一个用Area
. 通过高级碰撞检测,我的意思是我不希望两个区域之间的碰撞导致实体停止,而是希望碰撞导致实体滑过。实体具有double
大小和方向的值以及它们的碰撞形状的区域。碰撞形状应该可以是任何形状(不仅仅是矩形或圆形)。程序的输出应该是一个向量,当与实体结合时可以导致该实体不发生碰撞。
// Basic collision without sliding
public static boolean testCollsion(Area a, Area b) {
Area c = (Area) a.clone();
c.intersect(b);
return !c.isEmpty();
}
// Advanced sliding collision
// Where b is stationary and a should change
public static void collide(Collidable a, Collidable b) {
Area areaA = new Area(a.getCollider().shape);
Area areaB = new Area(b.getCollider().shape);
Area c = (Area) areaA.clone();
c.intersect(areaB);
if (!c.isEmpty()) {
double directionA = a.getDirection();
double directionB = b.getDirection();
double magnitudeA = a.getMagnitude();
double magnitudeB = b.getMagnitude();
// Calculate collision vector
double directionC = ?;
double magnitudeC = ?;
}
}
碰撞后,实体应移出它撞击的物体区域,同时保持其速度和方向,并允许它滑过该区域。这应该由另一个向量来完成,以抵消实体朝向碰撞的运动。
解决方案
推荐阅读
- java - 如何从 SQLite 获取一行到具有自定义对象的模型?
- android - 如何使用 Spinner onItemSelected?
- facebook - 有没有办法通过 Facebook API 提取 AdAccount 发票?
- python - 如何在 Python 运行时根据用户选择安装依赖项?
- javascript - jQuery.validate().form() 仅在加载一次时始终为真
- wordpress - 帖子类型有多个单词时查询wordpress自定义帖子类型
- android - 在接收 FCM 推送通知时使用设备实际地理位置向服务器发送响应
- c# - Unity ARFoundation 找不到 ARCameraBackground
- jquery - 如何通过选择的当前值更改背景颜色?
- java - 如何修复“确保首先调用 FirebaseApp.initializeApp(Context)”