Ejemplo n.º 1
0
    public override void InitData()
    {
        type      = ShapeType.arc;
        arcRadius = ToolMethod.Config2Logic(arcRadiusCon);

        arcCenter = ToolGameVector.ChangeGameVectorConToGameVector2(arcCenterCon) + basePosition;
    }
Ejemplo n.º 2
0
    //点和圆碰撞
    public static bool CollidePointAndCircle(GameVector2 _p, GameVector2 _c, int _radius)
    {
        long sprRadius   = _radius * _radius;
        long sqrDistance = _c.sqrMagnitude(_p);

        return(sqrDistance < sprRadius);
    }
Ejemplo n.º 3
0
    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;
    }
Ejemplo n.º 4
0
    /// <summary>
    /// 长度平方
    /// </summary>
    public long sqrMagnitude(GameVector2 obj)
    {
        long dx = this.x - obj.x;
        long dy = this.y - obj.y;

        return(dx * dx + dy * dy);
    }
Ejemplo n.º 5
0
    //圆和多边形碰撞
    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);
    }
Ejemplo n.º 6
0
    //圆和圆碰撞
    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);
    }
Ejemplo n.º 7
0
    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);
    }
Ejemplo n.º 8
0
    // 圆和正圆扇面的碰撞,不带位置修正
    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);
    }
Ejemplo n.º 9
0
    public void InitSelf(ObjectType _objType, int _objID)
    {
        isInDestory = false;
        objUid      = new ObjectUid(_objType, _objID);

        basePosition = ToolGameVector.ChangeGameVectorConToGameVector2(baseCenter);
        baseRadius   = ToolMethod.Config2Logic(baseRadiusCon);
        InitData();
    }
Ejemplo n.º 10
0
    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;
    }
Ejemplo n.º 11
0
    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;
    }
Ejemplo n.º 12
0
 public virtual void Logic_Move()
 {
     curLife--;
     if (curLife > 0)
     {
         GameVector2 _targetPos = objShape.GetPosition() + logicSpeed;
         objShape.SetPosition(_targetPos);
         renderPosition = objShape.GetPositionVec3(0.5f);
     }
     else
     {
     }
 }
Ejemplo n.º 13
0
 public virtual void Logic_Move()
 {
     if (logicSpeed != GameVector2.zero)
     {
         GameVector2 _targetPos = objShape.GetPosition() + logicSpeed;
         UpdateLogicPosition(_targetPos);
         renderPosition = objShape.GetPositionVec3();
     }
     if (curAttackTime > 0)
     {
         curAttackTime--;
     }
 }
Ejemplo n.º 14
0
    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;
    }
Ejemplo n.º 15
0
 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);
     }
 }
Ejemplo n.º 16
0
    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();
    }
Ejemplo n.º 17
0
    /// <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);
    }
Ejemplo n.º 18
0
    // 圆和正圆弧的碰撞,不带位置修正
    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);
    }
Ejemplo n.º 19
0
//	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));
    }
Ejemplo n.º 20
0
    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;
            }
        }
    }
Ejemplo n.º 21
0
    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);
    }
Ejemplo n.º 22
0
    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;
    }
Ejemplo n.º 23
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);
    }
Ejemplo n.º 24
0
    //点攻击
    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);
    }
Ejemplo n.º 25
0
 void UpdateLogicPosition(GameVector2 _logicPos)
 {
     objShape.SetPosition(BattleData.Instance.GetMapLogicPosition(_logicPos));
 }
Ejemplo n.º 26
0
 public override bool IsCollisionCircleCorrection(GameVector2 _pos, int _radius, out GameVector2 _amend)
 {
     return(ToolGameVector.CollideCircleAndRect(_pos, _radius, basePosition, halfWidth, halfHeight, out _amend));
 }
Ejemplo n.º 27
0
 public override bool IsCollisionCircle(GameVector2 _pos, int _radius)
 {
     return(ToolGameVector.CollideCircleAndRect(_pos, _radius, basePosition, halfWidth, halfHeight));
 }
Ejemplo n.º 28
0
    public GameVector2 GetMapGridCenterPositionFromRand(int _randNum)
    {
        GameVector2 grid = GetMapGridFromRand(_randNum);

        return(GetMapGridCenterPosition(grid.x, grid.y));
    }
Ejemplo n.º 29
0
 public override bool IsCollisionCircle(GameVector2 _pos, int _radius)
 {
     return(ToolGameVector.CollideCircleAndArc(_pos, _radius, arcCenter, arcRadius, arcAngle, arcAngleSize));
 }
Ejemplo n.º 30
0
 public override bool IsCollisionCircleCorrection(GameVector2 _pos, int _radius, out GameVector2 _amend)
 {
     return(ToolGameVector.CollideCircleAndArc(_pos, _radius, arcCenter, arcRadius, arcAngle, arcAngleSize, out _amend));
 }