- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试使用我的碰撞检测来阻止物体相互穿过。我不知道该怎么做。
当物体碰撞时,我尝试反转它们的速度 vector 的方向(这样它就会远离碰撞的地方),但有时物体会相互卡住。
我试过改变他们的速度,但这只是 parent 互相反对。
有没有一种简单的方法来限制物体的运动,使它们不会穿过其他物体?我一直在使用矩形相交进行碰撞,我也尝试过圆形碰撞检测(使用对象之间的距离)。
想法?
package objects;
import java.awt.Rectangle;
import custom.utils.Vector;
import sprites.Picture;
import render.Window;
// Super class (game objects)
public class Entity implements GameObject{
private Picture self;
protected Vector position;
protected Vector velocity = new Vector(0,0);
private GameObject[] obj_list = new GameObject[0];
private boolean init = false;
// Takes in a "sprite"
public Entity(Picture i){
self = i;
position = new Vector(i.getXY()[0],i.getXY()[1]);
ObjectUpdater.addObject(this);
}
public Object getIdentity() {
return this;
}
// position handles
public Vector getPosition(){
return position;
}
public void setPosition(double x,double y){
position.setValues(x,y);
self.setXY(position);
}
public void setPosition(){
position.setValues((int)Window.getWinSize()[0]/2,(int)Window.getWinSize()[1]/2);
}
// velocity handles
public void setVelocity(double x,double y){ // Use if you're too lazy to make a vector
velocity.setValues(x, y);
}
public void setVelocity(Vector xy){ // Use if your already have a vector
velocity.setValues(xy.getValues()[0], xy.getValues()[1]);
}
public Vector getVelocity(){
return velocity;
}
// inferface for all game objects (so they all update at the same time)
public boolean checkInit(){
return init;
}
public Rectangle getBounds() {
double[] corner = position.getValues(); // Get the corner for the bounds
int[] size = self.getImageSize(); // Get the size of the image
return new Rectangle((int)Math.round(corner[0]),(int)Math.round(corner[1]),size[0],size[1]); // Make the bound
}
// I check for collisions where, this grabs all the objects and checks for collisions on each.
private void checkCollision(){
if (obj_list.length > 0){
for (GameObject i: obj_list){
if (getBounds().intersects(i.getBounds()) && i != this){
// What happens here?
}
}
}
}
public void updateSelf(){
checkCollision();
position = position.add(velocity);
setPosition(position.getValues()[0],position.getValues()[1]);
init = true;
}
public void pollObjects(GameObject[] o){
obj_list = o;
}
}
最佳答案
没有看到你的代码,我只能猜测发生了什么。我怀疑您的对象被卡住了,因为它们超出了其他对象的边界,最终进入了内部。确保每个对象的步长不仅仅是速度 * delta_time,而是步长受到潜在碰撞的限制。当发生碰撞时,计算它发生的时间(在 delta_time 中的某处)并按照反弹来确定最终对象的位置。或者,只需将物体设置为接触,速度根据动量守恒定律变化。
编辑 看到你的代码后,我可以扩展我的答案。首先,让我澄清一下您询问的一些术语。由于每次调用updateSelf
只需将速度 vector 添加到当前位置,您实际上是一个单位时间增量(增量时间始终为 1)。换句话说,您的“速度”实际上是自上次调用 updateSelf
以来经过的距离(速度 * 增量时间)。 .我建议使用显式( float )时间增量作为模拟的一部分。
其次,跟踪多个运动物体之间的碰撞的一般问题非常困难。无论使用什么时间增量,一个对象都可能在该增量中经历许多碰撞。 (想象一个物体挤在另外两个物体之间。在任何给定的时间间隔内,物体在两个周围物体之间来回反弹的次数没有限制。)此外,一个物体可能(在分辨率的范围内)计算)同时与多个对象发生碰撞。如果对象在移动时实际改变大小(正如您的代码所暗示的那样),问题会更加复杂。
第三,您有一个重要的错误来源,因为您将所有对象位置四舍五入为整数坐标。我建议用浮点对象( Rectangle2D.Float
而不是 Rectangle
;Point2D.Float
而不是 Vector
)来表示您的对象。我还建议更换 position
带有矩形的字段 bounds
捕获位置和大小的字段。这样,您不必在每次调用 getBounds()
时都创建一个新对象。 .如果对象大小是恒定的,这也将简化边界更新。
最后,每个对象内部都有碰撞检测逻辑存在一个重大问题:当对象 A 发现它会撞到对象 B 时,那么对象 B 也会撞到对象 A!但是,对象 B 会独立于对象 A 进行自己的计算。如果先更新 A,则 B 可能会错过碰撞,反之亦然。最好将整个碰撞检测和对象移动逻辑移动到全局算法中,并保持每个游戏对象相对简单。
一种方法(我推荐)是编写一个“updateGame”方法,将游戏状态推进给定的时间增量。它将使用记录碰撞的辅助数据结构,可能如下所示:
public class Collision {
public int objectIndex1; // index of first object involved in collision
public int objectIndex2; // index of second object
public int directionCode; // encoding of the direction of the collision
public float time; // time of collision
}
deltaTime
定义的新时间。 .它的结构可能是这样的:
void updateGame(float deltaTime) {
float step = deltaTime;
do (
Collision hit = findFirstCollision(step);
if (hit != null) {
step = Math.max(hit.time, MIN_STEP);
updateObjects(step);
updateVelocities(hit);
} else {
updateObjects(step);
}
deltaTime -= step;
step = deltaTime;
} while (deltaTime > 0);
}
/**
* Finds the earliest collision that occurs within the given time
* interval. It uses the current position and velocity of the objects
* at the start of the interval. If no collisions occur, returns null.
*/
Collision findFirstCollision(float deltaTime) {
Collision result = null;
for (int i = 0; i < obj_list.length; ++i) {
for (int j = i + 1; j < obj_list.length; ++j) {
Collision hit = findCollision(i, j, deltaTime);
if (hit != null) {
if (result == null || hit.time < result.time) {
result = hit;
}
}
}
}
return result;
}
/**
* Calculate if there is a collision between obj_list[i1] and
* obj_list[i2] within deltaTime, given their current positions
* and velocities. If there is, return a new Collision object
* that records i1, i2, the direction of the hit, and the time
* at which the objects collide. Otherwise, return null.
*/
Collision findCollision(int i1, int i2, float deltaTime) {
// left as an exercise for the reader
}
/**
* Move every object by its velocity * step
*/
void updateObjects(float step) {
for (GameObject obj : obj_list) {
Point2D.Float pos = obj.getPosition();
Point2D.Float velocity = obj.getVelocity();
obj.setPosition(
pos.getX() + step * velocity.getX(),
pos.getY() + step * velocity.getY()
);
}
}
/**
* Update the velocities of the two objects involved in a
* collision. Note that this does not always reverse velocities
* along the direction of collision (one object might be hit
* from behind by a faster object). The algorithm should assume
* that the objects are at the exact position of the collision
* and just update the velocities.
*/
void updateVelocities(Collision collision) {
// TODO - implement some physics simulation
}
MIN_STEP
常量是一个最小时间增量,以确保游戏更新循环不会因为更新如此小的时间步而无法取得进展而卡住。 (对于浮点,
deltaTime -= step;
可能会使
deltaTime
保持不变。)
关于java - (Java) 碰撞检测墙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14888619/
我有一个 facebook 的“点赞”应用程序 - 一个供多个“团队”使用的虚拟白板,这些团队共享该项目共有的“墙”。我捕获了大约 9-12 个实体的数据。我试图让用户的主页显示自上次登录以来发生的
是否可以在网站上共享 facebook 墙?我想让我网站上的每个登录用户都可以在某个区域查看他的 facebook 墙。如果用户没有登录到 facebook 我想让他登录,那么这将允许他查看他的墙。我
我找到了一些答案,但我无法将其付诸实践。我在将本地镜像分享到 Facebook 墙上时遇到一些问题。 我想要的是使用共享对话框将本地镜像上传到 Facebook 墙。 我尝试使用 PHP sdk 成功
我正在尝试复制在 Facebook 墙上分享故事的功能,类似于 site有。 当您点击分享时,它应该要求您验证 Facebook 的身份,如果您已经通过身份验证,它应该向您显示要发布到 Faceboo
在 documentation对于“发送”对话框,它显示 ... They’ll have the option to privately share a link as a Facebook mes
使用 Facebook PHP SDK,我需要采取什么步骤来允许用户从另一个网站发布到他们的 Facebook 墙上? 例如: 用户登录外部网站 用户创建帖子 用户在提交前点击“推送到 Faceboo
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我正在使用 Java 构建一个 Web 门户;除了其他要求之外,我正在努力解决一个非常简单的(至少乍一看)要求:我的客户希望在他的门户网站上看到他的 Facebook 墙的前 N 个帖子他想阅读他
嗨,我正在使用以下代码发布到 friend 墙,效果很好。 我想在 TextView 中预填充该文本,上面写着在 friend 的墙上写一些东西。 可以编辑吗?如果是,那怎么办? 这是代码 NSMut
我有一个代表我角色的精灵。此精灵根据我的鼠标位置旋转每一帧,这又使它旋转,因此我的矩形根据鼠标所在的位置而变大和变小。 基本上我想要做的是让我的Sprite(Character)不会进入Sprite墙
我正在使用 Javascript SDK 将内容发布到用户 friend 墙上: var publish = { method: 'stream.publish',
我正在使用这种简单的方式将文本发布到我的墙上: Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse("http://twitt
我正在使用 facebook sdk,需要将详细信息分享到 facebook 时间线。我正在使用以下 API 调用。 [FBRequestConnection startWithGraphPath
据我所知,为了让移动应用程序将图片上传到用户的 facebook 墙上,我需要一个具有以下权限的 fb 应用程序: 用户照片 发布 Action 但这些权限需要提交并由 facebook 团队审核。在
各位开发者大家好, 我正在寻找重新注册 Facebook Connect 的解决方案。 我们开发了一个 iOS 游戏,其中我们有一个虚构的角色作为主角,他也有一个公开的 Facebook 个人资料。
概述: 我有一个网站,其中有人们可以发布到 Facebook 的句子,但每个句子中都有输入框,人们可以更改默认值。有点像数字“Mad Lib”。每行都有一个按钮,可以将该行发布到 Facebook。
我有一个使用 ASP.NET webform .NET 4.5 C# 制作的网站。这个站点包含一个论坛(由我自制),这个论坛的部分内容需要发布到特定的 facebook 墙上(为这个网页制作)。我需要
我开发了一个应用程序来将简单的文本发布到 facebook。这是我正在使用的代码.. Bundle parameters = new Bundle(); parameters.putString("m
我正在尝试仅使用 CSS 创建墙壁图案。墙应该像现实生活中的墙一样自下而上生长。多亏了 flex,我才做到了这么多。我现在正尝试以不均匀的模式排列 div,以使其更逼真。 Like this (我知道
这个问题已经被问过好几次了,但是在阅读了很多不同的帖子之后,我仍然没有一个可以发布到墙上的基本版本。 我想用 python 发布到 FB 用户的墙上。 PHP SDK ( https://github
我是一名优秀的程序员,十分优秀!