Exemple #1
0
    private void DeleteSnake(GameObject head)
    {
        SnakePart part = head.GetComponent <SnakePart>();

        //si hay siguiente parte llamamos a esta función pero de esa parte
        if (part.nextPart)
        {
            DeleteSnake(part.nextPart);
        }

        //finalmente borramos el objecto
        Destroy(head);
    }
Exemple #2
0
    protected virtual void QuarterTile()    // TODO rename this
    {
        if (indexInSnake < World.currentEnergy && tail == null)
        {
            tail = Instantiate(another, transform.parent).GetComponent <SnakePart>();
            tail.indexInSnake = indexInSnake + 1;
        }

        if (tail != null)
        {
            tail.Instruct(currentSection, Animation.clip);
        }
    }
Exemple #3
0
 private void MoveSnake()
 {
     while (snakeParts.Count >= snakeLength)
     {
         GameArea.Children.Remove(snakeParts[0].UiElement);
         snakeParts.RemoveAt(0);
     }
     foreach (SnakePart snakePart in snakeParts)
     {
         (snakePart.UiElement as Rectangle).Fill = snakeBodyBrush;
         snakePart.IsHead = false;
     }
     SnakePart snakeHead = snakeParts[^ 1];
Exemple #4
0
    bool eat()
    {
        bool flag = Foods.Instance.Eat(snake[0].targetPos);

        if (flag)
        {
            GameObject body = Game.Instance.Clone(Config.Instance.PrefabBody, snake[0].trans.parent.gameObject);
            SnakePart  part = new SnakePart(body);
            part.Copy(snake[snake.Count - 2]);
            snake.Insert(snake.Count - 1, part);
        }

        return(flag);
    }
Exemple #5
0
    public bool CanMove(Vector2Int _WantedTilePosition)
    {
        CustomTile wantedTile = GameData.Instance.m_TileManager.GetTile(_WantedTilePosition);

        if (wantedTile == null)
        {
            return(false);
        }

        List <GameObject> entities = wantedTile.m_Entities;

        if (wantedTile != null)
        {
            if (entities.Count > 0)
            {
                for (int i = 0; i < entities.Count; i++)
                {
                    if (!wantedTile.m_Walkable)
                    {
                        return(false);
                    }
                    else
                    {
                        SnakePart snakePart = entities[i].GetComponent <SnakePart>();
                        if (snakePart != null && !snakePart.m_CanWalkOnItself)
                        {
                            Debug.Log("Hit my queue");
                            Hit();
                        }
                        else
                        {
                            Debug.Log("CHECK ITEM");
                            Item item;
                            bool doesItemExists = ItemManager.Instance.CheckItem(_WantedTilePosition, out item);
                            if (doesItemExists)
                            {
                                Debug.Log("ITEM EXISTS");
                                m_HasItem = true;
                                ItemManager.Instance.SetImageUIActive(true);
                                ItemManager.Instance.DestroyItem(_WantedTilePosition, item);
                            }
                        }
                    }
                }
            }
            return(true);
        }
        return(false);
    }
Exemple #6
0
    public void AddPart()
    {
        GameObject g = Instantiate(snakePart, ultimaParte.transform.position, ultimaParte.transform.rotation);

        SnakePart ultimaParteP = ultimaParte.GetComponent <SnakePart>();
        SnakePart part         = g.GetComponent <SnakePart>();

        g.name = "parte" + numParts;
        ultimaParteP.SetNextPart(g);
        ultimaParte        = g;
        g.transform.parent = snake.transform;
        numParts++;

        part.SetNextPosition(ultimaParteP.GetNextPosition());
    }
Exemple #7
0
    public void ReverseOrder(SnakePart newTail)
    {
        if (tail)
        {
            tail.ReverseOrder(this);
        }

        if (newTail)
        {
            transform.position = newTail.transform.position;
        }

        tail      = newTail;
        moveCount = 0;
    }
Exemple #8
0
 public void Attach(SnakePart part)
 {
     if (tail)
     {
         tail.Attach(part);
     }
     else
     {
         part.transform.position = transform.position;
         tail                 = part;
         tail.index           = index + 1;
         tail.gameObject.name = "Tail " + tail.index;
         mid.parent           = transform.parent;
         part.moveDirection   = moveDirection;
     }
 }
Exemple #9
0
    public SnakePart[] Move(SnakePart[] myOldSnake, Vector2 direction)
    {
        SnakePart[] myNewSnake = new SnakePart[myOldSnake.Length];


        myNewSnake[0].setPosition(myOldSnake[0].getPosition() + direction);

        for (int i = 0; i < myNewSnake.Length - 1; i++)
        {
            myNewSnake[i + 1] = myOldSnake[i];
        }



        return(myNewSnake);
    }
Exemple #10
0
    private void CalculaNextPosition(SnakePart part)
    {
        Vector2 currentDirection     = part.GetCurrentDirection(); //dirección actual
        Vector2 currentPosition      = part.GetPrevPosition();     //posición desde la que calculamos la siguiente
        float   desplazacimentoTotal = part.getWidth();            //cuanto desplazamiento entre prev y next ha de existir (es el ancho del sprite de la serpiente)

        Vector2 nextPosition = new Vector2(currentPosition.x + (desplazacimentoTotal * currentDirection.x), currentPosition.y + (desplazacimentoTotal * currentDirection.y));

        //asignamos la anterior dirección como siguiente dirección de la siguiente parte si tiene siguiente parte
        if (part.GetNextPart())
        {
            part.GetNextPart().GetComponent <SnakePart>().AddDirection(part.GetCurrentDirection());
        }

        //asignamos la nueva siguiente posición calculada
        part.SetNextPosition(nextPosition);
    }
Exemple #11
0
        // get next position of snake depends the actual direction
        private (int, int) calculateNextHeadPosition()
        {
            SnakePart head = snake.SnakeBodyParts[0];

            var(iPos, jPos) = head;

            // next i j snake positions in board.
            // almost like a plain object in JavaScript.
            Dictionary <int, (int, int)> places = new Dictionary <int, (int, int)>();

            places.Add(37, (iPos, jPos - 1));  // left
            places.Add(38, (iPos - 1, jPos));  // up
            places.Add(39, (iPos, jPos + 1));  // right
            places.Add(40, (iPos + 1, jPos));  // down

            return(places[(int)direction]);
        }
Exemple #12
0
        void CheckToCatchFood()
        {
            int tempPosSnakeX;
            int tempPosSnakeY;

            int tempPosFoodX;
            int tempPosFoodY;

            for (int i = 0; i < elements.Count(); i++)
            {
                if (elements[i].GetType() == typeof(SnakePart))
                {
                    SnakePart sp = (SnakePart)elements[i];

                    if (sp.IsHead == true)
                    {
                        tempPosSnakeX = elements[i].Left / sizeRect;
                        tempPosSnakeY = elements[i].Top / sizeRect;

                        for (int j = 0; j < elements.Count(); j++)
                        {
                            if (elements[j].GetType() == typeof(Food))
                            {
                                Food fd = (Food)elements[j];

                                tempPosFoodX = elements[j].Left / sizeRect;
                                tempPosFoodY = elements[j].Top / sizeRect;

                                if (tempPosSnakeX == tempPosFoodX && tempPosSnakeY == tempPosFoodY)
                                {
                                    //MessageBox.Show("Наехали на еду");
                                    AddPartSnake();
                                    // Удалим найденную еду.
                                    elements.Remove(fd);
                                    // Добавим новую еду.
                                    AddFood();
                                    // Увеличим скорость змейки.
                                    IncreaseSpeedSnake();
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #13
0
    public void Chop(int len)
    {
        if (tail)
        {
            tail.Chop(len);
        }

        if (len <= index)
        {
            tail = null;
        }

        if (len < index)
        {
            mid.parent = transform;
            partPool.ReturnToPool(this);
        }
    }
Exemple #14
0
    private void CreateSnakeParts()
    {
        //add body
        Vector3Int pos = Vector3Int.FloorToInt(transform.position);

        pos.x -= startDirection.Value.x;
        pos.y -= startDirection.Value.y;
        snakeParts.Add(snakePool.Spawn <SnakePart> (pos, transform.rotation));
        grid.RemoveAvaliableCell(pos);

        //add tail
        pos.x -= startDirection.Value.x;
        pos.y -= startDirection.Value.y;
        SnakePart tail = Instantiate(TailPrefab, pos, transform.rotation).GetComponent <SnakePart> ();

        snakeParts.Add(tail);
        grid.RemoveAvaliableCell(pos);
    }
    public static SnakePart[] Grow(SnakePart[] myOldSnake, Vector2 direction, Vector2 foodPosition, float myScale)
    {
        SnakePart[] myNewSnake   = new SnakePart[myOldSnake.Length + 1];
        SnakePart   newSnakePart = new SnakePart();

        newSnakePart.Spawn(lastTailPosition, myScale, Color.blue);
        myNewSnake[myNewSnake.Length - 1] = newSnakePart;



        for (int i = 0; i < myOldSnake.Length; i++)
        {
            myNewSnake[i] = myOldSnake[i];
        }



        snakeSize = myNewSnake.Length;
        return(myNewSnake);
    }
Exemple #16
0
 private SnakeDirection GetCoadaDirection(SnakePart prev, SnakePart sp)
 {
     if (prev.PositionOnY == sp.PositionOnY + 1)
     {
         return(SnakeDirection.Down);
     }
     if (prev.PositionOnY == sp.PositionOnY - 1)
     {
         return(SnakeDirection.Up);
     }
     if (prev.PositionOnX == sp.PositionOnX + 1)
     {
         return(SnakeDirection.Right);
     }
     if (prev.PositionOnX == sp.PositionOnX - 1)
     {
         return(SnakeDirection.Left);
     }
     return(SnakeDirection.Up);
 }
Exemple #17
0
    void Start()
    {
        moveWatch = new Stopwatch();
        moveWatch.Start();
        direction     = Direction.Left;
        movementQueue = new Queue <Direction>();

        player = ReInput.players.GetPlayer(playerId);

        GameObject headGameObject = Instantiate(Prefabs.SnakePartHead, transform);

        head = headGameObject.GetComponent <SnakePart>();

        body = new List <SnakePart>();
        for (int i = 0; i < startLength; i++)
        {
            GameObject bodyGameObject = Instantiate(Prefabs.SnakePartBody, new Vector3(-Constants.GridSize * (i + 1), 0, 0), Quaternion.identity, transform);
            body.Add(bodyGameObject.GetComponent <SnakePart>());
        }
    }
Exemple #18
0
        /// <summary>
        /// Vérification de collision pour le serpent.
        /// </summary>
        private void DoCollisionCheckWall()
        {
            // Récupération de la tête du serpent
            SnakePart snakeHead = snakeParts[snakeParts.Count - 1];

            // Vérification d'une collision avec les murs
            if ((snakeHead.GetPosition().Y < 0) || (snakeHead.GetPosition().Y >= GameArea.ActualHeight) ||
                (snakeHead.GetPosition().X < 0) || (snakeHead.GetPosition().X >= GameArea.ActualWidth))
            {
                EndGame();
            }

            // Vérification d'une collision avec une partie du serpent
            foreach (SnakePart snakeBodyPart in snakeParts.Take(snakeParts.Count - 1))
            {
                if ((snakeHead.GetPosition().X == snakeBodyPart.GetPosition().X) && (snakeHead.GetPosition().Y == snakeBodyPart.GetPosition().Y))
                {
                    EndGame();
                }
            }
        }
Exemple #19
0
 void calcCrash()
 {
     foreach (Snake si in snakes.Values)
     {
         if (si.Dead)
         {
             continue;
         }
         SnakePart headi = si.snake[0];
         foreach (Snake sj in snakes.Values)
         {
             if (si.id == sj.id)
             {
                 continue;
             }
             if (checkCrash(headi, sj.snake[0]))
             {
                 // 头和头相撞
                 si.Dead = true;
                 sj.Dead = true;
                 Debug.Log(string.Format("snake[{0}] crash snake[{1}] head to head", si.id, sj.id));
                 break;
             }
             else
             {
                 for (int j = 1; j < sj.snake.Count; j++)
                 {
                     // 头和身子相撞
                     if (checkCrash(headi, sj.snake[j]))
                     {
                         Debug.Log(string.Format("snake[{0}] head crash snake[{1}] body", si.id, sj.id));
                         si.Dead = true;
                         break;
                     }
                 }
             }
         }
     }
 }
Exemple #20
0
    public void grow(int count)
    {
        SnakeTail snakeTail;

        for (int i = 0; i < count; i++)
        {
            snakeTail = TileManager.instance.BuildSnakeTail();
            snakeTail.AttachedSnakePart = LastSnakePart;
            snakeTail.PartNumber        = scoreHandler.Lenth;

            snakeTail.onBite          += OnTailEaten;
            snakeTail.onLastSnakePart += OnNewLastSnakePart;

            //Debug.Log("new soldier " + snakeTail.PartNumber);
            snakeTail.transform.position = LastSnakePart.transform.position;
            //
            LastSnakePart.tile.AddObject(snakeTail);

            //OnMoved += snakeTail.MoveToNext;

            LastSnakePart = snakeTail;
        }
    }
Exemple #21
0
    private void ControlMovement(SnakePart part)
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical   = Input.GetAxis("Vertical");

        //si hay algun tipo de movimiento añadimos la dirección a la pila de direcciones
        if (moveHorizontal != 0 || moveVertical != 0)
        {
            //si pulsamos derecha
            if (moveHorizontal > 0)
            {
                part.AddDirection(Vector2.right);
            }
            //si pulsamos izquierda
            else if (moveHorizontal < 0)
            {
                part.AddDirection(Vector2.left);
            }
            //si pusamos arriba
            else if (moveVertical > 0)
            {
                part.AddDirection(Vector2.up);
            }
            //si pulsamos abajo
            else if (moveVertical < 0)
            {
                part.AddDirection(Vector2.down);
            }

            //si aun no nos movemos, cogemos directamente la siguiente dirección
            if (part.GetCurrentDirection() == Vector2.zero)
            {
                part.NextDirection();
            }
        }
    }
Exemple #22
0
        //fetches the correct snake texture based on the designated direction and part
        public Texture2D getSnakeTexture(Direction direction, SnakePart part)
        {
            Texture2D result = null;

            switch (part)
            {
            case SnakePart.head:
                if (switchTongue)
                {
                    if (direction == Direction.up)
                    {
                        return(tongueUp);
                    }
                    else if (direction == Direction.down)
                    {
                        return(tongueDown);
                    }
                    else if (direction == Direction.left)
                    {
                        return(tongueLeft);
                    }
                    else if (direction == Direction.right)
                    {
                        return(tongueRight);
                    }
                }
                else
                {
                    if (direction == Direction.up)
                    {
                        return(headUp);
                    }
                    else if (direction == Direction.down)
                    {
                        return(headDown);
                    }
                    else if (direction == Direction.left)
                    {
                        return(headLeft);
                    }
                    else if (direction == Direction.right)
                    {
                        return(headRight);
                    }
                }

                break;

            case SnakePart.body:
                if (direction == Direction.up)
                {
                    return(bodyUp);
                }
                else if (direction == Direction.down)
                {
                    return(bodyDown);
                }
                else if (direction == Direction.left)
                {
                    return(bodyLeft);
                }
                else if (direction == Direction.right)
                {
                    return(bodyRight);
                }

                break;

            case SnakePart.tail:
                if (direction == Direction.up)
                {
                    return(tailUp);
                }
                else if (direction == Direction.down)
                {
                    return(tailDown);
                }
                else if (direction == Direction.left)
                {
                    return(tailLeft);
                }
                else if (direction == Direction.right)
                {
                    return(tailRight);
                }

                break;
            }

            return(null);
        }
Exemple #23
0
        /// <summary>
        /// Déplacement du serpent
        /// </summary>
        private void MoveSnake()
        {
            // Si la grandeur du serpent n'a pas changé, on supprimer la queue et la
            //  dernière partie du corp
            if (snakeParts.Count == snakeLength)
            {
                GameArea.Children.Remove(snakeParts[0].GetUiElement());
                GameArea.Children.Remove(snakeParts[1].GetUiElement());
                snakeParts.RemoveAt(0);
            }

            // Pour chaque partie du serpent, on supprimer les éléments du canvas
            foreach (SnakePart snakePart in snakeParts)
            {
                GameArea.Children.Remove(snakePart.GetUiElement());
            }

            // La dernière partie du corps devient la queue
            snakeParts[0].SetTypeSnakePart(TypeSnakePart.TAIL);

            // Récupération de la tête actuelle
            SnakePart snakeHead = snakeParts[snakeParts.Count - 1];

            // La tête devient le corps
            snakeHead.SetTypeSnakePart(TypeSnakePart.BODY);

            // Récupération des positions actuelle de la tête
            double nextX = snakeHead.GetPosition().X;
            double nextY = snakeHead.GetPosition().Y;

            // Calcul des prochaines positions de la tête
            switch (snakeDirection)
            {
            case Direction.LEFT:
                nextX -= Configuration.SNAKE_SQUARE_SIZE;
                break;

            case Direction.RIGHT:
                nextX += Configuration.SNAKE_SQUARE_SIZE;
                break;

            case Direction.UP:
                nextY -= Configuration.SNAKE_SQUARE_SIZE;
                break;

            case Direction.DOWN:
                nextY += Configuration.SNAKE_SQUARE_SIZE;
                break;
            }

            // Création de la nouvelle tête
            snakeParts.Add(new SnakePart(new Point(nextX, nextY), TypeSnakePart.HEAD, snakeDirection));

            // Vérification d'une collision avec les murs ou le corps
            DoCollisionCheckWall();

            // Si le serpent est autorisé a se dessiner, le dessine
            if (isAuthorizedToDrawSnake)
            {
                DrawSnake();
            }

            // Vérification d'une collision avec de la nourriture
            DoCollisionCheckFood();
        }
Exemple #24
0
        private void DrawSnakePart(SnakePart part)
        {
            Rectangle rectangle = converter.Convert(part.Coordinates, Canvas, MapSize);

            DrawRectangle(rectangle, Brushes.BlueViolet);
        }
Exemple #25
0
        //Start up code for creating the snake parts
        private void StartUp()
        {
            _oldState = Keyboard.GetState();
            _dead = false;

            EndPause();
            this.SnakeLength = this.StartLength;

            for (int i = 0; i <= this.SnakeLength - 1; i++)
            {
                SnakePart part = new SnakePart(new Vector2(120 - (10 * i), 120), 3);
                 _Snake.Add(part);
            }

            _paused = false;
            _pauseKeyDown = false;
            _pausedForGuide = false;
        }
Exemple #26
0
 /// <summary>
 /// Makes the snake grow bigger!
 /// </summary>
 /// <returns></returns>
 private bool GrowSnake()
 {
     SnakePart part = new SnakePart(_Snake[this.SnakeLength - 1].Position, _Snake[this.SnakeLength - 1].Facing);
     _Snake.Add(part);
     this.SnakeLength += 1;
     return true;
 }
Exemple #27
0
    void Update()
    {
        if (GetGameOverState() == false && Time.timeScale != 0)
        {
            //cojemos la cabeza primero y su controlador
            GameObject obj  = cabeza;
            SnakePart  part = obj.GetComponent <SnakePart>();

            //control de movimiento (solo cabeza)
            ControlMovement(part);

            //actualizamos la posicion siguiente de cada parte de la serpiente
            while (obj != null)
            {
                //calcula la siguiente posición
                CalculaNextPosition(part);

                //si la dirección actual es distinta de 0 (si hay movimiento) o si hay cambios de dirección pendientes
                if (part.GetCurrentDirection() != Vector2.zero || part.GetNumDirections() > 0)
                {
                    //Si la posición actual es >= que la siguiente (si ya se ha llegado a la siguiente posición)
                    if (DistanciaMaxima(obj.transform.position, part.GetNextPosition(), part.GetCurrentDirection()))
                    {
                        //actualizamos la actual a la siguiente (la nueva siguiente se actualiza en el update)
                        part.SetPrevPosition(part.GetNextPosition());

                        //por si nos pasamos actualizamos la posición del objeto
                        obj.transform.position = part.GetPrevPosition();

                        //si tiene que crecer, añadimos una nueva parte
                        if (crecer && obj == ultimaParte)
                        {
                            crecer = false;
                            AddPart();
                        }

                        //si hay direcciones pendientes, cambiamos de dirección
                        if (part.GetNumDirections() > 0)
                        {
                            Vector2 newDirection = part.NextDirection();

                            obj.transform.position = Vector3.Lerp(obj.transform.position, new Vector3(obj.transform.position.x + newDirection.x, obj.transform.position.y + newDirection.y), Time.deltaTime * speed);
                        }
                        //si no hay direccion pendiente mantenemos la actual
                        else
                        {
                            obj.transform.position = Vector3.Lerp(obj.transform.position, new Vector3(obj.transform.position.x + part.GetCurrentDirection().x, obj.transform.position.y + part.GetCurrentDirection().y), Time.deltaTime * speed);
                        }

                        //comprovamos si hay siguiente parte e iniciamos movimiento si no se mueve
                        GameObject nextGameObject = part.GetNextPart();
                        if (nextGameObject)
                        {
                            SnakePart partNextObject = nextGameObject.GetComponent <SnakePart>();

                            if (partNextObject.GetCurrentDirection() == Vector2.zero)
                            {
                                partNextObject.NextDirection();
                            }
                        }
                    }
                    //si aun no se ha llegado a la siguiente posición, continua con el actual movimiento
                    else
                    {
                        obj.transform.position = Vector3.Lerp(obj.transform.position, new Vector3(obj.transform.position.x + part.GetCurrentDirection().x, obj.transform.position.y + part.GetCurrentDirection().y), Time.deltaTime * speed);
                    }
                }

                //cambiamos a la parte siguiente si existe
                obj = part.GetNextPart();
                if (obj)
                {
                    part = obj.GetComponent <SnakePart>();
                }
            }

            text.text = numParts.ToString();
        }
    }
Exemple #28
0
        private void RenderSnakePart(Graphics graphics, SnakePart bodyPart)
        {
            var rect = new Rectangle(bodyPart.Position.X, bodyPart.Position.Y, bodyPart.Width, bodyPart.Height);

            graphics.FillRectangle(bodyPartBrush, rect);
        }
Exemple #29
0
        private void RenderSnakeHead(Graphics graphics, SnakePart head)
        {
            var rect = new Rectangle(head.Position.X, head.Position.Y, head.Width, head.Height);

            graphics.FillEllipse(headBrush, rect);
        }
Exemple #30
0
    bool checkCrash(SnakePart p1, SnakePart p2)
    {
        Vector3 offset = p1.trans.position - p2.trans.position;

        return(Mathf.Approximately(offset.sqrMagnitude, 0));
    }
Exemple #31
0
 public override void DieUntil(int PartNumber)
 {
     LastSnakePart = this;
 }
Exemple #32
0
 public void OnNewLastSnakePart(SnakePart snakePart)
 {
     LastSnakePart = snakePart;
     //Debug.Log("new last snake part " + snakePart);
 }