コード例 #1
0
ファイル: RoadPath.cs プロジェクト: Avatarchik/LockStepDemo
    //public bool IsBlocked(Vector2 pos)
    //{
    //    return true;
    //}

    public Sector Bounce(IM.Vector2 pos, Sector collideSector, SectorArea area)
    {
        int iCurSector = CalcSectorIdx(pos.x0z);
        int iColomn    = m_AngleList.Count;

        int iCurColomn = iCurSector % iColomn;

        GameMatch match = GameSystem.Instance.mClient.mCurMatch;

        IM.Vector3 dirSectorToBasket      = GameUtils.HorizonalNormalized(match.mCurScene.mBasket.m_vShootTarget, collideSector.center.x0z);
        IM.Vector3 dirSectorToBasketRight = IM.Quaternion.AngleAxis(new IM.Number(90), IM.Vector3.up) * dirSectorToBasket;
        IM.Vector2 curRight = dirSectorToBasketRight.xz;

        IM.Vector2 dirSector2Pos = (collideSector.center - pos).normalized;
        int        iNewCol       = iCurColomn;

        if (IM.Vector2.Dot(dirSector2Pos, curRight) > IM.Number.zero)
        {
            iNewCol = Mathf.Clamp(iCurColomn + IM.Random.Range(3, 6), (int)area.start.x, (int)area.start.x + (int)area.range.x - 1);
        }
        else
        {
            iNewCol = Mathf.Clamp(iCurColomn - IM.Random.Range(3, 6), (int)area.start.x, (int)area.start.x + (int)area.range.x - 1);
        }

        int iNewRow = Mathf.Clamp((int)area.start.y + IM.Random.Range(0, (int)area.range.y), (int)area.start.y, (int)area.start.y + (int)area.range.y - 1);
        int index   = iNewRow * iColomn + iNewCol;

        return(m_Sectors[index]);
        //AddDrawSector("targetSector", targetSector);
    }
コード例 #2
0
ファイル: PlayGround.cs プロジェクト: Avatarchik/LockStepDemo
    public bool InFreeThrowLane(IM.Vector2 pos)
    {
        UBasket basket = mScene.mBasket;

        IM.Number fDistanceToNet = IM.Vector2.Distance(pos, basket.m_vShootTarget.xz);
        return(fDistanceToNet < mFreeThrowLane);
    }
コード例 #3
0
    public void ConstrainMovementOnBegin(IM.Number fCurTime)
    {
        if (prepareTime < fCurTime)
        {
            return;
        }
        foreach (Player player in GameSystem.Instance.mClient.mPlayerManager)
        {
            IM.Vector2 curPos = new IM.Vector2(player.position.x, player.position.z);

            GameScene scene = m_match.mCurScene;

            IM.Vector2 vPt3Center         = scene.mGround.mCenter.xz + scene.mGround.m3PointCenter;
            IM.Vector2 dirCharToPt3Center = (curPos - vPt3Center).normalized;

            if (player.m_team.m_role == GameMatch.MatchRole.eDefense)
            {
                if (!scene.mGround.In3PointRange(curPos, -F_KEEP_DIST_DEFENSE))
                {
                    curPos          = dirCharToPt3Center * (scene.mGround.m3PointRadius - F_KEEP_DIST_DEFENSE) + vPt3Center;
                    player.position = new IM.Vector3(curPos.x, player.position.y, curPos.y);
                }
            }
            else
            {
                if (scene.mGround.In3PointRange(curPos, -F_KEEP_DIST_OFFENSE))
                {
                    curPos          = dirCharToPt3Center * (scene.mGround.m3PointRadius + F_KEEP_DIST_DEFENSE) + vPt3Center;
                    player.position = new IM.Vector3(curPos.x, player.position.y, curPos.y);
                }
            }
        }
    }
コード例 #4
0
ファイル: RoadPath.cs プロジェクト: Avatarchik/LockStepDemo
 public Sector(int index)
 {
     idx       = index;
     distance  = IM.Vector2.zero;
     distance1 = IM.Vector2.zero;
     range     = IM.Vector2.zero;
     center    = IM.Vector2.zero;
 }
コード例 #5
0
ファイル: PlayGround.cs プロジェクト: Avatarchik/LockStepDemo
 public Area     GetArea(Player player)
 {
     IM.Vector2 vPlayerPos = player.position.xz;
     if (!In3PointRange(vPlayerPos))
     {
         return(Area.eFar);
     }
     if (InFreeThrowLane(vPlayerPos))
     {
         return(Area.eNear);
     }
     return(Area.eMiddle);
 }
コード例 #6
0
    public bool DoSimulate(int sector, IM.Vector2 angleAdjustment, IM.Number speed, ShootSolution.AnimationType type, IM.Number reductionIndex, ref ShootSolution solution)
    {
        if (sector == -1)
        {
            return(false);
        }

        IM.Vector3 vecInitPos, vecInitVel;
        IM.Vector3 vecFinPos, vecFinVel;

        /*
         * if(sector == 0)
         * {
         *      vecInitPos = m_basket.m_rim.center;
         *      vecInitVel = new IM.Vector3(0.0f, 0.0f, 1.0f);
         *
         *      vecInitVel = Quaternion.AngleAxis(m_fBeta, IM.Vector3.up) * vecInitVel;
         *      vecInitVel = Quaternion.AngleAxis(m_fAlpha, IM.Vector3.Cross(vecInitVel.normalized, IM.Vector3.up)) * vecInitVel;
         *
         *      vecInitVel.Normalize();
         *      vecInitVel *= m_fVel_ini;
         * }
         * else
         */
        {
            vecInitPos   = m_ball.position;
            vecInitVel   = m_basket.m_rim.center - vecInitPos;
            vecInitVel.y = IM.Number.zero;

            vecInitVel = IM.Quaternion.AngleAxis(angleAdjustment.x, IM.Vector3.up) * vecInitVel;
            vecInitVel = IM.Quaternion.AngleAxis(angleAdjustment.y, IM.Vector3.Cross(vecInitVel.normalized, IM.Vector3.up)) * vecInitVel;

            vecInitVel.Normalize();
            vecInitVel *= speed;
        }
        solution.m_vInitPos  = vecInitPos;
        solution.m_vInitVel  = vecInitVel;
        solution.m_vFinPos   = vecInitPos;
        solution.m_vFinVel   = vecInitVel;
        solution.m_vStartPos = vecInitPos;

        _Simulating(vecInitPos, vecInitVel, type, reductionIndex, ref solution);

        vecInitPos = solution.m_vInitPos;
        vecFinPos  = solution.m_vFinPos;
        vecFinVel  = solution.m_vFinVel;

        return(true);
    }
コード例 #7
0
ファイル: PlayGround.cs プロジェクト: Avatarchik/LockStepDemo
    public Area     GetDunkArea(Player player)
    {
        IM.Vector2 vPlayerPos = player.position.xz;
        GameMatch  match      = GameSystem.Instance.mClient.mCurMatch;

        IM.Number fDistance = GameUtils.HorizonalDistance(match.mCurScene.mBasket.m_vShootTarget, player.position);
        if (InFreeThrowLane(vPlayerPos))
        {
            return(Area.eNear);
        }
        return(Area.eMiddle);

        //else if( fDistance < player.m_dunkDistance )
        //	return Area.eMiddle;
        //return Area.eInvalid;
    }
コード例 #8
0
ファイル: PlayGround.cs プロジェクト: Avatarchik/LockStepDemo
    public IM.Number GetDistTo3PTLine(IM.Vector2 pos)
    {
        IM.Vector2 v3PtCenter = new IM.Vector2(mCenter.x + m3PointCenter.x, mCenter.z + m3PointCenter.y);

        IM.Vector2 dir = (pos - v3PtCenter).normalized;
        IM.Vector2 dirPoint3Forward = new IM.Vector2(IM.Number.zero, -IM.Number.one);
        IM.Number  angle            = IM.Vector2.Angle(dir, dirPoint3Forward);
        if (angle > m3PointMaxAngle)
        {
            return(m3PointBaseLine - IM.Math.Abs(pos.x));
        }
        else
        {
            return(m3PointRadius - IM.Vector2.Distance(pos, v3PtCenter));
        }
    }
コード例 #9
0
    IM.Vector3 GetPositionWithOutBall()
    {
        int colomn = RoadPathManager.Instance.m_AngleList.Count;

        IM.Vector2 dirRim2Player = (m_player.position - m_basket.m_rim.center).normalized.xy;
        int        sectorIdx     = 0;
        int        iCol          = 0;

        if (IM.Vector2.Dot(dirRim2Player, IM.Vector2.right) > IM.Number.zero)
        {
            iCol = IM.Random.Range(0, (int)m_player.m_favorSectors.range.x / 2);
        }
        else
        {
            iCol = IM.Random.Range((int)m_player.m_favorSectors.range.x / 2, (int)m_player.m_favorSectors.range.x);
        }

        int iRow = (int)m_player.m_favorSectors.start.y + IM.Random.Range(0, (int)m_player.m_favorSectors.range.y);

        sectorIdx = colomn * iRow + iCol;

        RoadPathManager.Sector sector = RoadPathManager.Instance.m_Sectors[sectorIdx];
        IM.Number dev   = m_system.AI.devFavArea;
        int       count = 0;

        do
        {
            IM.Vector3 pos = new IM.Vector3(sector.center.x + IM.Random.Range(-dev, dev), IM.Number.zero, sector.center.y + IM.Random.Range(-dev, dev));
            sectorIdx = RoadPathManager.Instance.CalcSectorIdx(pos);
        } while (sectorIdx == -1 && count++ < 10);
        if (sectorIdx != -1)
        {
            sector = RoadPathManager.Instance.m_Sectors[sectorIdx];
        }
        else
        {
            Debug.LogError("AI_Positioning, sector(-1). Name:" + m_player.m_name +
                           " SectorIdx:" + sector.idx + " Center:" + sector.center + " Dev:" + dev);
        }
        RoadPathManager.Instance.AddDrawSector(m_player.m_id + "_ToSector", sector);

        return(sector.center.x0z);
    }
コード例 #10
0
    public void ReadyToCountShoot()
    {
        mType = GoalType.eNone;

        IM.Vector3 pPosition = m_player.position;
        IM.Vector2 playerPos = pPosition.xz;
        if (m_curMatch.mCurScene.mGround.InFreeThrowLane(playerPos))
        {
            mType = GoalType.eGoalNear;
        }
        else if (m_curMatch.mCurScene.mGround.In3PointRange(playerPos, IM.Number.zero))
        {
            mType = GoalType.eGoalMiddle;
        }
        else
        {
            mType = GoalType.eGoalFar;
        }

        //Debug.Log("ready to count");
    }
コード例 #11
0
ファイル: AIUtils.cs プロジェクト: Avatarchik/LockStepDemo
    public static void PositionAndShoot(AIState.Type positionState, AIState.Type shootState, GameMatch match, Player player)
    {
        PlayGround ground   = match.mCurScene.mGround;
        Area       currArea = ground.GetArea(player);
        bool       outside  = false;

        if (currArea == Area.eFar)
        {
            outside = !ground.In3PointRange(player.position.xz, ground.mDist3PtOutside);
        }
        Area bestArea = GetBestShootArea(player);

        if (currArea == bestArea && !outside)
        {
            player.m_aiMgr.SetTransaction(shootState);
        }
        else
        {
            IM.Vector2 v3PtCenter       = new IM.Vector2(ground.mCenter.x + ground.m3PointCenter.x, ground.mCenter.z + ground.m3PointCenter.y);
            IM.Vector2 playerPos        = player.position.xz;
            IM.Vector2 basketPos        = match.mCurScene.mBasket.m_vShootTarget.xz;
            IM.Number  fDistanceToNet   = IM.Vector2.Distance(playerPos, basketPos);
            IM.Number  fDistTo3PtCenter = IM.Vector2.Distance(playerPos, v3PtCenter);
            IM.Vector2 dirOut           = (playerPos - v3PtCenter).normalized;
            IM.Number  angle            = IM.Vector2.Angle(dirOut, -IM.Vector2.up);
            IM.Number  dist             = IM.Number.zero;
            IM.Vector2 dir = IM.Vector2.up;
            if (bestArea == Area.eNear)
            {
                dist = fDistanceToNet - match.mCurScene.mGround.mFreeThrowLane;
                dir  = (basketPos - playerPos).normalized;
            }
            else if (bestArea == Area.eMiddle)
            {
                if (currArea == Area.eNear)
                {
                    dist = match.mCurScene.mGround.mFreeThrowLane - dist;
                    dir  = (playerPos - basketPos).normalized;
                }
                else
                {
                    if (angle > ground.m3PointMaxAngle)
                    {
                        dist = IM.Math.Abs(playerPos.x) - ground.m3PointBaseLine;
                        dir  = playerPos.x > IM.Number.zero ? -IM.Vector2.right : IM.Vector2.right;
                    }
                    else
                    {
                        dist = fDistTo3PtCenter - ground.m3PointRadius;
                        dir  = -dirOut;
                    }
                }
            }
            else if (bestArea == Area.eFar)
            {
                if (outside)
                {
                    if (angle > ground.m3PointMaxAngle)
                    {
                        dist = IM.Math.Abs(playerPos.x) - (ground.m3PointBaseLine + ground.mDist3PtOutside);
                        dir  = playerPos.x > IM.Number.zero ? -IM.Vector2.right : IM.Vector2.right;
                    }
                    else
                    {
                        dist = fDistTo3PtCenter - (ground.m3PointRadius + ground.mDist3PtOutside);
                        dir  = -dirOut;
                    }
                }
                else
                {
                    if (angle > ground.m3PointMaxAngle)
                    {
                        dist = ground.m3PointBaseLine - IM.Math.Abs(playerPos.x);
                        dir  = playerPos.x > IM.Number.zero ? IM.Vector2.right : -IM.Vector2.right;
                    }
                    else
                    {
                        dist = ground.m3PointRadius - fDistTo3PtCenter;
                        dir  = dirOut;
                    }
                }
            }

            if (dist < match.gameMode.repositionDist)
            {
                AIState state = player.m_aiMgr.GetState(positionState);
                state.m_moveTarget = player.position + new IM.Vector3(dir.x, IM.Number.zero, dir.y) * dist;
                player.m_aiMgr.SetTransaction(state);
            }
            else
            {
                player.m_aiMgr.SetTransaction(shootState);
            }
        }
    }
コード例 #12
0
ファイル: PlayGround.cs プロジェクト: Avatarchik/LockStepDemo
 public bool In3PointRange(IM.Vector2 pos)
 {
     return(In3PointRange(pos, IM.Number.zero));
 }
コード例 #13
0
ファイル: PlayGround.cs プロジェクト: Avatarchik/LockStepDemo
 public bool In3PointRange(IM.Vector2 pos, IM.Number fOffset)
 {
     IM.Number dist = GetDistTo3PTLine(pos);
     return((dist + fOffset) > 0);
 }
コード例 #14
0
 static public IM.Vector3 XmlGetAttr_IMVec3(XmlElement el)
 {
     IM.Vector2 vec2 = XmlGetAttr_IMVec2(el);
     return(new IM.Vector3(vec2.x, vec2.y, XmlGetAttr_Number(el, "z")));
 }