Игра JavaScript змея

0

У меня возникают проблемы с перемещением элементов змей. Я написал игру Snake в настольном приложении С#, но эта же логика, похоже, не работает в JavaScript.

Вот та часть, с которой у меня возникают проблемы. В основном у меня есть 4 функции, которые только перемещают голову Змеи (первый элемент массива), и я использую этот код для перемещения других частей тела.

for (i = snakeBody.length - 1; i > 0 ; i--) {
    context.rect(snakeBody[i].x,snakeBody[i].y,snakeBody[i].w,snakeBody[i].h);
    snakeBody[i]=snakeBody[i-1];
} 

Проблема в том, что все они сливаются друг с другом. Я не понимаю, почему это не работает в JavaScript.

Вот весь код.

window.onload= function ()
{
    var canvas=document.getElementById("canvas");
    var context=canvas.getContext("2d");

    var canvasWidth=window.innerWidth;
    var canvasHeight=window.innerHeight;
    canvas.width=canvasWidth;
    canvas.height=canvasHeight;

    var up=false;
    var down=false;
    var left=false;
    var right=true;

       var snake={
        x:20,
        y:0,
        w:20,
        h:20
    };
    var snakeBody=[];
    for (i = 0; i < 5; i++) {
        snakeBody.push({
        x:snake.x ,
        y:snake.y ,
        w:snake.w,
        h:snake.h
    });
    snake.x +=20;
    }

    var food={
        x:Math.random() * canvasWidth,
        y:Math.random() * canvasHeight,
        w:2,
        h:2
    };

    function moveUp()
    {

            snakeBody[0].y -=3;

    }
    function moveDown()
    {

            snakeBody[0].y +=3;

    }
    function moveLeft()
    {

            snakeBody[0].x -=3;

    }
    function moveRight()
    {

            snakeBody[0].x +=3;


    }
    function draw()
    {
        context.clearRect(0,0,canvasWidth,canvasHeight);
        context.fillStyle="rgba(230,230,230,0.1)";
        context.beginPath();

       for (i = snakeBody.length - 1; i > 0 ; i--) {
           context.rect(snakeBody[i].x,snakeBody[i].y,snakeBody[i].w,snakeBody[i].h);
           snakeBody[i]=snakeBody[i-1];
        }
        //context.rect(food.x,food.y,food.w,food.h);

        context.stroke();
        context.fill();

        directions();
        collision();
        update();
    }
    function directions()
    {
        document.onkeydown = function(e)
        {
           var event = window.event ? window.event : e;
             var keycode = event.keyCode;
            if (keycode===37 && right===false) {
                left=true;
                right=false;
                up=false;
                down=false;
            }
            if (keycode===38 && down===false) {
                up=true;
                down=false;
                left=false;
                right=false;
            }
            if (keycode===39 && left===false) {
                right=true;
                left=false;
                up=false;
                down=false;
            }
            if (keycode===40 && up===false) {
                down=true;
                up=false;
                left=false;
                right=false;
            }
        };
    }
    function update()
    {
        if (up) {moveUp();}
        if (down) {moveDown();}
        if (left) {moveLeft();}
        if (right) {moveRight();}
    }
     function collision()
     {
         for (i = 0; i < snakeBody.length; i++) {
            if (snakeBody[i].x >canvasWidth) {
            snakeBody[i].x  = 0;
        }
        if (snakeBody[i].x < 0) {
            snakeBody[i].x=canvasWidth;
        }
        if (snakeBody[i].y>canvasHeight) {
            snakeBody[i].y=0;
        }
        if (snakeBody[i].y <0) {
            snakeBody[i].y=canvasHeight;
        }
        } 
     }
        setInterval(draw,40);
};
  • 0
    Вы не видите здесь своих рассуждений: вы перемещаете первую ячейку на 3 пикселя, а затем заменяете каждую другую ячейку ячейкой перед ней?
  • 0
    Я перемещаю первый элемент, а затем перебираю другие после. Что вы не понимаете? Та же самая точная логика работает в C #.
Показать ещё 2 комментария
Теги:
html5-canvas

1 ответ

1

Я считаю, что ваша проблема в том, что вы хотите установить значение змеи [i] для змеи [i-1], но вы на самом деле устанавливаете змею [i] на ссылку змеи [i-1]. Вы устанавливаете весь свой массив как один и тот же объект. Вы можете это исправить, выполнив

snake[i].x = snake[i-1].x;
snake[i].y = snake[i-1].y;

Вы также столкнетесь с другой проблемой, поскольку вы только перемещаете змею на 3 вместо ширины ее сегментов тела.

  • 0
    Отлично сработано! Также @Peter, код, который вы предоставили, не рисует голову
  • 0
    Спасибо, это исправило. Я вроде исправило это, но это не совсем исправление, это обходной путь. Я залил его черным, и вы не можете видеть, что элементы находятся на полпути друг на друга.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню