// Update is called once per frame void Update() { switch (currentState) { case SerpentState.Tunnel: switch (tunnelState) { case TunnelState.Attack: head.position = Vector2.MoveTowards(head.position, targetTransform.position, moveSpeed * Time.deltaTime); if (Vector3.Distance(head.position, targetTransform.position) < 0.1f) { if (targetTransform.childCount > 0) { targetTransform = targetTransform.GetChild(0).transform; } else { tunnelState = TunnelState.Teleport; } } break; case TunnelState.Search: RandomizeTarget(); targetTransform = Tunnels[currentTunnel][Random.Range(0, 3)]; head.gameObject.GetComponent <RotateToTarget>().SetTarget(targetTransform); tunnelState = TunnelState.Attack; break; case TunnelState.Teleport: RandomizeTarget(); int t = Random.Range(0, 3); targetTransform = Tunnels[currentTunnel][t]; head.position = targetTransform.GetChild(0).position; serpentBody.Coil(); tunnelState = TunnelState.Burrow; break; case TunnelState.Burrow: head.position = Vector2.MoveTowards(head.position, targetTransform.position, moveSpeed * Time.deltaTime); if (Vector3.Distance(head.position, targetTransform.position) < 0.1f) { tunnelState = TunnelState.Search; StartCoroutine(StateWait()); currentState = SerpentState.Wait; } break; } break; case SerpentState.Bounce: break; case SerpentState.Wait: break; } }
private SerpentState SerpentMove() { Cell celNext = serpent.AStarMove2Goal(map.CellFood); SerpentState index_move = CheckSerpentMove(celNext); if (index_move == SerpentState.Error) { GameError(); } else if (index_move == SerpentState.Finish) { GameFinish(); } return(index_move); }
private void Work() { map.SetFood(serpent); while (IsWork) { if (autoPlay) { SerpentState state = SerpentMove(); if (state == SerpentState.Moving) { Thread.Sleep(sleeptime); } else { IsWork = false; } } else { if (keyBuffer.Count > 0) { Keys key = keyBuffer.Pop(); SerpentState state = DoKeydown(key); keyBuffer.Clear(); if (state == SerpentState.Moving) { Thread.Sleep(QUICKMOVING_TIME); } else { IsWork = false; } } } } map.ResetMap(); }
IEnumerator StateWait() { yield return(new WaitForSeconds(Random.Range(1.0f, 3.5f))); currentState = SerpentState.Tunnel; }
public void SetState(SerpentState state) { currentState = state; }
private SerpentState DoKeydown(Keys key) { Cell head = serpent.GetHead(); Cell cell = null; switch (key) { case Keys.Left: cell = map.GetCell(head.Row, head.Col - 1); if (CannotMoveByKeyboard(cell)) { return(SerpentState.Moving); } break; case Keys.Right: cell = map.GetCell(head.Row, head.Col + 1); if (CannotMoveByKeyboard(cell)) { return(SerpentState.Moving); } break; case Keys.Up: cell = map.GetCell(head.Row - 1, head.Col); if (CannotMoveByKeyboard(cell)) { return(SerpentState.Moving); } break; case Keys.Down: cell = map.GetCell(head.Row + 1, head.Col); if (CannotMoveByKeyboard(cell)) { return(SerpentState.Moving); } break; case Keys.F1: cell = serpent.AStarMove2Goal(map.CellFood); break; case Keys.Escape: if (IsWork) { IsWork = false; this.BeginInvoke(new MethodInvoker(delegate() { btnPause.Text = "再開"; })); } return(SerpentState.Pause); } SerpentState index_move = CheckSerpentMove(cell); if (index_move == SerpentState.Error) { GameError(); } else if (index_move == SerpentState.Finish) { GameFinish(); } return(index_move); }