コード例 #1
0
    private BoardBall GetEstimatedBoardBall(GameEntity ballEntity, Vector3 hitPos)
    {
        BoardBall res = new BoardBall();

        res.boardIdx = ballEntity.boardBall.boardIdx;

        bool upHit    = hitPos.y > ballEntity.gameObject.gameobject.transform.position.y;
        bool rightHit = hitPos.x > ballEntity.gameObject.gameobject.transform.position.x;

        if (upHit)
        {
            res.boardIdx.x += rightHit ? 1 : -1;
            res.shifted     = ballEntity.boardBall.shifted;
        }
        else
        {
            res.shifted = !ballEntity.boardBall.shifted;
            res.boardIdx.y++;
            if (ballEntity.boardBall.shifted)
            {
                res.boardIdx.x += rightHit ? 1 : 0;
            }
            else
            {
                res.boardIdx.x += rightHit ? 0 : -1;
            }
        }

        if (res.boardIdx.x == -1 || res.boardIdx.y == -1 || res.boardIdx.x > 5)
        {
            res.boardIdx = Vector2.one * -1;
        }

        return(res);
    }
コード例 #2
0
ファイル: GameUtils.cs プロジェクト: ahmedyosri/PucPuc
    public static List <GameEntity> GetChildrenFor(GameEntity[,] boardEntities, BoardBall b)
    {
        List <GameEntity> children     = new List <GameEntity>();
        List <Vector2>    childrenIdxs = b.shifted ? neighborsOfShited : neighborsOfNotShited;

        childrenIdxs = childrenIdxs.GetRange(4, 2);

        foreach (Vector2 v in childrenIdxs)
        {
            int x = (int)(b.boardIdx.x + v.x);
            int y = (int)(b.boardIdx.y + v.y);

            if (y < 0 || y >= BoardManager.length || x < 0 || x >= BoardManager.width)
            {
                continue;
            }

            if (boardEntities[x, y] != null)
            {
                children.Add(boardEntities[x, y]);
            }
        }

        return(children);
    }
コード例 #3
0
ファイル: GameUtils.cs プロジェクト: ahmedyosri/PucPuc
    public static List <GameEntity> GetSiblingsFor(GameEntity[,] boardEntities, BoardBall b)
    {
        List <GameEntity> siblings     = new List <GameEntity>();
        List <Vector2>    siblingsIdxs = b.shifted ? neighborsOfShited : neighborsOfNotShited;

        siblingsIdxs = siblingsIdxs.GetRange(2, 2);

        foreach (Vector2 v in siblingsIdxs)
        {
            int x = (int)(b.boardIdx.x + v.x);
            int y = (int)(b.boardIdx.y + v.y);

            if (y < 0 || y >= BoardManager.length || x < 0 || x >= BoardManager.width)
            {
                continue;
            }

            if (boardEntities[x, y] != null)
            {
                siblings.Add(boardEntities[x, y]);
            }
        }

        return(siblings);
    }
コード例 #4
0
ファイル: GameUtils.cs プロジェクト: ahmedyosri/PucPuc
    private static List <GameEntity> GetCluster(GameEntity[,] boardEntities, Vector2 boardIdx, int val = -1)
    {
        HashSet <GameEntity> visited = new HashSet <GameEntity>();
        Queue <Vector2>      toVisit = new Queue <Vector2>();

        toVisit.Enqueue(boardIdx);

        while (toVisit.Count > 0)
        {
            GameEntity currEntity = GetEntity(boardEntities, toVisit.Peek());
            toVisit.Dequeue();

            BoardBall curr = currEntity.boardBall;

            if (visited.Contains(currEntity))
            {
                continue;
            }

            visited.Add(currEntity);

            var neighborsList = curr.shifted ? neighborsOfShited : neighborsOfNotShited;

            foreach (Vector2 v in neighborsList)
            {
                Vector2 neighborIdx = curr.boardIdx + v;
                if (Mathf.Min(neighborIdx.x, neighborIdx.y) < 0 || neighborIdx.x >= BoardManager.width || neighborIdx.y >= BoardManager.length)
                {
                    continue;
                }
                GameEntity neighborEntity = GetEntity(boardEntities, neighborIdx);
                if (neighborEntity == null)
                {
                    continue;
                }
                if (val != -1 && neighborEntity.boardBall.value != val)
                {
                    continue;
                }
                if (toVisit.Contains(neighborIdx))
                {
                    continue;
                }

                toVisit.Enqueue(neighborIdx);
            }
        }

        return(visited.ToList());
    }
コード例 #5
0
    protected override void Execute(List <InputEntity> entities)
    {
        if (gameContext.GetGroup(GameMatcher.Moving).GetEntities().Length > 0)
        {
            return;
        }

        if (ballEntitiesGroup.GetEntities().Length == 0)
        {
            return;
        }

        Vector3      start, end, dir;
        RaycastHit2D hit;

        linePositions.Clear();
        ballTargets.Clear();
        InputEntity click = entities[0];

        start = GameplayManager.Instance.PrimaryBallPosition.position;
        end   = click.mousePressed.position;
        dir   = (end - start).normalized;

        linePositions.Add(start);

        hit = Physics2D.Raycast(start, dir);
        if (hit.collider && hit.collider.CompareTag("Border"))
        {
            start += dir * hit.distance * 0.98f;
            linePositions.Add(start);
            ballTargets.Add(start);
            dir.x *= -1;
            estimatedBall.transform.position = -10 * Vector3.one;
        }

        ballEntity = ballEntitiesGroup.GetEntities()[0];
        hit        = Physics2D.Raycast(start, dir);
        if (hit.collider && hit.collider.CompareTag("Ball"))
        {
            end = hit.point;
            linePositions.Add(end);

            GameEntity collidedBallEntity = hit.collider.gameObject.GetEntityLink().entity as GameEntity;

            BoardBall tmp = GetEstimatedBoardBall(collidedBallEntity, end);
            ballEntity.boardBall.boardIdx = tmp.boardIdx;
            ballEntity.boardBall.shifted  = tmp.shifted;

            end = GameUtils.WorldPosForBall(ballEntity);
            estimatedBall.transform.position = end;
            linePositions.Add(end);
            ballTargets.Add(end);
        }
        else if (hit.collider && hit.collider.CompareTag("Ceil"))
        {
            end = hit.point;
            linePositions.Add(end);
            bool    isShiftedRow = GameUtils.IsRowShifted(0);
            float   hShift       = end.x - GameplayManager.Instance.ZeroPosition.x + (isShiftedRow ? 0 : 0.5f * GameplayManager.Instance.cellWidth);
            Vector2 idx          = new Vector2((int)(hShift / GameplayManager.Instance.cellWidth), 0);

            Debug.Log(isShiftedRow + " | " + hShift);

            ballEntity.boardBall.boardIdx = idx;
            ballEntity.boardBall.shifted  = isShiftedRow;
            end = GameUtils.WorldPosForBall(ballEntity);
            estimatedBall.transform.position = end;
            linePositions.Add(end);
            ballTargets.Add(end);
        }
        else
        {
            linePositions.Clear();
            ballTargets.Clear();
            UpdateAimLine();
            return;
        }

        ballEntity.ReplaceTargetPositions(GameplayManager.Instance.ballFiringSpeed, ballTargets);
        UpdateAimLine();
    }
コード例 #6
0
    protected override void Execute(List <GameEntity> entities)
    {
        BoardBall primaryBall = entities[0].boardBall;

        lineMaterial.SetColor("_Color", GameplayManager.Instance.ColorsDic.colors[primaryBall.value]);
    }