Яблоко нерестится внутри змеи - PullRequest
0 голосов
/ 16 июня 2020

Я новичок в Unity и сделал игру про змей. Однако иногда яблоко может появиться внутри змеи. Я предполагаю, что для этого нужен оператор if, например if CreateRandomApple = TailNode, затем попробуйте еще раз, но я не уверен, как это кодировать. Вот мой код для змеи и яблока.

    void PlacePlayer()
    {
        playerObj = new GameObject("Player");
        SpriteRenderer playerRender = playerObj.AddComponent<SpriteRenderer>();
        playerSprite = CreateSprite(playerColor);
        playerRender.sprite = (playerSprite);
        playerRender.sortingOrder = 1;
        playerNode = GetNode(3, 3);

        PlacePlayerObject(playerObj, playerNode.worldPosition);
        playerObj.transform.localScale = Vector3.one * 1.2f;

        tailParent = new GameObject("tailParent");
    }


    void CreateApple()
    {
        appleObj = new GameObject("Apple");
        SpriteRenderer appleRenderer = appleObj.AddComponent<SpriteRenderer>();
        appleRenderer.sprite = CreateSprite(appleColor);
        appleRenderer.sortingOrder = 1;
        RandomlyPlacedApple();
    }

    #endregion

    #region Update

    void MoveTail()
    {
        Node prevNode = null;

        for (int i = 0; i < tail.Count; i++)
        {
            SpecialNode p = tail[i];
            availbleNodes.Add(p.node);

            if (i == 0)
            {
                prevNode = p.node;
                p.node = playerNode;
            }
            else
            {
                Node prev = p.node;
                p.node = prevNode;
                prevNode = prev;
            }

            availbleNodes.Remove(p.node);
            PlacePlayerObject(p.obj, p.node.worldPosition);
        }
    }
    #endregion

    #region Utilities


    bool isTailNode(Node n)
    {
        for (int i = 0; i < tail.Count; i++)
        {
            if(tail[i].node == n)
            {
                return true;
            }
        }
        return false;
    }

    void PlacePlayerObject(GameObject obj, Vector3 pos)
    {
        pos += Vector3.one * .5f;
        obj.transform.position = pos;
    }

    void RandomlyPlacedApple()
    {
        int ran = Random.Range(0, availbleNodes.Count);
        Node n = availbleNodes[ran];
        PlacePlayerObject(appleObj, n.worldPosition);
        appleNode = n;
    }

    Node GetNode(int x, int y)
    {
        if (x < 0 || x > MaxWidth - 1 || y < 0 || y > MaxHeight - 1)
            return null;
        return grid[x, y];
    }

    SpecialNode CreateTailNode(int x, int y)
    {
        SpecialNode s = new SpecialNode();
        s.node = GetNode(x, y);
        s.obj = new GameObject();
        s.obj.transform.parent = tailParent.transform;
        s.obj.transform.position = s.node.worldPosition;
        s.obj.transform.localScale = Vector3.one * .95f;
        SpriteRenderer r = s.obj.AddComponent<SpriteRenderer>();
        r.sprite = (playerSprite);
        r.sortingOrder = 1;

        return s;
    }


    #endregion

}`

Это упрощенная версия скрипта. Спасибо

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Поскольку у вас есть функция isTailNode, вы должны иметь возможность непрерывно генерировать новые узлы Apple и проверять, являются ли они хвостовыми узлами. Если они есть, вы создаете новые. Этого можно достичь с помощью while l oop.

void RandomlyPlacedApple()
{
    int ran = Random.Range(0, availbleNodes.Count);
    while(isTailNode(availbleNodes[ran]))
    {
        ran = Random.Range(0, availbleNodes.Count);
    }
    PlacePlayerObject(appleObj, availbleNodes[ran].worldPosition);
    appleNode = availbleNodes[ran];
}
0 голосов
/ 16 июня 2020

Проверить, внутри ли он

if(apple.location == snake.location){ changeAppleLocation() }

...