Новый Год

31 декабря 2014

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

Десятого числа будет экзамен по матану, а потому первая неделя января собирается быть менее насыщенной прохождением пропущенных за год игр. Тем не менее, сейчас качаю Dragon Age: Origins в Origin, потому что нахаляву достался и потому что надо же во что-то играть сегодня.

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

Сейчас кажется, что в этом году почти не было ничего особо интересного. Тем не менее, в начале апреля я был на CTF в Томске (где наша команда отхватила первое место), летом — в летней школе Parallels и в Бобровке на ACM-сборах, осенью участвовал в Поттосинской (не слишком удачно), в KrasCTF (снова с первым местом). Совсем недавно был NSU Crypto, где я оказался на третьем месте (и получил очередную флешку). И есть ощущение, что кроме этого ничего и не было. Я даже не помню, чтобы я занимался собственными проектами. Этот факт мне не сильно нравится, и надо что-то с ним сделать в следующем году.

Написание поста немного затянулось, и сейчас мы с одногруппниками играем в Mass Effect 3. Думаю, нужно будет бросить играть в древние игры, чтобы попробовать наконец новые. Пользуясь случаем, поздравляю всех с уже почти наступившим две тысячи пятнадцатым, и желаю в новом году вам побольше времени на любимые занятия и собственное творчество.

Код с подсветкой

21 декабря 2014

Сегодня я искал себе подходящий js-скрипт для подсветки кода (потому что раньше кто-то подсвечивал код вручную или применяя последовательность регулярок).

У меня есть собственная тема для Sublime Text, и я хотел использовать её же для подсвечивания кода на своём сайте. В ней подсвечиваются и имена функций, и форматная строка, и экранированные последовательности в строках, и поэтому всё это должен был поддерживать скрипт, используемый для подсветки.

Я посмотрел Prettify от Google и highlight.js, в которых имена функций считаются plain-текстом; syntaxhighlighter, который часто можно встретить в интернете и в котором подсветки имен функций также нет. В минимизированном коде первых копаться было лень, а в последнем по-хорошему эта функциональность прикручиваться не хотела.

Rainbow выглядел почти идеальным, но он не умеет подсвечивать внутри подсвеченного — то есть как раз форматную строку и экранированные символы.

В конце-концов остановился на SHJS, у которого немного странно записываются правила раскраски кода, зато довольно просто прикручиваются новые правила. Немного поправив его и приделав мою цветовую схему, мы получаем следующее:

#include <iostream>
using std::cout;

int main() {
	cout << "Hello, World!\n";
	return 0;
}

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

Сайт

19 декабря 2014

Последние пару недель я писал себе панель для редактирования этого сайта. Так, например, выглядит список записей блога:

Скриншот я сделал во время написания этой записи и загрузил через вот такую галерею изображений с кнопкой-прогрессбаром:

А вот страница редактирования описания проекта:

Я впервые использовал AJAX, и здесь у меня все кнопочки нажимаются без перезагрузки страницы, а картинки добавляются в галерею сразу после их загрузки.

Гравитация

6 декабря 2014

Это самый лучший кадр «Гравитации»:

Возможно, я так решил потому, что тут уже фильм окончательно счастливо заканчивается, но мне кажется, что это потому, что весь фильм был в холодном чёрном космосе, а здесь нас встречает светлая Земля с небом, травяным холмиком и симпатичной водой. Нафиг нужен космос, если на Земле так хорошо?

Space Rift

28 сентября 2014

Если кому-то вдруг интересно, что я делал этим летом и почему меня не было дома весь июль.

(Я написал бы раньше, но ждал, пока || выложат фоточки с завершающей конференции. Как-то уже два месяца прошло, так что обойдёмся без фоточек.)

Так вот, этим летом я принимал участие в Parallels Summer School. Каждый выбирал себе проект, над которым хочет работать, и на протяжении месяца по восемь часов в день им занимался. Я, конечно, выбрал проект, связанный с Oculus Rift, потому что наш лектор/семинарист по мат. анализу пообещал, что он притащит этот шлем, и мы напишем какую-нибудь игру.

Нет, это не наша игра, это Mirror's Edge, стилистику которого я предлагал повторить в нашей игре, когда мы решали, что мы, собственно, будем делать. Если бы мы были покруче, возможно, мы бы написали мультиплеерный паркур-экшн от первого лица в стиле Mirror's Edge и с крюком как в Teeworlds.

В общем, мы довольно быстро определились, что нужно что-то первого лица, так как иначе "показать весь потенциал" Oculus Rift будет сложно. Кроме того, мы решили, что игра будет мультиплеерной, чтобы не писать ИИ для ботов и не придумывать интересный сценарий. Поскольку шлем у нас был один, было решено, что игра будет также поддерживать и плоскоэкранный режим.

Так как из участников нашего проекта только я ранее писал игры, я выбрал движок (Unity, потому что на нём любой школьник игру слепит; к тому же, для Unity есть пакет с необходимыми ассетами, предоставленный самими разработчиками Oculus Rift) и помогал ребятам его освоить. Кто-то больше работал с редактором, а кто-то писал код, но в целом все внесли довольно большой вклад.

Самую тяжёлую часть — мультиплеер — я взял на себя. У Unity своё мнение по поводу мультиплеера, которое мне не сильно нравится, потому что я привык писать с использованием сокетов, так что мне самому пришлось немного поразбираться. Учитывая то, что никто до этого ни C#, ни Javascript в глаза не видел, кого-то заставлять с этим работать я не мог.

Всего нас было шестеро, причём двое до конца не остались, а один перешёл с другого проекта к нам. Двое занимались дизайном уровней и, позаимствовав пакет текстур Space for Unity, сделали три карты. Они также занимались простыми геймплейными штуками вроде порталов и ограничения игровой зоны. Двое в разное время делали модели кораблей, ракет и декорации, а оставшиеся двое занимались всякой всячиной. В частности, они искали звуки, баловались с эффектами и частицами, учили javascript, а также писали главное меню.

Помимо мультиплеера, я также прикручивал Oculus Rift, писал геймплей, допиливал меню, собирал проект со всех компов на один и состыковывал его части друг с другом. Кроме того, всю 2D-графику, то есть лого, менюшку и игровое GUI, рисовал я.

Первое время тесты были направлены в первую очередь на подключение Oculus Rift. Когда он начал работать как надо, я стал приделывать мультиплеер. Я посмотрел много очень тупых туториалов, авторы которых не понимали, что делают, или понимали это неправильно. Несколько дней я пробовал различные способы, а потом наткнулся на какой-то туториал, в котором мне, наконец, стало понятно, как должен работать мультиплеер в Unity (и что другие туториалы предлагали вообще неправильные решения). Чтобы тестировать работу мультиплеера, нужно было запускать игру на нескольких машинах и смотреть, что и где происходит. Когда я прикрутил самые базовые вещи — перемещение, стрельбу и снятие здоровья (но не смерть) — мы уже запускали игру на нескольких компьютерах и смотрели, как что работает. Постепенно, игра обрастала всё новыми фичами — подоспели первые версии карты и корабля, нашлись звуки и эффекты для лазеров, я сделал команды и респаун.

Далее мы добавили самонаводящиеся ракеты. Идея была в том, что возможности Oculus Rift должны как-то использоваться в игре, и примером такого использования было наведение ракет на цель. Если вражеский корабль находится на определённом расстоянии от игрока, он должен в течении некоторого времени зафиксировать свой взгляд на этом корабле и выстрелить после звукового сигнала. Тогда ракета начинает преследовать противника. Ракету можно выпустить и просто по прямой, если не фиксироваться на цели. Таких ракет в корабле немного и между выстрелами нужно подождать некоторое время.

На своём опыте было выяснено, что найти клавиатуру и мышь с надетым Oculus Rift может быть непросто, поэтому было решено сделать поддержку геймпадов. У нас был PS3-контроллер для PC, который мы и приделали к игре. Кроме того, управление кораблём на клавиатуре было сделано "реалистичное". Оно мне очень не нравится, потому что в нём очень просто запутаться и не так легко играть, но большинство было за него, а прикручивать различные схемы управления не хотелось, поэтому оно осталось в игре одно.

Постепенно были доделаны карты и сделаны две разные модели корабля. Меня также убедили приделать физику для столкновений (хотя столкнуться с чем-либо в игре проблематично, да и обрабатываются они в Unity как-то медленно). Совокупность нескольких причин, в частности, использование float для хранения координат объектов самой Unity, привели к тому, что при движении интерфейс начинал трястись (обычное плоское GUI в Unity рисуется только после всех камер, и передать его на шлем нельзя, поэтому интерфейс отрисовывался на прозрачной плоскости перед камерой, чтобы Oculus Rift искривил изображение с камер как надо). Выпиливать то, что создало проблему, было некогда, поэтому интерфейс переехал с прозрачной плоскости на экранчики в кабине корабля, а курсор и никнеймы стали отрисовываться на шлем вручную с помощью пары костылей.

Тестируя и дорабатывая игру перед финальной конференцией, мы придумали крутое оружие, кардинально меняющее нашу обычную игровую сессию. В основном нам приходилось летать на некотором расстоянии от врагов, ожидая перезарядки ракет и уворачиваясь от ракет противников. Даже после отвязки от оси корабля лазерами попасть было довольно сложно. К тому же, лазеры наносили по 15 урона каждый, а ракеты по 60. Уничтожить корабль противника с лазеров было затруднительно, а ракет приходилось использовать по две, то есть ждать как минимум одну перезарядку. Новое же оружие было интересно тем, что убивало с первого раза. Более того, оно убивало всех (включая сокомандников) в радиусе 300 метров вокруг корабля игрока. При использовании все системы корабля выключаются на 20 секунд, и игрок не может ни двигаться, ни атаковать, ни даже наблюдать интерфейс. Только смотреть по сторонам через стекло кабины. Теперь вместо долгого ожидания перезарядки ракет можно было приблизиться к врагу и сразу же уничтожить его. Обратной стороной является остановка. Если игрок использует оружие невовремя, он может не попасть по врагу. К тому же, он в любом случае становится уязвимым на продолжительное время. Наконец, другие игроки тоже имеют это оружие и зачастую при сближении выигрывает тот, у кого реакция быстрее.

Завершив работу, мы сыграли несколько матчей и придумали план выступления. Кроме коротких рассказов о работе от каждого из участников мы запланировали семиминутный матч между игроками на Mac OS, игроком на Windows, игроком в Oculus Rift с контроллером PS3 и игроком на Windows с проектором.

Первой проблемой оказалась сеть, которой в || не было. Нам удалось договориться с сисадмином, который предоставил нам свитч, кабели и переходники для маков. Кроме того, при подключении произошёл лаг, и ребята с Mac OS не подключились к игре, в результате чего матч был довольно скучным. А ещё в Oculus Rift из-за искривления изображения я отключил отрисовку никнеймов поверх кораблей игроков, поэтому в шлеме играть было очень сложно.

Кажется, всё прошло довольно гладко, многим понравилось и кто-то попросился посмотреть игру в шлеме. Они подтвердили, что управление неудобно, но мы это и так знали. Собственно, мы дослушали доклады остальных участников, получили всякие сувениры от Parallels и разъехались по домам.

По идее, мы будем работать над проектом и дальше. Правда, писал я игру на компе в НГУ и проект хранился только там. Я скинул абсолютно финальную версию на флешку одному из участников команды, и сейчас не существует другой копии проекта. Но у меня есть скомпилированная версия игры, в которую можно поиграть по локалке (например, сделать локалку через интернет с помощью Hamachi и играть).

А в августе я поехал на олимпиадные сборы, и потому тоже почти не был дома.

1 2 3 4 5