- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个跟随玩家(由您控制)的伙伴AI,目前它可以正常工作,但是当我添加碰撞检测时,当伙伴撞到障碍物时效果不佳。我只是想知道什么是使ai运动平稳并避免障碍的最佳方法(例如a *算法的实现)?
这是我的好友类当前的更新方法:
public void update() {
setBounds(getX(), getY(), getWidth(), getHeight());
float xDiff = Math.abs(player.getX() - getX());
float yDiff = Math.abs(player.getY() - getY());
if (player.getX() > getX() && xDiff > buddyDistance) {
setX(getX()+speed);
}
else if (player.getX() < getX() && xDiff > buddyDistance) {
setX(getX()-speed);
}
if (player.getY() > getY() && yDiff > buddyDistance) {
setY(getY()+speed);
}
else if (player.getY() < getY() && yDiff > buddyDistance) {
setY(getY()-speed);
}
}
最佳答案
易于实施且可能根据您的障碍物类型而起作用的解决方案是使用潜在字段。
这个想法很简单:玩家的行为就像一块磁铁,将好友拉向自己。同时,障碍物会排斥伙伴,以便伙伴避开它们。
为了更好的可读性,我将首先使用向量而不是Java来解释它。
假设b
是伙伴的位置,而p
玩家的位置和o_1, ... o_k
是障碍的位置。
每个b, p, o_1, ..., o_k
是具有x
和y
坐标的二维向量。
那么向量(p-b)
是从伙伴指向玩家的向量。我们还需要的是向量(b-o_i)
,该向量从障碍物i
指向伙伴。此外,我们不直接使用向量(p-b)
,(b-o_i)
,而是先对其进行归一化。
然后,normalized(p-b)
已经是我们将好友拉到播放器所需要的全部。
为了使好友远离障碍,我们希望如果好友靠近它,排斥力要强,如果好友远离它,排斥力应该很小(甚至为零)。因此,一个明显的选择是用normalized(b-o_i)
缩放我们想要的方向,即1/|b-o_i|
,其中|。|。表示向量的范数。
现在,我们可以简单地将所有这些“电磁力”与:
w = normalized(p-b) + normalized(b-o_1)/|b-o_1| + ... + normalized(b-o_l)/|b-o_k|
w
通常指向玩家,但是只要好友靠近障碍物,它就会被它们击退,这正是您想要的。
w
归一化,然后按速度缩放。也就是说,我们的最终速度向量是
v = speed*w/|w|
public void update() {
setBounds(getX(), getY(), getWidth(), getHeight()); //I kept this from your code, but I don't actually know what it does
float dx = player.getX() - getX(); //note: I removed abs
float dy = player.getY() - getY();
float norm = Math.sqrt(dx*dx + dy*dy);
//normalization:
float wx = dx/norm;
float wy = dy/norm;
for (obstacle o : obstacles) { //assuming obstacles is an iterable datastructure containing instances of the class obstacle
//note, it suffices to iterate over close by obstacles
dx = getX() - o.getX();
dy = getY() - o.getY();
norm = Math.sqrt(dx*dx + dy*dy);
//normalization:
float ox = dx/norm;
float oy = dy/norm;
//add scaling to get the repulsion force we want
wx += ox/norm;
wy += oy/norm;
}
float norm_of_w = Math.sqrt(wx*wx + wy*wy);
float vx = speed * wx / norm_of_w;
float vy = speed * wy / norm_of_w;
setX(getX() + vx);
setY(getY() + vy);
}
c*(b-o_i)/|b-o_i|
(即
c
等)尝试
ox = c*dx/norm;
。如果
c
太小,则伙伴将在某种程度上陷入障碍;如果
c
很大,则在远离障碍物时将已经避开它们。对不同的障碍物大小使用不同的c值也可能会带来更好的结果。
1/|b-o_i|
很大。如果它们在同一位置,则您的程序将尝试除以零。您可能需要检查这种情况并避免这种情况。
w = -|p-b| + 1/|b-o_1| + ... + 1/|b-o_k|
关于java - 2d自上而下平滑寻路libGDX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45916071/
我正在尝试提供即时转码的视频。不幸的是,这意味着寻求不起作用。我假设这是因为浏览器不知道视频有多长,因此无法正确显示搜索栏。 有谁知道是否可以对视频的时长进行硬编码? 我想到的另一个选择可能是创建我自
我是一名优秀的程序员,十分优秀!