// Use this for initialization private IEnumerator Start() { _audio = GetComponent <AudioSource>(); Pool = new Tsumu[_tsumus.Length, Amount]; _adjacencyMatrix = new byte[_tsumus.Length, Amount, Amount]; _nextActive = new Queue <int> [_tsumus.Length]; for (int i = 0; i < _tsumus.Length; i++) { _tsumus[i].TargetId = i; _nextActive[i] = new Queue <int>(); for (int j = 0; j < Amount; j++) { Tsumu t = Instantiate(_tsumus[i]); t.gameObject.SetActive(false); Pool[i, j] = t; t.Id = j; t.Collection = this; _nextActive[i].Enqueue(j); } } while (true) { int r = (int)(Mathf.Sqrt((float)Level / _maxLevel) * 3 + 2); int i = Random.Range(0, Mathf.Clamp(r, 2, _tsumus.Length)); Create(i, new Vector2(Random.Range(-3f, 3f), Random.Range(12f, 20f))); // print((int)(Mathf.Sqrt((float)Level / _maxLevel) * 3 + 2) + "," + (_fallRate * Count / (Level + 1) + r * 0.1f)); yield return(new WaitForSeconds(_fallRate * Count / (Level + 1) + r * 0.05f)); } }
public void SearchDiserasable(Tsumu tsumu) { if (HaveErase(tsumu)) { return; } SearchToNormal(tsumu); }
private IEnumerator Check(Tsumu tsumu) { while (tsumu && tsumu.State != State) { yield return(null); } Neighbors.Remove(tsumu); }
public void SearchErasable(Tsumu tsumu) { if (_isSearchingErasable || _erasableSet.Count > 0 && _erasableSet.First().GetType() != tsumu.GetType()) { return; } _isSearchingErasable = true; SearchToErase(tsumu); _isSearchingErasable = false; }
public Tsumu Create(int target, Vector2 position) { if (_nextActive[target].Count == 0) { return(null); } Tsumu t = Pool[target, _nextActive[target].Dequeue()]; t.gameObject.SetActive(true); t.transform.position = position; t.tag = "Untagged"; //一時的に記述 Count++; return(t); }
private static void SearchToNormal(Tsumu tsumu) { if (tsumu.State != TsumuState.Searched) { return; } tsumu.State = TsumuState.Normal; tsumu.Renderer.color = Color.white; var array = tsumu.Neighbors.Where(t => t.State == TsumuState.Searched).ToArray(); foreach (var t in array) { SearchToNormal(t); } }
/*private void GetNeihnors(Tsumu tsumu, ISet<Tsumu> set) * { * foreach (var t in tsumu.Neighbors.Where(t => !set.Contains(t))) * { * set.Add(t); * GetNeihnors(t, set); * } * }*/ private static Tsumu GetErase(Tsumu tsumu, IEnumerable <Tsumu> set, ICollection <Tsumu> searched) { Tsumu erase = null; foreach (var t in set) { searched.Add(t); if (t.State == TsumuState.Erase) { erase = t; break; } erase = GetErase(t, t.Neighbors.Where(ts => !searched.Contains(ts)), searched); } return(erase); }
public void ControlTsumuby(Touch touch) { _tsumu = GetTsumuOn(touch.position); if (!_tsumu) { return; } switch (touch.phase) { case TouchPhase.Began: if (_touchId != -1 || !InScreen(touch.position)) { return; //-1の時以外は既に追跡を開始している } _touchId = touch.fingerId; //今回追いかけるタッチがどれか決める _tsumu.Eraser.SearchErasable(_tsumu); _tsumu.Eraser.AddEraseList(_tsumu); break; case TouchPhase.Moved: if (touch.fingerId != _touchId) { return; } _tsumu.Eraser.AddEraseList(_tsumu); break; case TouchPhase.Ended: case TouchPhase.Canceled: if (touch.fingerId != _touchId || !isActiveAndEnabled) { return; } StartCoroutine(_tsumu.Eraser.Attack(_supportEmitter, _opponentEmitter)); _touchId = -1; _tsumu = null; break; case TouchPhase.Stationary: break; default: throw new ArgumentOutOfRangeException(); } }
public void SearchToErase(Tsumu tsumu) { _erasableSet.Add(tsumu); if (tsumu.State != TsumuState.Normal) { return; } tsumu.Renderer.color = Color.gray; tsumu.State = TsumuState.Searched; var array = tsumu.Neighbors.Where(t => t.State != TsumuState.Searched).ToArray(); foreach (var t in array) { SearchToErase(t); } }
public void AddErase(Tsumu tsumu) { if (tsumu.State != TsumuState.Erasable) { return; } if (_touchedTsumu) { if (_adjacencyMatrix[tsumu.TargetId, tsumu.Id, _touchedTsumu.Id] != 1) { return; } _touchedTsumu.ChangeState(TsumuState.Erase); } tsumu.ChangeState(TsumuState.Erase); _touchedTsumu = tsumu; _eraseStack.Push(tsumu); }
private void ControlTsumu(Touch touch) { _tsumu = GetTsumuOn(touch.position); switch (touch.phase) { case TouchPhase.Began: if (!InScreen(touch.position)) { return; //-1の時以外は既に追跡を開始している } _touchId = touch.fingerId; //今回追いかけるタッチがどれか決める if (_tsumu) { _collection.Search(_tsumu.TargetId, _tsumu.Id); } break; case TouchPhase.Moved: //if(touch.fingerId != _touchId) return; if (_tsumu) { _collection.AddErase(_tsumu); } break; case TouchPhase.Ended: case TouchPhase.Canceled: //if (touch.fingerId != _touchId || !isActiveAndEnabled) return; // print("cancel"); StartCoroutine(_collection.Release()); _touchId = -1; _tsumu = null; break; case TouchPhase.Stationary: break; default: throw new ArgumentOutOfRangeException(); } }
public void AddEraseList(Tsumu tsumu) { if (tsumu.State != TsumuState.Searched) { return; } if (_eraseSet.Count > 0) { var peek = _eraseSet.Peek(); if (!peek.Neighbors.Contains(tsumu)) { return; //前のツムに隣接していないものは消せない } if (tsumu != peek) { peek.Renderer.color = new Color(0, 0, 0, 1); //先ほどまで触っていたツムの色を暗くする } } tsumu.State = TsumuState.Erase; tsumu.Renderer.color = new Color(0, 0, 0, 0.5f); _eraseSet.Push(tsumu); }
public IEnumerator Release() { _release(TsumuState.Normal); _touchedTsumu = null; //Stack<Tsumu> stack = new Stack<Tsumu>(_eraseStack); Tsumu[] array = _eraseStack.ToArray(); int len = array.Length; _eraseStack.Clear(); if (array.Length < _minCount) { yield break; } for (int i = 0; i < len; i++) { Tsumu t = array[i]; Delete(t.TargetId, t.Id); CalculateValue(len); _audio.pitch = Combo * 0.05f + 1; _audio.Play(); yield return(new WaitForSeconds(0.075f)); } //if (stack.Count < _minCount) yield break; /*while (stack.Count != 0) * { * Tsumu t = stack.Pop(); * Delete(t.TargetId,t.Id); * CalculateValue(++ren); * _audio.pitch = Combo * 0.05f + 1; * _audio.Play(); * yield return new WaitForSeconds(0.075f); * }*/ // StartCoroutine(ComboObserve()); }
// Use this for initialization private void OnEnable() { _parent = transform.parent.GetComponent <Tsumu>(); }
private static bool HaveErase(Tsumu tsumu) { return(GetErase(tsumu, tsumu.Neighbors, new HashSet <Tsumu> { tsumu })); }