搜索
查看: 2649|回复: 8

有办法判断一个玩家在另外一个玩家背后吗?

[复制链接]
发表于 2009-8-5 21:28:18 | 显示全部楼层 |阅读模式 来自 广东深圳
高手赐教一下:'(
发表于 2009-8-7 16:14:59 | 显示全部楼层 来自 河北沧州
索沛僵尸的老板,也跑来问问题呀,别人都请教不到你的
回复

使用道具 举报

发表于 2009-8-8 08:07:34 | 显示全部楼层 来自 北京朝阳
背后的定义实际上就看个人理解了,不在眼前的都是背后,还是有一段距离的背后(几米之后的背后、紧跟着的背后、你看不见他而他能看见你的叫背后。。。)具体问题具体分析,否则没法写。最广泛的定义找出的结果并不一定满足你的需要。细化的背后我个人理解为在一定向量夹角范围内,而且在可视范围内。请给出具体要求供大家讨论。
回复

使用道具 举报

 楼主| 发表于 2009-8-8 10:29:20 | 显示全部楼层 来自 广东深圳
索沛僵尸的老板,也跑来问问题呀,别人都请教不到你的
dongtianbao 发表于 2009-8-7 16:14

在这里比起来,我就是菜鸟啦
回复

使用道具 举报

 楼主| 发表于 2009-8-8 10:39:19 | 显示全部楼层 来自 广东深圳
背后的定义实际上就看个人理解了,不在眼前的都是背后,还是有一段距离的背后(几米之后的背后、紧跟着的背后、你看不见他而他能看见你的叫背后。。。)具体问题具体分析,否则没法写。最广泛的定义找出的结果并不一 ...
jim_yang 发表于 2009-8-8 08:07

2几天自己想出了一个笨拙的办法,有一定的作用,但还有错误的地方,大家看看有办法完善他没有
首先获取2人的位置:
static Float:vOrigin[2][3]
pev(id0, pev_origin, vOrigin[0]);
pev(id1, pev_origin, vOrigin[1]);
然后判断他们两人的距离,我就设定在50吧
if( vector_distance( vOrigin[0]1, vOrigin[1] ) < 50) {
        //然后判断他们眼睛水平方向
        new Float:vec[2][3]
        pev(id0,pev_v_angle, vec[0])
        pev(id1,pev_v_angle, vec[1])
        if ( -30.0< vec[0][1]-vec[1][1] <30.0 ) {        //判断大家都看向同一个地方,角度相差不超过30
        //
        }
}
上面代码可以判断一部分情况
例如B玩家想偷袭A玩家,站在A玩家背后,他们看的方向相同。
问题是这样相对来说,A玩家也变成了在B玩家的背后
回复

使用道具 举报

 楼主| 发表于 2009-8-8 10:44:12 | 显示全部楼层 来自 广东深圳
我想可以这样弄的话,是不是可以解决呢?
先判断2人的距离和方向
例如你是A,要判断的玩家为B
如果两人看的方向相同,两人的距离为30.
那么把B玩家的坐标向前移动10个单位。
再判断2人的距离,如果距离缩短到20,那么就判断B玩家一定是在背后了。
如果距离变长到40了,就说明B玩家是在前面。
说了半天,那个向前移动10米的代码不知道如何写。。。。。就卡这里了。。。
回复

使用道具 举报

发表于 2009-8-8 11:32:36 | 显示全部楼层 来自 北京朝阳

  1. stock bool:fm_is_in_viewcone(index, const Float:point[3]) {
  2.         new Float:angles[3];
  3.         pev(index, pev_angles, angles);
  4.         engfunc(EngFunc_MakeVectors, angles);
  5.         global_get(glb_v_forward, angles);
  6.         angles[2] = 0.0;

  7.         new Float:origin[3], Float:diff[3], Float:norm[3];
  8.         pev(index, pev_origin, origin);
  9.         xs_vec_sub(point, origin, diff);
  10.         diff[2] = 0.0;
  11.         xs_vec_normalize(diff, norm);

  12.         new Float:dot, Float:fov;
  13.         dot = xs_vec_dot(norm, angles);
  14.         pev(index, pev_fov, fov);
  15.         if (dot >= floatcos(fov * M_PI / 360))
  16.                 return true;

  17.         return false;
  18. }

  19. stock bool:fm_is_visible(index, const Float:point[3], ignoremonsters = 0) {
  20.         new Float:start[3], Float:view_ofs[3];
  21.         pev(index, pev_origin, start);
  22.         pev(index, pev_view_ofs, view_ofs);
  23.         xs_vec_add(start, view_ofs, start);

  24.         engfunc(EngFunc_TraceLine, start, point, ignoremonsters, index, 0);

  25.         new Float:fraction;
  26.         get_tr2(0, TR_flFraction, fraction);
  27.         if (fraction == 1.0)
  28.                 return true;

  29.         return false;
  30. }
复制代码
这两个函数是从hlsdk里找出来的,第一个是判断给定坐标是否在id的视锥里,第二个是判断id能否看到给定坐标。
要判断B在A身后,你可以先判断A的坐标在B的视锥里且B的坐标不在A的视锥里且B能看到A的坐标,另外可以加入距离作为附加参考
回复

使用道具 举报

 楼主| 发表于 2009-8-8 11:36:12 | 显示全部楼层 来自 广东深圳
stock bool:fm_is_in_viewcone(index, const Float:point[3]) {
        new Float:angles[3];
        pev(index, pev_angles, angles);
        engfunc(EngFunc_MakeVectors, angles);
        global_get(glb_v_forward, angles);
        angles[2 ...
jim_yang 发表于 2009-8-8 11:32

太棒了,我去试试看。
回复

使用道具 举报

 楼主| 发表于 2009-8-8 16:00:16 | 显示全部楼层 来自 广东深圳
下午测试了,这个判断函数完全有效,非常感谢jim_yang的帮助
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表