在两个演员之间画出视线
Drawing line of sight between two actors
我是LibGDX的新手。我正在尝试通过开发演示游戏来学习 LibGDX。在游戏中,当军队和敌人彼此可见时,我想在他们之间画一条视线来证明他们看到了对方。视线应该逐渐增加,比如我们在windows 7传输文件时绿色部分逐渐增加。我正在使用 scene2D 并实现了 scene2D 的屏幕接口。
您可能想查看物理库。在您的应用程序中明确使用它(例如 Box2d 或 libgdx 的 BulletPhysics)。这两者都有光线投射的概念和某种形式的光线投射回调。这允许您为 "line of sight" 选择一个 "starting point" 并查看光线投射 hits/collides 的内容。
如果您不想在您的应用程序中使用物理库,您至少可以查看两者的源代码,并推出您自己的精简功能以实现您的视线目标。
那么您是在为玩家和计算寻找视觉上的东西吗?我不知道你所说的 windows 7 文件传输是什么意思。
这完全取决于你想要的东西有多准确,但你需要某种光线投射,就像 Peter R 所说的那样。你有这方面的库,但根据你的需要,这可以很容易地自己实现。
你拿走了一个单位或军队的 Vector
和敌人的 Vector
。然后检查那些 Vectors
之间的障碍物。你应该有一个 float
表示直线每一步的距离,它越高效率越高,但也越不准确,因为它可能会跨过一个小物体。
一些未经测试的 2D 伪代码:
RayCast(Vector v1, Vector v2)
{
Vector2 p = v1;
Vector2 direction = (v2 - v1).normalize;
float distance = 0.5f;
float totalDistance = 200;
while (Distance(p & v2) > distance && Distance(p & v1) < totalDistance)
{
p += direction * distance;
if (some obstruction is at p)
{
//no line of sight
}
}
}
我使用 AndEngine 开发了游戏,我使用了 AndEngine box2D 物理,我不断更新两个玩家之间的位置,如下所示:
我有两个玩家,一个玩家和另一个敌人。我画了线,线的终点位置由玩家和敌人的位置给出。我已经通过获取他们的坐标
//line of sight
final Line e1line = new Line(player.getX(), player.getY(), enemy.getX(), enemy.getY())
最后,我使用更新处理程序在玩家移动时继续移动线,如下所示:
IUpdateHandler updatehand = new IUpdateHandler(){
@Override
public void onUpdate(float pSecondsElapsed) {
// line of sight and notifier update
e1line.setPosition(player.getX(), player.getY(), enemy1.getX(), enemy1.getY());
}
@Override
public void reset() {}
};
我是LibGDX的新手。我正在尝试通过开发演示游戏来学习 LibGDX。在游戏中,当军队和敌人彼此可见时,我想在他们之间画一条视线来证明他们看到了对方。视线应该逐渐增加,比如我们在windows 7传输文件时绿色部分逐渐增加。我正在使用 scene2D 并实现了 scene2D 的屏幕接口。
您可能想查看物理库。在您的应用程序中明确使用它(例如 Box2d 或 libgdx 的 BulletPhysics)。这两者都有光线投射的概念和某种形式的光线投射回调。这允许您为 "line of sight" 选择一个 "starting point" 并查看光线投射 hits/collides 的内容。
如果您不想在您的应用程序中使用物理库,您至少可以查看两者的源代码,并推出您自己的精简功能以实现您的视线目标。
那么您是在为玩家和计算寻找视觉上的东西吗?我不知道你所说的 windows 7 文件传输是什么意思。
这完全取决于你想要的东西有多准确,但你需要某种光线投射,就像 Peter R 所说的那样。你有这方面的库,但根据你的需要,这可以很容易地自己实现。
你拿走了一个单位或军队的 Vector
和敌人的 Vector
。然后检查那些 Vectors
之间的障碍物。你应该有一个 float
表示直线每一步的距离,它越高效率越高,但也越不准确,因为它可能会跨过一个小物体。
一些未经测试的 2D 伪代码:
RayCast(Vector v1, Vector v2)
{
Vector2 p = v1;
Vector2 direction = (v2 - v1).normalize;
float distance = 0.5f;
float totalDistance = 200;
while (Distance(p & v2) > distance && Distance(p & v1) < totalDistance)
{
p += direction * distance;
if (some obstruction is at p)
{
//no line of sight
}
}
}
我使用 AndEngine 开发了游戏,我使用了 AndEngine box2D 物理,我不断更新两个玩家之间的位置,如下所示: 我有两个玩家,一个玩家和另一个敌人。我画了线,线的终点位置由玩家和敌人的位置给出。我已经通过获取他们的坐标
//line of sight
final Line e1line = new Line(player.getX(), player.getY(), enemy.getX(), enemy.getY())
最后,我使用更新处理程序在玩家移动时继续移动线,如下所示:
IUpdateHandler updatehand = new IUpdateHandler(){
@Override
public void onUpdate(float pSecondsElapsed) {
// line of sight and notifier update
e1line.setPosition(player.getX(), player.getY(), enemy1.getX(), enemy1.getY());
}
@Override
public void reset() {}
};