public override void InitData() { type = ShapeType.arc; arcRadius = ToolMethod.Config2Logic(arcRadiusCon); arcCenter = ToolGameVector.ChangeGameVectorConToGameVector2(arcCenterCon) + basePosition; }
//点和圆碰撞 public static bool CollidePointAndCircle(GameVector2 _p, GameVector2 _c, int _radius) { long sprRadius = _radius * _radius; long sqrDistance = _c.sqrMagnitude(_p); return(sqrDistance < sprRadius); }
IEnumerator CreatRole(GameVector2[] _roleGrid) { Dictionary <string, GameObject> pre_roleModle = new Dictionary <string, GameObject> (); List <BattleUserInfo> list_battleUser = BattleData.Instance.list_battleUser; for (int i = 0; i < list_battleUser.Count; i++) { yield return(new WaitForEndOfFrame()); BattleUserInfo _info = list_battleUser [i]; GameObject _base = Instantiate(pre_roleBase, roleParent); GameObject _ui = Instantiate(pre_roleUI, _base.transform); // string _modleStr = string.Format("BattleScene/Role/RoleModel{0}",_info.roleID); string _modleStr = "BattleScene/Role/RoleModel"; if (!pre_roleModle.ContainsKey(_modleStr)) { pre_roleModle [_modleStr] = Resources.Load <GameObject> (_modleStr); } GameObject _modle = Instantiate(pre_roleModle [_modleStr]); GameVector2 _grid = _roleGrid [_info.battleID - 1]; GameVector2 _pos = BattleData.Instance.GetMapGridCenterPosition(_grid.x, _grid.y); RoleBase _roleCon = _base.GetComponent <RoleBase> (); _roleCon.InitData(_ui, _modle, _info.battleID, _pos); dic_role [_info.battleID] = _roleCon; } initFinish = true; }
/// <summary> /// 长度平方 /// </summary> public long sqrMagnitude(GameVector2 obj) { long dx = this.x - obj.x; long dy = this.y - obj.y; return(dx * dx + dy * dy); }
//圆和多边形碰撞 public static bool CollideCircleAndPolygon(GameVector2 _c1, int _radius1, GameVec2Con[] vectexs, int[] normalDir) { Vector3 _circleCenter = ToolGameVector.ChangeGameVectorToVector3(_c1); bool isAllIn = true;//是否都在多边形线段的右侧 for (int i = 0; i < vectexs.Length; i++) { Vector3 lineBegin = ToolGameVector.ChangeGameVectorConToVector3(vectexs [i]); int endIndex = (i + 1) % vectexs.Length; Vector3 lineEnd = ToolGameVector.ChangeGameVectorConToVector3(vectexs [endIndex]); Vector3 _circleVec = _circleCenter - lineBegin; Vector3 _line = lineEnd - lineBegin; Vector3 _cross = Vector3.Cross(_circleVec, _line); if (_cross.z < 0) { isAllIn = false; //在线段的左侧,即多边形的外侧 Vector3 vecProj = Vector3.Project(_circleVec, _line); //投影点 float disLine = _line.magnitude; float proj_begin = vecProj.magnitude; float proj_end = (vecProj - _line).magnitude; float projlengh = proj_begin + proj_end; if ((disLine + 1) >= projlengh) { //投影在线段上 int dis = (int)Mathf.Sqrt(_circleVec.sqrMagnitude - vecProj.sqrMagnitude); int disRadius = _radius1 / 100; if (dis < disRadius) { return(true); } else { return(false); } } else { //投影不在当前线段上 if (CollidePointAndCircle(ChangeGameVectorConToGameVector2(vectexs [i]), _c1, _radius1)) { return(true); } else { return(CollidePointAndCircle(ChangeGameVectorConToGameVector2(vectexs [endIndex]), _c1, _radius1)); } } } } if (isAllIn) { //全在内侧,圆心在多边形内 return(true); } return(false); }
//圆和圆碰撞 public static bool CollideCircleAndCircle(GameVector2 _c1, GameVector2 _c2, int _radius1, int _radius2) { int sumRadius = _radius1 + _radius2; long sprRadius = sumRadius * sumRadius; long sqrDistance = _c1.sqrMagnitude(_c2); return(sqrDistance < sprRadius); }
public virtual void Logic_NormalAttack() { curAttackTime = attackTime; GameVector2 _bulletPos = objShape.GetPosition() + ToolMethod.Logic2Config(objShape.GetRadius()) * BattleData.Instance.GetSpeed(roleDirection); BattleCon.Instance.bulletManage.AddBullet(objShape.ObjUid.objectID, _bulletPos, roleDirection); }
// 圆和正圆扇面的碰撞,不带位置修正 public static bool CollideCircleAndArcArea(GameVector2 _c1, int _radius1, GameVector2 _arcCen, int _arcRadius, int _arcAngle, int _arcAngleSize) { int radiusSum = _radius1 + _arcRadius; long sqrRadiusSum = radiusSum * radiusSum; long sqrDistance = _c1.sqrMagnitude(_arcCen); if (sqrDistance >= sqrRadiusSum) { return(false); } int _angle = (_c1 - _arcCen).Angle(); int _point1Angle = _arcAngle + _arcAngleSize; int _point2Angle = _arcAngle - _arcAngleSize; bool inArc; if (_point2Angle < 0) { int _angle1 = (int)Mathf.Repeat(_angle - _point2Angle, 360f); if (_angle1 >= 0 && _angle1 <= (_point1Angle - _point2Angle)) { inArc = true; } else { inArc = false; } } else if (_point1Angle > 360) { int _delA = _point1Angle - 360; int _angle1 = (int)Mathf.Repeat(_angle - _delA, 360f); if (_angle1 >= (_point2Angle - _delA) && _angle1 <= 360) { inArc = true; } else { inArc = false; } } else { if (_angle >= _point2Angle && _angle <= _point1Angle) { inArc = true; } else { inArc = false; } } if (inArc) { return(true); } return(false); }
public void InitSelf(ObjectType _objType, int _objID) { isInDestory = false; objUid = new ObjectUid(_objType, _objID); basePosition = ToolGameVector.ChangeGameVectorConToGameVector2(baseCenter); baseRadius = ToolMethod.Config2Logic(baseRadiusCon); InitData(); }
public void AddBullet(int _owerID, GameVector2 _logicPos, int _moveDir) { bulletID++; GameObject _bulletBase = Instantiate(prefabBullet, bulletParent); BulletBase _bullet = _bulletBase.GetComponent <BulletBase> (); _bullet.InitData(_owerID, bulletID, _logicPos, _moveDir); dic_bullets [bulletID] = _bullet; }
public void InitData(int _owerID, int _id, GameVector2 _logicPos, int _moveDir) { // owerID = _owerID; objShape = GetComponent <ShapeBase> (); objShape.InitSelf(ObjectType.bullet, _id); objShape.SetPosition(_logicPos); transform.position = objShape.GetPositionVec3(0.5f); logicSpeed = speed * BattleData.Instance.GetSpeed(_moveDir); curLife = life; }
public virtual void Logic_Move() { curLife--; if (curLife > 0) { GameVector2 _targetPos = objShape.GetPosition() + logicSpeed; objShape.SetPosition(_targetPos); renderPosition = objShape.GetPositionVec3(0.5f); } else { } }
public virtual void Logic_Move() { if (logicSpeed != GameVector2.zero) { GameVector2 _targetPos = objShape.GetPosition() + logicSpeed; UpdateLogicPosition(_targetPos); renderPosition = objShape.GetPositionVec3(); } if (curAttackTime > 0) { curAttackTime--; } }
IEnumerator CreatObstacle(GameVector2[] _roleGrid) { dic_preObstacles = new Dictionary <string, GameObject> (); GameObject[] preObstacle = Resources.LoadAll <GameObject> ("BattleScene/Obstacle"); foreach (var item in preObstacle) { dic_preObstacles [item.name] = item; } yield return(new WaitForEndOfFrame()); bool[,] mapGrid = new bool[BattleData.mapRow, BattleData.mapColumn]; foreach (var item in _roleGrid) { mapGrid [item.x, item.y] = true; } int _creatNum = 0; for (int i = 0; i < BattleData.mapRow; i++) { for (int j = 0; j < BattleData.mapColumn; j++) { if (mapGrid [i, j]) { continue; } else { obstacleID++; GameObject _base = Instantiate(dic_preObstacles["ObstacleBase"], obstacleParent); string _modleStr = "ObsModel"; Instantiate(dic_preObstacles[_modleStr], _base.transform); GameVector2 _pos = BattleData.Instance.GetMapGridCenterPosition(i, j); ObstacleBase _obstacle = _base.GetComponent <ObstacleBase> (); _obstacle.InitData(obstacleID, _pos, 1); dic_obstacles [obstacleID] = _obstacle; } _creatNum++; if (_creatNum % 3 == 0) { yield return(new WaitForEndOfFrame()); } } } initFinish = true; }
public virtual void Logic_UpdateMoveDir(int _dir) { if (_dir > 120) { logicSpeed = GameVector2.zero; } else { roleDirection = _dir * 3; logicSpeed = moveSpeed * BattleData.Instance.GetSpeed(roleDirection); Vector3 _renderDir = ToolGameVector.ChangeGameVectorToVector3(logicSpeed); renderDir = Quaternion.LookRotation(_renderDir); } }
public void InitData(int _id, GameVector2 _logicPos, int _blood) { isBroken = false; objShape = GetComponent <ShapeBase> (); objShape.InitSelf(ObjectType.obstacle, _id); objShape.SetPosition(_logicPos); transform.position = objShape.GetPositionVec3(); blood = _blood; bloodText = transform.Find("BloodNum").GetComponent <TextMesh> (); bloodText.text = blood.ToString(); }
/// <summary> /// 点和圆的碰撞,圆不动修正点的位置 /// </summary> /// <returns><c>true</c>, if point and circle was collided, <c>false</c> otherwise.</returns> /// <param name="_p">碰撞点.</param> /// <param name="_c">碰撞圆心.</param> /// <param name="_radius">圆半径.</param> /// <param name="_amend">修正值.</param> public static bool CollidePointAndCircle(GameVector2 _p, GameVector2 _c, int _radius, out GameVector2 _amend) { _amend = GameVector2.zero; long sprRadius = _radius * _radius; long sqrDistance = _c.sqrMagnitude(_p); if (sqrDistance >= sprRadius) { return(false); } int distance = (int)Mathf.Sqrt(sqrDistance); int _angle = (_p - _c).Angle(); int amendDis = 1 + (_radius - distance) / 100; _amend = amendDis * BattleData.Instance.GetSpeed(_angle); return(true); }
// 圆和正圆弧的碰撞,不带位置修正 public static bool CollideCircleAndArc(GameVector2 _c1, int _radius1, GameVector2 _arcCen, int _arcRadius, int _arcAngle, int _arcAngleSize) { int radiusSum = _radius1 + _arcRadius; long sqrRadiusSum = radiusSum * radiusSum; long sqrDistance = _c1.sqrMagnitude(_arcCen); if (sqrDistance >= sqrRadiusSum) { return(false); } int radiusDel = _radius1 - _arcRadius; long sqrRadiusDel = radiusDel * radiusDel; if (sqrDistance <= sqrRadiusDel) { return(false); } int _angle = (_c1 - _arcCen).Angle(); if (Mathf.Abs(_angle - _arcAngle) <= _arcAngleSize) { return(true); } int _point1Angle = (int)Mathf.Repeat(_arcAngle + _arcAngleSize, 360); GameVector2 _point1 = _arcCen + (_arcRadius / 100) * BattleData.Instance.GetSpeed(_point1Angle); bool _result1 = ToolGameVector.CollidePointAndCircle(_c1, _point1, _radius1); if (_result1) { return(_result1); } int _point2Angle = (int)Mathf.Repeat(_arcAngle - _arcAngleSize, 360); GameVector2 _point2 = _arcCen + (_arcRadius / 100) * BattleData.Instance.GetSpeed(_point2Angle); bool _result2 = ToolGameVector.CollidePointAndCircle(_c1, _point2, _radius1); if (_result2) { return(_result2); } return(false); }
// void Start () { // // } public void InitData(Transform _roleParent, out GameVector2[] roleGrid) { initFinish = false; roleParent = _roleParent; dic_role = new Dictionary <int, RoleBase> (); pre_roleBase = Resources.Load <GameObject> ("BattleScene/Role/RoleBase"); pre_roleUI = Resources.Load <GameObject> ("BattleScene/Role/RoleUI"); int _roleNum = BattleData.Instance.list_battleUser.Count; roleGrid = new GameVector2[_roleNum]; for (int i = 0; i < roleGrid.Length; i++) { roleGrid [i] = BattleData.Instance.GetMapGridFromRand(ToolRandom.rand_10000()); } StartCoroutine(CreatRole(roleGrid)); }
void InitSpeedInfo(string _fileStr) { string[] lineArray = _fileStr.Split("\n" [0]); int dir; for (int i = 0; i < lineArray.Length; i++) { if (lineArray [i] != "") { GameVector2 date = new GameVector2(); string[] line = lineArray [i].Split(new char[1] { ',' }, 3); dir = System.Int32.Parse(line [0]); date.x = System.Int32.Parse(line [1]); date.y = System.Int32.Parse(line [2]); dic_speed [dir] = date; } } }
public bool CollisionCorrection(GameVector2 _tVec, int _tRadius, out GameVector2 _tVecCC) { bool _result = false; _tVecCC = _tVec; foreach (var item in dic_obstacles.Values) { if (!item.objShape.IsInBaseCircleDistance(_tVecCC, _tRadius)) { continue; } GameVector2 _amend; if (item.objShape.IsCollisionCircleCorrection(_tVecCC, _tRadius, out _amend)) { _tVecCC += _amend; _result = true; } } return(_result); }
public void InitData(GameObject _ui, GameObject _modle, int _roleID, GameVector2 _logicPos) { objShape = GetComponent <ShapeBase> (); logicSpeed = GameVector2.zero; modleParent = transform.Find("Modle"); // uiObj = _ui; _modle.transform.SetParent(modleParent); _modle.transform.localPosition = new Vector3(0, 0.5f, 0); objShape.InitSelf(ObjectType.role, _roleID); objShape.SetPosition(_logicPos); renderPosition = objShape.GetPositionVec3(); transform.position = renderPosition; roleDirection = 0; renderDir = Quaternion.LookRotation(new Vector3(1f, 0f, 0f)); modleParent.rotation = renderDir; curAttackTime = 0; }
/// <summary> /// 圆和圆的碰撞,2个圆的位置都修正 /// </summary> /// <returns><c>true</c>, if circle and circle was collided, <c>false</c> otherwise.</returns> /// <param name="_c1">圆1的圆心.</param> /// <param name="_c2">圆2的圆心.</param> /// <param name="_radius1">圆1的半径.</param> /// <param name="_radius2">圆2的半径.</param> /// <param name="_amend1">圆1的修正值.</param> /// <param name="_amend2">圆2的修正值.</param> public static bool CollideCircleAndCircle(GameVector2 _c1, GameVector2 _c2, int _radius1, int _radius2, out GameVector2 _amend1, out GameVector2 _amend2) { _amend1 = GameVector2.zero; _amend2 = GameVector2.zero; int radiusSum = _radius1 + _radius2; long sprRadius = radiusSum * radiusSum; long sqrDistance = _c1.sqrMagnitude(_c2); if (sqrDistance >= sprRadius) { return(false); } int distance = (int)Mathf.Sqrt(sqrDistance); int _angle = (_c1 - _c2).Angle(); int amendDis = 1 + (int)((radiusSum - distance) * 0.5) / 100; _amend1 = amendDis * BattleData.Instance.GetSpeed(_angle); _amend2 = -1 * _amend1; return(true); }
//点攻击 public bool AttackObstacle(ObjectUid _attacker, GameVector2 _attackPoint, int _attackRadius, int _attackNum) { bool isAttack = false; foreach (var item in dic_obstacles.Values) { if (item.isBroken || !item.objShape.IsInBaseCircleDistance(_attackPoint, _attackRadius)) { continue; } if (item.objShape.IsCollisionCircle(_attackPoint, _attackRadius)) { if (item.BeAttackBroken(_attackNum)) { //击碎 list_brokenObs.Add(item); isAttack = true; } } } return(isAttack); }
void UpdateLogicPosition(GameVector2 _logicPos) { objShape.SetPosition(BattleData.Instance.GetMapLogicPosition(_logicPos)); }
public override bool IsCollisionCircleCorrection(GameVector2 _pos, int _radius, out GameVector2 _amend) { return(ToolGameVector.CollideCircleAndRect(_pos, _radius, basePosition, halfWidth, halfHeight, out _amend)); }
public override bool IsCollisionCircle(GameVector2 _pos, int _radius) { return(ToolGameVector.CollideCircleAndRect(_pos, _radius, basePosition, halfWidth, halfHeight)); }
public GameVector2 GetMapGridCenterPositionFromRand(int _randNum) { GameVector2 grid = GetMapGridFromRand(_randNum); return(GetMapGridCenterPosition(grid.x, grid.y)); }
public override bool IsCollisionCircle(GameVector2 _pos, int _radius) { return(ToolGameVector.CollideCircleAndArc(_pos, _radius, arcCenter, arcRadius, arcAngle, arcAngleSize)); }
public override bool IsCollisionCircleCorrection(GameVector2 _pos, int _radius, out GameVector2 _amend) { return(ToolGameVector.CollideCircleAndArc(_pos, _radius, arcCenter, arcRadius, arcAngle, arcAngleSize, out _amend)); }