Змейка: совпадение координат
Делаю игру "змейка" на канвасе. Имеется такой код
function randomNumber(max) { return Math.floor(Math.random() * max) ; } // генерит случайное число от 0 до (но не включая) max function Position(x, y, side) { this.x = x ; this.y = y ; if(side !== undefined) this.movementToSide = side ; } // конструктор позиций, x и y - координаты, movementToSide - сторона, в которую двигаемся function Food() { this.position = new Position(randomNumber(canvas.width), randomNumber(canvas.height)) ; } // конструктор еды, которую ест змейка; position - позиция, где эта еда находится, она может появиться в любом месте на поле function Snake() { this.positionsOfTurns = [] ; this.head = new Position(canvas.center.x + canvas.cellSize, canvas.center.y, "right") ; this.tail = new Position(canvas.center.x - canvas.cellSize, canvas.center.y, "right") ; } /* positionOfTurns - массив позиций, где и в какую сторону поворачивает змейка пример этого массива: [{ x: 250, y: 250, movementToSide: "top" }, { x: 250, y: 200, movementToSide: "left" }], т.е. первый поворот змейка делает вверх в позиции x:250, y:250; далее передвигается на 50пикселей вверх и следующий поворот она делает влево в позиции x:250, y:200 head - позиция головы змейки tail - позиция хвоста змейки */ // прочий код Так вот, когда создается позиция для еды, нужно проверить, не попала ли она на змейку (нельзя же, чтоб еда появилась на змейке). Следовательно, вопрос: как максимально эффективно (т.е. наиболее быстро) и можно ли вообще проверить, совпала позиция еды с какой-либо координатой, где ползет сейчас змейка, не имея при этом массива всех этих координат змейки (у меня же только хранятся позиции головы, хвоста и поворотов змейки). Я не вижу никакого варианта, кроме как с использованием массива всех координат |
Ну не всех координат, можно взять imageData конкретного участка. Также возможно поможет isPointInPath().
|
Hekumok,
хвост следует за головой по пути пройденному головой => по идее, должен быть массив поворотов которые должен сделать хвост на данный момент, он есть (если есть можно его скинуть)? |
Может быть стоит проверять если координаты еды попадают в прямоугольник, где залито цветом змейки, а не цветом фона и возвращать true. Как Aetae предложил.
|
Aetae, JsLoveR, спасибо, но получается, что мне нужно в цикле пробегать по всем координатам змейки и смотреть, совпадают ли они с позицией еды или нет, но я этого не хочу, почему и не использую массив всех координат змейки. А вообще у меня тут идейка появилась, завтра попробую.
Dim@, ээмм... Ну так snake.positionsOfTurns - это и есть массив поворотов змейки, т.е. поворотов, которые должен пройти хвост |
Hekumok,
просто по логике змейка состоит из линий можно по поворотам узнать линии и соответственно координаты змеи полностью, но как я понял для тебя это не катит Можно попробовать такую вещь - нужна длина змеи и придётся создавать массив точек недоступных для помещения в них еды. Точка недоступна если кол-во шагов пройденных головой из этой точки меньше длины змейки |
Цитата:
Цитата:
|
nerv_,
Цитата:
|
Я говорю о том, что раз змейка отрисовывается на canvas надо использовать методы canvas и тупо смотреть закрашена ли область.
|
Aetae,
это логично, а если там змейка не в виде простых линий? |
Цитата:
А дальше: в получившейся зоне есть непрозрачный пиксель? Значит false.) |
Цитата:
<script type="text/javascript"> var canvas = null; var ctx = null; function createRect(x, y, width, height, color) { ctx.fillStyle = color; ctx.fillRect(x, y, width, height); } function randomFood() { var randX = Math.floor(Math.random() * canvas.width / 30); var randY = Math.floor(Math.random() * canvas.height / 30); var block = ctx.getImageData(randX * 30, randY * 30, 1, 1); createRect(randX * 30, randY * 30, 30, 30, "#FF9900"); if(block.data[0] == 153 && block.data[1] == 204 && block.data[2] == 0 && block.data[3] == 255) { alert("Попали на змейку!"); } } window.onload = function(e){ canvas = document.getElementById('map'); ctx = canvas.getContext("2d"); createRect(30, 30, 30, 30, "#99CC00"); createRect(60, 30, 30, 30, "#99CC00"); createRect(30, 60, 30, 30, "#99CC00"); createRect(90, 30, 30, 30, "#99CC00"); createRect(120, 30, 30, 30, "#99CC00"); createRect(150, 30, 30, 30, "#99CC00"); createRect(150, 60, 30, 30, "#99CC00"); createRect(150, 90, 30, 30, "#99CC00"); createRect(150, 120, 30, 30, "#99CC00"); } </script> <canvas id="map" width="200" height="200" style="border:1px solid #999999; float:left"></canvas> <button onclick="randomFood()" style="float:left">Генерировать еду</button> Но лучше использовать, наверное, стандартный подход ) Пробегать по массиву координат змейки, ведь там 1 цикл. |
Aetae,
ну да верно и сразу решает проблему установки еды на еду и другие объекты:) |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Aetae, да-да, чё-т я конкретно тупанул :)
|
Часовой пояс GMT +3, время: 16:11. |