ttbs123 发表于 2009-8-5 21:28:18

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

高手赐教一下:'(

dongtianbao 发表于 2009-8-7 16:14:59

索沛僵尸的老板,也跑来问问题呀,别人都请教不到你的

jim_yang 发表于 2009-8-8 08:07:34

背后的定义实际上就看个人理解了,不在眼前的都是背后,还是有一段距离的背后(几米之后的背后、紧跟着的背后、你看不见他而他能看见你的叫背后。。。)具体问题具体分析,否则没法写。最广泛的定义找出的结果并不一定满足你的需要。细化的背后我个人理解为在一定向量夹角范围内,而且在可视范围内。请给出具体要求供大家讨论。

ttbs123 发表于 2009-8-8 10:29:20

索沛僵尸的老板,也跑来问问题呀,别人都请教不到你的
dongtianbao 发表于 2009-8-7 16:14 http://www.dt-club.net/forum/images/common/back.gif
在这里比起来,我就是菜鸟啦

ttbs123 发表于 2009-8-8 10:39:19

背后的定义实际上就看个人理解了,不在眼前的都是背后,还是有一段距离的背后(几米之后的背后、紧跟着的背后、你看不见他而他能看见你的叫背后。。。)具体问题具体分析,否则没法写。最广泛的定义找出的结果并不一 ...
jim_yang 发表于 2009-8-8 08:07 http://www.dt-club.net/forum/images/common/back.gif
2几天自己想出了一个笨拙的办法,有一定的作用,但还有错误的地方,大家看看有办法完善他没有
首先获取2人的位置:
static Float:vOrigin
pev(id0, pev_origin, vOrigin);
pev(id1, pev_origin, vOrigin);
然后判断他们两人的距离,我就设定在50吧
if( vector_distance( vOrigin1, vOrigin ) < 50) {
        //然后判断他们眼睛水平方向
        new Float:vec
        pev(id0,pev_v_angle, vec)
        pev(id1,pev_v_angle, vec)
        if ( -30.0< vec-vec <30.0 ) {        //判断大家都看向同一个地方,角度相差不超过30
        //
        }
}
上面代码可以判断一部分情况
例如B玩家想偷袭A玩家,站在A玩家背后,他们看的方向相同。
问题是这样相对来说,A玩家也变成了在B玩家的背后

ttbs123 发表于 2009-8-8 10:44:12

我想可以这样弄的话,是不是可以解决呢?
先判断2人的距离和方向
例如你是A,要判断的玩家为B
如果两人看的方向相同,两人的距离为30.
那么把B玩家的坐标向前移动10个单位。
再判断2人的距离,如果距离缩短到20,那么就判断B玩家一定是在背后了。
如果距离变长到40了,就说明B玩家是在前面。
说了半天,那个向前移动10米的代码不知道如何写。。。。。就卡这里了。。。

jim_yang 发表于 2009-8-8 11:32:36


stock bool:fm_is_in_viewcone(index, const Float:point) {
        new Float:angles;
        pev(index, pev_angles, angles);
        engfunc(EngFunc_MakeVectors, angles);
        global_get(glb_v_forward, angles);
        angles = 0.0;

        new Float:origin, Float:diff, Float:norm;
        pev(index, pev_origin, origin);
        xs_vec_sub(point, origin, diff);
        diff = 0.0;
        xs_vec_normalize(diff, norm);

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

        return false;
}

stock bool:fm_is_visible(index, const Float:point, ignoremonsters = 0) {
        new Float:start, Float:view_ofs;
        pev(index, pev_origin, start);
        pev(index, pev_view_ofs, view_ofs);
        xs_vec_add(start, view_ofs, start);

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

        new Float:fraction;
        get_tr2(0, TR_flFraction, fraction);
        if (fraction == 1.0)
                return true;

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

ttbs123 发表于 2009-8-8 11:36:12


stock bool:fm_is_in_viewcone(index, const Float:point) {
        new Float:angles;
        pev(index, pev_angles, angles);
        engfunc(EngFunc_MakeVectors, angles);
        global_get(glb_v_forward, angles);
        angles[2 ...
jim_yang 发表于 2009-8-8 11:32 http://www.dt-club.net/forum/images/common/back.gif
太棒了,我去试试看。

ttbs123 发表于 2009-8-8 16:00:16

下午测试了,这个判断函数完全有效,非常感谢jim_yang的帮助
页: [1]
查看完整版本: 有办法判断一个玩家在另外一个玩家背后吗?