LINUX.ORG.RU

[то ли я дурак] Opera + JS


0

0

Есть такой кусок джаваскрипта:

function move (e) {
	if (!e) {
		e = window.event;
	}
	var really_move = true;
	switch (e.keyCode) {
		case 40:
			if ((kos_y < vsize - 1) && (level_arr [kos_x][kos_y + 1] == 1)) {
				draw_pos (kos_x, kos_y); //!!!
				kos_y++;
				kos_dir = 's';
				draw_kos (); //!!!
			}
			break;

		case 39:
			if ((kos_x < hsize - 1) && (level_arr [kos_x + 1][kos_y] == 1)) {
				draw_pos (kos_x, kos_y); //!!!
				kos_x++;
				kos_dir = 'e';
				draw_kos (); //!!!
			}
			break;

		case 38:
			if ((kos_y > 0) && (level_arr [kos_x][kos_y - 1] == 1)) {
				draw_pos (kos_x, kos_y); //!!!
				kos_y--;
				kos_dir = 'n';
				draw_kos (); //!!!
			}
			break;

		case 37:
			if ((kos_x > 0) && (level_arr [kos_x - 1][kos_y] == 1)) {
				draw_pos (kos_x, kos_y); //!!!
				kos_x--;
				kos_dir = 'w';
				draw_kos (); //!!!
			}
			break;

		case 13:
			load_n_play ();
			break;

		default:
			really_move = false;
			break;
	}
	if (really_move) {
		level_arr [kos_x][kos_y] = 3;
		if (check_field ()) {
			alert ('Уровень пройден!'); //!!!!!!
			if (level < max_level) {
				level++;
				load_n_play ();
			} else {
				alert ('Все уровни пройдены!');
			}
		}
	}
}
Насколько я себе представляю, при каждом вызове этой функции, если e.keyCode == (37|38|39|40), то сначала должны выполняться draw_pos () и draw_kos () (отмечены //!!!), а потом, если check_field () вернет true, то должен выскакивать alert () (отмечен //!!!!!!). В нормальных браузерах все работает именно так, как мне и думается, а в сабже (10.60, stable же даже), если check_field () возвращает true, то отрисовки (draw_pos () и draw_kos ()) не происходит. К чему это я всё? Ах да, посылаю тонны НЕНАВИСТИ разработчикам самого кривого браузера (ie - не браузер). Если я неправ - объясните, пожалуйста, в чём, мне правда интересно.


Ответ на: комментарий от wxw

Слишком уже похоже не на баг, а на очередную «фичу» в стиле оперы а-ля «быстрая прорисовка, и пофиг на стандарты и что там написано в этих быдлоскриптах», потому как в load_n_play () происходит полная перерисовка поля.

byss
() автор топика

Вот ты думаешь, что мы сейчас по этому куску, оторванного от вселенной, найдём в чём проблема?

Deleted
()
Ответ на: комментарий от byss

Слишком уж похоже, что ты толст и будешь решать свои проблемы сам :}

Deleted
()
Ответ на: комментарий от Deleted

Я спрашиваю про порядок выполнения внутри одной функции, остальное на нее не влияет. Код целиком можно здесь посмотреть: http://byss.ru/kosilka/ (осторожно, быдлокод!), только проблема таки если и есть, то внутри этой функции.

byss
() автор топика
Ответ на: комментарий от byss

Хм… причём опция «прекратить выполнение скриптов на этой странице» в алерте прекращает скрипты, но квадрат дорисовывается.

Deleted
()
Ответ на: комментарий от Deleted

Пользователей - практически только я, а я как-то переживаю то, что нужно жмякнуть Enter для перехода на новый уровень.

byss
() автор топика
Ответ на: комментарий от byss

Дело не в Enter, а блокировании гуя.

Есть мнение, что alert() блокирует выполнение (так оно и есть), а перерисовка происходит только после завершения. Надо бы проверить.

Deleted
()
Ответ на: комментарий от Deleted

Действительно. Может, какая-то асинхронная отрисовка по canvas'у идёт, а alert ее почему-то блочит? Но всё равно, так быть не должно, я думаю.

byss
() автор топика
Ответ на: комментарий от byss

Догадки

Сделай див и запиши в него, что предыдущий уровень пройден. Автоматически начинай новый :)

С текстом, такого, кстати, не случается. На миниатюрном примере также происходит — если просто поменять текст дива, например, то апдейт виден, при рисовании по канвасу — прорисовывается только после алерта. Сомневаюсь, что drawImage асинхронный сам по себе (куча алертов в бесконечном цикле оставляют всё как есть, хотя время то прошло по сути), но перерисовка, скорее всего, происходит только после завершения, т.к. draw-чего-то может быть много и постоянно перерисовывать то, что изменяется сейчас в скрипте неэффективно.

Deleted
()
Ответ на: Догадки от Deleted

Хотя с другой стороны, текст то тоже меняется, ну да не знаю. Как вариант — спросить на форуме Оперы :)

Deleted
()
Ответ на: комментарий от byss

>и пофиг на стандарты

И кстати что там в стандартах написано насчёт буферизации вывода на экран? alert() - на что обращает внимание Mystra_x64 - лишь прерывает исполнение.

Не нравится такое поведение - пеши в спортлото, там помогут.

Попробуй на последнем шаге воткнуть
var tmp_png = document.getElementById('gamefield_canvas').toDataURL();

wxw ★★★★★
()
Ответ на: комментарий от wxw

А вот это помогло, спасибо. Кривовато, конечно, зато работает.

byss
() автор топика

Давно же существует средство самоконтроля для программистов от криворукия. Называется ООП.

Zhid
()
Ответ на: комментарий от Deleted

>В Javascript ООП это прототипированный песец, а не ООП :}

Ви таки не любите прототипное ООП? Оно же прекрасно.

anonymous
()
Ответ на: комментарий от Zhid

>Давно же существует средство самоконтроля для программистов от криворукия. Называется ООП.

JS


Либо ты считаешь, что JS это Ъ ООП (== извращенец), либо ты сам не помнишь, о чём речь.

Deleted
()
Ответ на: комментарий от Deleted

>Это ужасно и уродливо %)

Отличное ООП там, просто привыкшим к простыне классов людям тяжело перестроиться.

anonymous
()
Ответ на: комментарий от anonymous

В JS простыня не только не исчезает, но становится ещё уродливее. Стоит только посмотреть как это записывается.

Deleted
()
Ответ на: комментарий от Zhid

Мне интересно, а вот как бы мне это Ваше ООП помогло бы прорисовывать клетку до алерта? Или лишь бы что сказать?

byss
() автор топика
Ответ на: комментарий от Deleted

>В JS простыня не только не исчезает, но становится ещё уродливее. Стоит только посмотреть как это записывается.

Смотрел. В некрупных проектах (а какие нафиг крупные проекты на js в наше время то) необходимость наследования в том виде, в котором оно применяется в классическом ООП практически отсутствует. А объекты всё равно нужны, причем иногда как раз проще покрутить всякие prototype (не фреймворк), чем строить деревья классов. А обычного Object может не хватать. Вот тут и круто js-ное ООП.

anonymous
()
Ответ на: комментарий от anonymous

>а какие нафиг крупные проекты на js в наше время то

Жквери, Прототипы не так что бы крупные, но уже немаленькие.

необходимость наследования в том виде, в котором оно применяется в классическом ООП практически отсутствует.


Есть или нет вопрос десятый (как по мне, то нужно, по крайней мере от одного предка), я про синтаксис. И JS-ной ООП выглядит как наверченная лапша. Уж лучше по старинке, класс описывать, чем так…

Deleted
()
Ответ на: комментарий от byss

Есть такое слово «инкапсуляция».
Это когда все по полочкам, а не через ж*пу.
Один из ключевых принципов этого нашего ООП.

Zhid
()
Ответ на: комментарий от Deleted

>Жквери, Прототипы не так что бы крупные, но уже немаленькие.

Для уровня js это крупный проект, а вот если сравнивать с другими языками - мелочь.

Есть или нет вопрос десятый (как по мне, то нужно, по крайней мере от одного предка), я про синтаксис.

Да ладно. Вместо классов - функции, пару непривычных приколов с private переменными, да и всё. Наследование через prototype. Чего там такого неудобного то.

Кстати прототипное ООП ещё в lua есть.

anonymous
()
Ответ на: комментарий от Zhid

Повторяю вопрос: если бы я создал объект «Field», у которого был бы метод draw_pos (x, y), с тем же телом, что и у текущей функции draw_pos, что бы от этого изменилось? //Не понимаю, зачем применять ООП там, где оно не нужно.

byss
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.