Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Змейка: совпадение координат (https://javascript.ru/forum/misc/37532-zmejjka-sovpadenie-koordinat.html)

Aetae 23.04.2013 23:02

Цитата:

Сообщение от Dim@ (Сообщение 247815)
Aetae,
это логично, а если там змейка не в виде простых линий?

Пофигу. Главное чтоб фон отдельно рисовался.(что рекомендуют все уроки по canvas).
А дальше: в получившейся зоне есть непрозрачный пиксель? Значит false.)

JsLoveR 23.04.2013 23:13

Цитата:

Сообщение от Aetae
Я говорю о том, что раз змейка отрисовывается на canvas надо использовать методы canvas и тупо смотреть закрашена ли область.

и я о том, что-то вроде такого:
<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 цикл.

Dim@ 24.04.2013 09:16

Aetae,
ну да верно и сразу решает проблему установки еды на еду и другие объекты:)

Hekumok 24.04.2013 09:27

Цитата:

Сообщение от nerv_
делай с массивом и не страдай ерундой )

Цитата:

Сообщение от JsLoveR
Пробегать по массиву координат змейки, ведь там 1 цикл.

Ну а если длина змейки будет большой, массив всех её координат будет тоже большой. Пока пробежим по всему массиву, змейка будет стоять на месте, либо ползти, но на карте не будет еды (смотря как сделать), некрасиво получится(
Цитата:

Сообщение от Aetae
Я говорю о том, что раз змейка отрисовывается на canvas надо использовать методы canvas и тупо смотреть закрашена ли область.

То есть нужно брать методом getImageData массив пикселей (при чем это будет ведь квадратная область, и полученный массив будет больше обычного массива всех координат змейки), также пробегать по нему и смотреть попал/не попал на змейку. Но при большой длине змейки, массив будет немаленьким, и пробегать по нему будет довольно долго.
Цитата:

Сообщение от Dim@
Hekumok,
просто по логике змейка состоит из линий можно по поворотам узнать линии и соответственно координаты змеи полностью, но как я понял для тебя это не катит

:yes:
Цитата:

Сообщение от Dim@
массив точек недоступных для помещения в них еды.

Так это ж и получится массив всех координат змейки :blink:

Hekumok 24.04.2013 09:37

Цитата:

Сообщение от Aetae
Также возможно поможет isPointInPath()

Тьфу ты, блин, точно) благодарю))

Aetae 24.04.2013 13:51

Цитата:

Сообщение от Hekumok (Сообщение 247842)
То есть нужно брать методом getImageData массив пикселей (при чем это будет ведь квадратная область, и полученный массив будет больше обычного массива всех координат змейки), также пробегать по нему и смотреть попал/не попал на змейку. Но при большой длине змейки, массив будет немаленьким, и пробегать по нему будет довольно долго.

То есть можно брать методом getImageData массив пикселей предполагаемой области появления еды, а не всей змейки. И зависит он, соответственно, только от размеров еды. Но если isPointInPath подходит, то, естесно, лучше юзать его.

Hekumok 24.04.2013 19:38

Aetae, да-да, чё-т я конкретно тупанул :)


Часовой пояс GMT +3, время: 16:27.