Beispiel #1
0
    // 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;
        }
    }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 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();
 }
Beispiel #4
0
    IEnumerator StateWait()
    {
        yield return(new WaitForSeconds(Random.Range(1.0f, 3.5f)));

        currentState = SerpentState.Tunnel;
    }
Beispiel #5
0
 public void SetState(SerpentState state)
 {
     currentState = state;
 }
Beispiel #6
0
        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);
        }