public void Move(Coordinate newPosition) { State = SpaceObjectState.Moving; PreviousPosition = GridPosition; GridPosition = newPosition; Destination = GameField.GetVectorFromCoord(newPosition.X, newPosition.Y); }
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; } }
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; } }
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; }
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; } } }
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(); } }