コード例 #1
0
 public void Move(Coordinate newPosition)
 {
     State            = SpaceObjectState.Moving;
     PreviousPosition = GridPosition;
     GridPosition     = newPosition;
     Destination      = GameField.GetVectorFromCoord(newPosition.X, newPosition.Y);
 }
コード例 #2
0
 void OnMouseDown()
 {
     if (GameField.IsAnyMoving() || !IsAsteroid() || IsFrozen)
     {
         return;
     }
     if (State == SpaceObjectState.Default)
     {
         if (GameField.ClickedObject == null)
         {
             GameField.ClickedObject = GridPosition;
             State = SpaceObjectState.Clicked;
         }
         else
         {
             if (GridPosition.IsNeighbourWith(GameField.ClickedObject.Value))
             {
                 GameField.Map[GameField.ClickedObject.Value.X, GameField.ClickedObject.Value.Y].State = SpaceObjectState.Default;
                 State = SpaceObjectState.Default;
                 GameField.Swap(GridPosition, GameField.ClickedObject.Value);
             }
             else
             {
                 GameField.Map[GameField.ClickedObject.Value.X, GameField.ClickedObject.Value.Y].State = SpaceObjectState.Default;
                 GameField.ClickedObject = null;
                 State = SpaceObjectState.Default;
             }
         }
     }
     else if (State == SpaceObjectState.Clicked)
     {
         State = SpaceObjectState.Default;
         GameField.ClickedObject = null;
     }
 }
コード例 #3
0
 private void HandleBlackHole()
 {
     if (State == SpaceObjectState.Decreasing)
     {
         Vector3 scale = transform.localScale;
         scale.x -= GrowSpeed / 1.5f;
         scale.y -= GrowSpeed / 1.5f;
         if (scale.x <= 0.1)
         {
             State = SpaceObjectState.Growing;
             GameField.Map[blackHoleTarget.X, blackHoleTarget.Y].IsTargetForBlackHole = false;
             GameField.Jump(GridPosition, blackHoleTarget);
         }
         transform.localScale = scale;
     }
     transform.Rotate(0f, 0f, -100f * Time.deltaTime);
     if (Game.TurnsLeft % 4 == 0)
     {
         if (!blackHoleHasJumped && !GameField.IsAnyMoving())
         {
             JumpBlackHole();
         }
     }
     else
     {
         blackHoleHasJumped = false;
     }
 }
コード例 #4
0
    public void Initialise(int x, int y, char type, float delay = 0, bool isUnstable = false)
    {
        DropSpeed    = BaseDropSpeed * 2;
        MoveSpeed    = 10f;
        GrowSpeed    = 0.05f;
        IsUnstable   = isUnstable;
        GridPosition = new Coordinate(x, y);
        TypeOfObject = CharsToObjectTypes[type];
        if (TypeOfObject == SpaceObjectType.BlackHole)
        {
            var light = gameObject.GetComponentInChildren <Light>();
            light.enabled = true;
            light.range   = 1.33f;
            light.color   = Color.blue;
        }
        if (isUnstable)
        {
            gameObject.GetComponent <SpriteRenderer>().sprite = StableToUnstableSprites[TypeOfObject];
        }
        else
        {
            gameObject.GetComponent <SpriteRenderer>().sprite = SpaceObjectTypesToSprites[TypeOfObject];
        }

        Destination = GameField.GetVectorFromCoord(GridPosition.X, GridPosition.Y);
        if (delay > 0)
        {
            Delay     = delay;
            StartTime = Time.time;
            State     = SpaceObjectState.WaitingForInitialising;
            return;
        }
        State = SpaceObjectState.Growing;
    }
コード例 #5
0
    private void JumpBlackHole()
    {
        blackHoleHasJumped = true;
        var map = GameField.Map;
        var unsuitableAsteroids = new List <SpaceObjectType>();

        if (GridPosition.X > 0 && map[GridPosition.X - 1, GridPosition.Y] != null)
        {
            unsuitableAsteroids.Add(map[GridPosition.X - 1, GridPosition.Y].TypeOfObject);
        }
        if (GridPosition.Y > 0 && map[GridPosition.X, GridPosition.Y - 1] != null)
        {
            unsuitableAsteroids.Add(map[GridPosition.X, GridPosition.Y - 1].TypeOfObject);
        }
        if (GridPosition.X < map.GetLength(0) - 1 && map[GridPosition.X + 1, GridPosition.Y] != null)
        {
            unsuitableAsteroids.Add(map[GridPosition.X + 1, GridPosition.Y].TypeOfObject);
        }
        if (GridPosition.Y < map.GetLength(1) - 1 && map[GridPosition.X, GridPosition.Y + 1] != null)
        {
            unsuitableAsteroids.Add(map[GridPosition.X, GridPosition.Y + 1].TypeOfObject);
        }
        unsuitableAsteroids = unsuitableAsteroids.Distinct().ToList();
        var coords = new List <Coordinate>();

        for (int i = 0; i < map.GetLength(0); i++)
        {
            for (int j = 0; j < map.GetLength(1); j++)
            {
                if (map[i, j] != null && map[i, j].IsAsteroid() && !unsuitableAsteroids.Contains(map[i, j].TypeOfObject)
                    &&
                    ((j < map.GetLength(1) - 1 && map[i, j + 1] != null &&
                      map[i, j].TypeOfObject == map[i, j + 1].TypeOfObject) ||
                     (j > 0 && map[i, j - 1] != null &&
                      map[i, j].TypeOfObject == map[i, j - 1].TypeOfObject) ||
                     (i > 0 && map[i - 1, j] != null &&
                      map[i, j].TypeOfObject == map[i - 1, j].TypeOfObject) ||
                     (i < map.GetLength(0) - 1 && map[i + 1, j] != null &&
                      map[i, j].TypeOfObject == map[i + 1, j].TypeOfObject)))
                {
                    coords.Add(map[i, j].GridPosition);
                    if (map[i, j].IsUnstable)
                    {
                        State           = SpaceObjectState.Decreasing;
                        blackHoleTarget = new Coordinate(i, j);
                        if (!GameField.Map[blackHoleTarget.X, blackHoleTarget.Y].IsTargetForBlackHole)
                        {
                            GameField.Map[blackHoleTarget.X, blackHoleTarget.Y].IsTargetForBlackHole = true;
                            return;
                        }
                    }
                }
            }
        }
        if (coords.Count > 0)
        {
            State           = SpaceObjectState.Decreasing;
            blackHoleTarget = coords.ElementAt(rnd.Next(coords.Count));
            if (!GameField.Map[blackHoleTarget.X, blackHoleTarget.Y].IsTargetForBlackHole)
            {
                GameField.Map[blackHoleTarget.X, blackHoleTarget.Y].IsTargetForBlackHole = true;
            }
        }
    }
コード例 #6
0
    void Update()
    {
        if (State == SpaceObjectState.WaitingForInitialising)
        {
            if (Time.time - StartTime > Delay)
            {
                State = SpaceObjectState.Dropping;
            }
            else
            {
                return;
            }
        }
        if (Destination != gameObject.transform.position && State != SpaceObjectState.Moving)
        {
            State = SpaceObjectState.Dropping;
        }

        if (gameObject.transform.localScale.x < 1 && State != SpaceObjectState.Decreasing)
        {
            Vector3 scale = transform.localScale;
            if (IsUnstable)
            {
                scale.x = 1;
                scale.y = 1;
            }
            else
            {
                scale.x += GrowSpeed;
                scale.y += GrowSpeed;
            }
            gameObject.transform.localScale = scale;
            if (gameObject.transform.localScale.x < 0.90)
            {
                return;
            }
        }
        else if (State == SpaceObjectState.Growing)
        {
            State = SpaceObjectState.Default;
        }
        if (TypeOfObject == SpaceObjectType.BlackHole)
        {
            HandleBlackHole();
        }
        if (IsUnstable && rnd.Next(2) == 1)
        {
            Vector3 scale = transform.localScale;
            scale.x -= 0.05f;
            scale.y -= 0.05f;
            gameObject.transform.localScale = scale;
        }
        if (State == SpaceObjectState.Moving || State == SpaceObjectState.Dropping)
        {
            if (transform.position.Equals(Destination))
            {
                if (State == SpaceObjectState.Moving && !GameField.MoveIsFinished)
                {
                    if (!GameField.IsCorrectMove(new List <Coordinate>()
                    {
                        GridPosition, PreviousPosition
                    }))
                    {
                        GameField.Swap(GridPosition, PreviousPosition);
                    }
                    else
                    {
                        GameField.MoveIsFinished = true;
                        Game.TurnsLeft--;
                        Game.instance.Update();
                    }
                }
                State = SpaceObjectState.Default;
            }
            else
            {
                float step;
                step = State == SpaceObjectState.Dropping ? this.DropSpeed * Time.deltaTime : this.MoveSpeed * Time.deltaTime;
                transform.position = Vector3.MoveTowards(transform.position, Destination, step);
            }
        }
        if (IsAsteroid())
        {
            gameObject.GetComponentInChildren <Light>().enabled = State == SpaceObjectState.Clicked;
        }

        if (IsAsteroid() && !IsFrozen && State != SpaceObjectState.Moving && GridPosition.Y != Game.MAP_SIZE - 1)
        {
            DropAsteroid();
        }
    }