有办法判断一个玩家在另外一个玩家背后吗?
高手赐教一下:'( 索沛僵尸的老板,也跑来问问题呀,别人都请教不到你的 背后的定义实际上就看个人理解了,不在眼前的都是背后,还是有一段距离的背后(几米之后的背后、紧跟着的背后、你看不见他而他能看见你的叫背后。。。)具体问题具体分析,否则没法写。最广泛的定义找出的结果并不一定满足你的需要。细化的背后我个人理解为在一定向量夹角范围内,而且在可视范围内。请给出具体要求供大家讨论。 索沛僵尸的老板,也跑来问问题呀,别人都请教不到你的dongtianbao 发表于 2009-8-7 16:14 http://www.dt-club.net/forum/images/common/back.gif
在这里比起来,我就是菜鸟啦 背后的定义实际上就看个人理解了,不在眼前的都是背后,还是有一段距离的背后(几米之后的背后、紧跟着的背后、你看不见他而他能看见你的叫背后。。。)具体问题具体分析,否则没法写。最广泛的定义找出的结果并不一 ...
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玩家的背后 我想可以这样弄的话,是不是可以解决呢?
先判断2人的距离和方向
例如你是A,要判断的玩家为B
如果两人看的方向相同,两人的距离为30.
那么把B玩家的坐标向前移动10个单位。
再判断2人的距离,如果距离缩短到20,那么就判断B玩家一定是在背后了。
如果距离变长到40了,就说明B玩家是在前面。
说了半天,那个向前移动10米的代码不知道如何写。。。。。就卡这里了。。。
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的坐标,另外可以加入距离作为附加参考
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
太棒了,我去试试看。 下午测试了,这个判断函数完全有效,非常感谢jim_yang的帮助
页:
[1]