public void Check(Collider a, Collider b) { eColliderType type1 = a.GetColliderType(); eColliderType type2 = b.GetColliderType(); switch (type1) { case eColliderType.Circle: switch (type2) { case eColliderType.Circle: CheckCircleAndCircle(a as Circle, b as Circle); break; case eColliderType.Polygon: CheckPolygonAndCircle(b as Polygon, a as Circle); break; } break; case eColliderType.Polygon: switch (type2) { case eColliderType.Circle: //CheckPolygonAndCircle(a as Polygon, b as Circle); break; case eColliderType.Polygon: //CheckPolygonAndCircle(b as Polygon, a as Circle); break; } break; } }
public ObjectColliderBase CreateColliderByType(eColliderType type) { ObjectColliderBase collider = null; switch (type) { case eColliderType.Circle: collider = new ColliderCircle(); break; case eColliderType.Rect: collider = new ColliderRect(); break; case eColliderType.ItalicRect: collider = new ColliderItalicRect(); break; default: Logger.LogError("Collider Type " + type + " is not exist!"); break; } _colliderList.Add(collider); _colliderCount++; return(collider); }
/// <summary> /// 根据类型创建一个引力场 /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int CreateGravitationFieldByType(ILuaState luaState) { eColliderType type = (eColliderType)luaState.ToInteger(-1); ObjectColliderBase collider = ColliderManager.GetInstance().CreateGravitationFieldByType(type); luaState.PushLightUserData(collider); return(1); }
public ObjectColliderBase CreateGravitationFieldByType(eColliderType type) { ObjectColliderBase collider = null; switch (type) { case eColliderType.Circle: collider = new GravitationFieldCircle(); break; case eColliderType.Rect: collider = new GravitationFieldRect(); break; default: Logger.LogError("GravitationField Type " + type + " is not exist!"); break; } _fieldList.Add(collider); _fieldCount++; return(collider); }
/// <summary> /// 创建自定义的collider /// <para>customizedName 自定义的类型名称</para> /// <para>eColliderType collider的形状类别</para> /// <para>参数...</para> /// </summary> /// <param name="luaState"></param> /// <returns></returns> public static int CreateCustomizedCollider(ILuaState luaState) { int top = luaState.GetTop(); int numArgs = top - 2; string customizedName = luaState.ToString(-top); eColliderType type = (eColliderType)luaState.ToInteger(-top + 1); int funcRef = InterpreterManager.GetInstance().GetCustomizedFuncRef(customizedName, eCustomizedType.Collider, eCustomizedFuncRefType.Init); luaState.RawGetI(LuaDef.LUA_REGISTRYINDEX, funcRef); ObjectColliderBase collider = ColliderManager.GetInstance().CreateColliderByType(type); luaState.PushLightUserData(collider); // 复制参数 int copyIndex = -numArgs - 2; for (int i = 0; i < numArgs; i++) { luaState.PushValue(copyIndex); } luaState.Call(numArgs + 1, 0); // 返回结果 luaState.PushLightUserData(collider); return(1); }
/// <summary> /// 通过距离,已优化 /// </summary> public void MoveCheck(Collider a, Collider b) { if (!a.active || !b.active) { return; } if (a == b) { return; } if (a is Polygon && b is Polygon) // 障碍之间不检测 { return; } if (!m_rolePush) // 角色不碰撞时,都是圆时,不处理 { if (a is Circle && b is Circle) { return; } } else { if (a is Circle && b is Circle) // 如果角色需要碰撞,并且都是圆,很远时,不处理 { FPCollide.GetDis2(ref m_dis2, ref a.c, ref b.c); if (m_dis2 > CircleCircleDis2) { return; } } } if (a is Circle && b is Polygon) // 角色和障碍太远不处理 { FPCollide.GetDis2(ref m_dis2, ref a.c, ref b.c); if (m_dis2 > CirclePolygonDis2) { return; } } eColliderType type1 = a.GetColliderType(); eColliderType type2 = b.GetColliderType(); switch (type1) { case eColliderType.Circle: switch (type2) { case eColliderType.Circle: CheckCircleAndCircle(a as Circle, b as Circle); break; case eColliderType.Polygon: CheckPolygonAndCircle(b as Polygon, a as Circle); break; } break; } }