Midpoint displacement

midpoint
Основная суть алгоритма (который впоследствии плавно перерастет в Diamond square через двумерный Midpoint displacement):

// vector — массив точек, изначально заполнены только первая и последняя
// left, right — индексы первого и последнего элемента
// len = длина изначального отрезка(в пикселах)
// r -  шероховатость. Чем меньше тем более плавная кривая будет в результате.
function midpoint(vector, left, right, len, r) {
    if (right - left < 2)
        return;
    var hl = vector[left]; //высота левой точки
    var hr = vector[right]; //высота правой
    var h = (hl + hr) / 2 + rand(-r * len, +r * len); //считаем высоту
    var index = Math.floor(left + (right - left) / 2); //ищем середину
    vector[index] = h;
    //выполняем алгоритм для получившихся половин
    midpoint(vector, left, index, len / 2, r);
    midpoint(vector, index, right, len / 2, r);
}

Демо
Исходники

Ограничение скорости кадров

preview-14
Что может работать на вашем компьютере на скорости 60 кадров в секунду, на другом может работать на 200. Так как скорость меняется от компьютера к компьютеру, вам необходимо регулировать фреймрейт (скорость кадров), для того, чтобы игра не работала слишком быстро. Если игра работает слишком быстро, в нее становится невозможно играть. Для предотвращения этого, вам нужно ограничить скорость кадров.

Этот урок научит вас этому.
Читать далее

Caint: рисовалка на канвасе

Простенкая рисовалка (Canvas pAINT) на канвасе:
Мяу
(в новом окне)
Чуть позже я собираюсь написать статью о том, как я её писал.

Запись опубликована автором в рубрике misc.

Продвинутый таймер

preview_13
Вы уже научились тому, как написать простой таймер. В этот раз займемся созданием класса таймера с функциями запуска, остановки и паузы, который вам пригодится при программировании игр.
Читать далее

Время

12
Мы уже разобрались с событиями. Теперь пришло время разобраться с временем. Знание того, как обращаться с временем — ключевой момент при создании игр. В этом уроке мы создадим простой таймер, который можно запускать и останавливать.
Читать далее

Emacs: раскладка на meta-space

Извечная проблема пользователей емакса (и вима) с переключением раскладки и мне изрядно попортила жизнь.

Долгое время выходом из положения, если это так можно назвать, для меня было банальное переключение системной раскладки для ввода небольшого количества русского текста и последующее переключение раскладки обратно. А для случаев когда нужно вводить много кириллических символов вполне подходит встроенный в емакс механизм input-method. Но иметь одну комбинацию для переключения системной раскладки, а другую для переключения раскладки в редакторе (ctrl-\) ну ни как не способсвует психическому спокойствию.

Перепробывав миллион методов, я пришел к следующему решению. Для начала, чтобы кисти рук не выгибались я перенес ctrl на место caps'a. С переключением раскладки все интересней. На данный момент все устроено так: переключение на правом alt'e и на meta-space. Плюс за неимением лучших вариантов и для того чтобы не было соблазна пользоваться старыми хоткеями, левый ctrl включает латинскую раскладку, а правый кириллическую.

(для ubuntu: правим файлик /etc/default/keyboad

XKBOPTIONS="grp_led:scroll,compose:rwin,grp:toggle,grp:alt_space_toggle,grp:lctrl_rctrl_switch,caps:none,ctrl:nocaps"

Основной хоткей для переключения раскладки — meta-space. Теперь для того чтобы пользоваться им же в емаксе добавляем в ~/.emacs следующий код:

;; for this to work kbdd must be installed
(global-set-key (kbd "M-SPC")
		(lambda ()
		  "Toggle input method"
		  (interactive)
		  (toggle-input-method)
		  (start-process "dbus-send"
				 nil
				 "dbus-send"
				 "--dest=ru.gentoo.KbddService"
				 "/ru/gentoo/KbddService"
				 "ru.gentoo.kbdd.set_layout"
				 "uint32:1")))

Решение требует того, чтобы был услановлен kbdd.

sudo aptitude install kbdd

Который кстати умеет сохранять раскладку для каждого приложения, что тоже весьма удобно, особенно для легких окружений типа Awesome.

В результате: системная раскладка переключается по meta-space, зажигая при этом лампочку scroll lock'a при включении кириллической раскладки.
В емаксе input-method включается точно так же. При этом, правда, системная раскладка остается английской, и поэтому scroll lock не загорается. Что вполне приемлемо на фоне остальных решений этого вопроса.