31 декабря 2011

С новыв годом!

Привет. До нового года остается меньше 12 часов и я с радостью поздравляю всех с этим замечательным событием! Живите и процветайте!

В этом году было много планов и много идей. По тем или иным причинам не все они осуществились. И это хорошо. Есть куда стремиться и что делать.

Анонсы (что будет в ближайшем будущем):

  • Статья про QuesoGLC и вывод текста в OpenGL приложении. Возможно даже несколько статей.
  • Рассказ о clang, компиляторе который ну очень хорошо рассказывает об ошибках и умеет анализировать код.
  • Так же расскажу об еще одном инструменте который поможет писать более качественный код без ошибок, cppcheck.

14 декабря 2011

Как я CMake на SCons променял

Привет. Когда я начинал Tank Of Destiny я решил что буду использовать CMake. Тогда мне казалось что все что нужно он умеет, но когда мне понадобилось чуть больше, начались трудности. Я конечно попытался их решить, и честно убил на это пол дня.

В CMake почему-то решили что работать с pkg-config из коробки, это лишнее. Я не знаю как можно пренебречь такой классной программой, но есть модуль FindPkgConfig результат работы которого куча магических переменных, половину которых нельзя использовать в стандартных командах CMake. Наверняка это проблему можно решить, CMake хорошая система автоматизации сборки, но я выбираю SCons потому что он оказался для меня гораздо удобнее.

29 октября 2011

Blender 2.6 и экспорт glsl шейдеров

Привет. Если вы еще не слышали, то вышел blender 2.60. Из всех крутых штуковин что в него пихнули, меня заинтересовала GLSL shader export. К сожалению в вики до сих пор есть TODO на ссылку в документацию.

Мне было интересно, а что же все таки делает этот метод. Не то что бы я не доверял документации, но мне стало интересно, что же там внутри этих самых шейдеров. Далее идет простой скрипт на питоне который нужно запустить в блендере что бы получить вершинный и фрагментный шейдер. А новая функция возвращает не что иное как их исходный код.

10 октября 2011

PyGame: Целочисленные координаты

Привет. Если вы уже успели познакомиться с PyGame, то смогли заметить, что все спрайты рисуются исключительно с целочисленными координатами. А знаете почему?

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

HTML5 canvas

22 сентября 2011

PyGame: Слои и группы

Привет. Вы наверное замечали что в некоторых играх (да почти во всех 2D играх) одни объекты находиться сверху, другие с низу. В большинстве случаев они находиться каждый на своем слое. И как ни странно, спрайты с разных слоев не перекрывают друг друга. По сути это достигается последовательным рисованием всех слоев.

В PyGame есть группа которая сама сортирует спрайты в зависимости от их слоя, и к тому же позволяет обновлять только часть экрана по средствам pygame.display.update, функции которая принимать массив прямоугольников(pygame.Rect) в качестве аргумента.

Почему я за уничтожение пробелов в конце строк

Привет. Пробелы в конце строки, так же известные как trailing whitespace, вызывают у меня исключительно ненависть, и поэтому я выступаю за их уничтожение. Причина моей ненависти очень проста, эти самые пробелы не несут в себе ничего полезного, они только увеличивают размер файла, и ничего больше от них получить нельзя.

10 сентября 2011

Blender 2.59 и его новое python api для экспорта

Привет. У меня есть небольшая статья по экспорту моделей из Blender. И скрипт прекрасно работает для версии 2.49, но в ветке 2.5 поменяли api, и он перестал работать. Печально? Да, но это легко поправимо.
Скачем с сайта www.blender.org докупентацию к python api которая содержит всего 1389 страниц, и я надеюсь что со временем она станет больше (я абсолютно серьезно, описание функций и классов не балует нас подробной информацией, а хотелось бы). Благо еще есть и наборы готовых модулей и скриптов в /usr/share/blender/{version}/scripts, или где у вас установлен blender. Можно так же воспользоваться версией документации с сайта.

19 июля 2011

Змейка изнутри 2

Привет. Долгожданный под капотом. Ура!

Вам предстоит узнать о чем я наврал в прошлый раз, и о том как я не победил управление.

А именно:

  • Как же все таки правильно нарисовать линию в 1px.
  • Что не так с управлением.
  • Как изменить набор уровней.

18 июля 2011

Змейка возвращается!

Привет. И так, теперь у змейки есть жизни. За длинный хвост (больше 20 змее единиц) переход на следующий уровень. Чем больше скорость, тем больше очков за яблоко. За 5000 дадут еще одну жизнь, после порог получения жизни увеличиться в два раза.

Есть изменения в коде. Их много, но об этом потом. Если коротко, то исправлен вывод линий. Они теперь в 1px, как и должны быть. Исправлено управление, оно теперь не позволит змейки на низкой скорости убить себя.

Управление:

  1. w - вверх
  2. s - вниз
  3. a - влево
  4. d - вправо

07 июля 2011

Змейка изнутри

Что же скрывается за простотой змейки. Начнем с самого сложного. С линии толщиной в 1px. В Canvas это сложно, если не знать некоторые тонкости.

03 июля 2011

Змейка!

Ага. Это прототип. Canvas + JavaScript. Более полная версия будет на github в ближайшее время.

Управление простое:

  1. w - вверх
  2. s - вниз
  3. a - влево
  4. d - вправо

07 июня 2011

Магические числа

Привет. Знаком ли вам антипаттерн магические числа? Да наверняка. И все с этим сталкиваются. Чаще всего появление магического числа можно предотвратить в зачатке, иногда нет. Бывает что оно достается нам в наследство. Согласен, наследство дурное, но править что-то в незнакомом коде очень сложно. Я раньше старался делать правки только если они сильно затрагивают мой код, остальное старался оставить как можно ближе к оригиналу.

Я был не прав. Магические числа, а так же дублирование которое они вызывают, нужно устранять по возможности сразу. Шишек от этого может насыпаться очень много. Почему по возможности, потому что не всегда эта возможность есть, иногда, когда вам говорят что сроки давят и надо быстрее, сроки действительно давят и надо быстрее. Быстрее, не значит хуже. Просто иногда бросаться править магические числа сразу не стоит, но потом нужно обязательно к ним вернуться.

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

Я не буду недооценивать боль и страдания которые несут в себе магические числа.
Я не буду недооценивать боль и страдания которые несут в себе магические числа.
Я не буду недооценивать боль и страдания которые несут в себе магические числа.
Я не буду недооценивать боль и страдания которые несут в себе магические числа.
Я не буду недооценивать боль и страдания которые несут в себе магические числа.
Я не буду недооценивать боль и страдания которые несут в себе магические числа.
Я не буду недооценивать боль и страдания которые несут в себе магические числа.
Я не буду недооценивать боль и страдания которые несут в себе магические числа.
Я не буду недооценивать боль и страдания которые несут в себе магические числа.
Я не буду недооценивать боль и страдания которые несут в себе магические числа.

02 июня 2011

Арифметическое переполнение

Привет. А вот используете ли вы вот такие проверки:

#if 0
RAND=$RANDOM
gcc -o $RAND $0 && ./$RAND
rm $RAND
exit
#endif
#include <stdio.h>
#include <limits.h>

void
check_overflow(unsigned int count, unsigned int added)
{
  if ((UINT_MAX - count) > added)
    printf("%2ld + %2ld > %ld | OK!\n", count, added, UINT_MAX);
  else
    printf("%2ld + %2ld > %ld | Overflow!\n", count, added, UINT_MAX);
}

int
main(int argc, char** argv)
{
  unsigned int count = UINT_MAX - 10;
  unsigned int overflow = 15;
  unsigned int no_overflow = 5;

  check_overflow(count, overflow);    // Overflow!
  check_overflow(count, no_overflow); // OK!
  return 0;
}

Ну? А надо бы. Для растущих переменных лучше такую проверку делать. Зачем? Число то большое. Такого никогда не случиться. Мир идеален. Цой просто гостит у Элвиса. Так вот, если в этом числе копить миллисекунды времени (или чего еще), то через 49.8 дней (примерно) случиться арифметическое переполнение. А оно вам надо? Думаю нет. Пишите не только работающий, но и надежно работающий код, когда такая возможность есть. Иногда, да, приходиться писать просто работающий код. Но думать какие значение хранит переменная и какие самые страшные значения она может принять думать надо всегда.

P.S. И да. Танки судьбы очень скоро продолжат свое развитие.

07 мая 2011

Организуем знания

Привет. В связи с предстоящим экзаменом по истории и философии наук, танк судьбы временно буксует, и речь сейчас пойдет не о нем, а о знаниях. В процессе обучения в университете многие наверняка помнят про конспекты лекций. Так вот, я не буду вас учить как это делается, потому что сам этого делать не умею. Есть куча и маленькая тележка правильных методов конспектирования и все сводятся к тому, что нужно выделить главное и основное, а не писать все подряд, или что то в этом же ключе. Это не главное.

Главное ответить на вопрос, часто ли вы конспектируете то что узнаете. Не обязательно делать это на бумаге. Я бы даже сказал, не нужно это делать на бумаге. На бумаге удобно думать. Конспектировать лучше текстом. А текст лучше писать на компьютере, потому что искать в нем что-то станет намного легче.

14 апреля 2011

Функция Lua из функции Си из скрипта Lua

Это небольшой совет о том как можно сделать callback вызов lua функции из C. Это довольно просто, правда только когда данная callback-функция единственный аргумент C функции, в иных случаях все немного сложнее, правда только немного.

Нам понадобятся две такие функции как luaL_ref и luaL_unref. Давайте лучше на примере? Каким бы не был ответ, давайте на примере.

09 апреля 2011

Игровой таймер

Медленно но верно делаю Tank of Destiny. Дошел до таймеров. Это такая ерундовина которая нам очень нужна. Таймер нужен чтобы отмерять время внутри игры, например для ограничения времени на прохождения уровня. Помните была такая игра Super Mario Bros., так вот там на прохождение уровня давалось ограниченное время.

Я много видел статей про то как можно этот самый таймер сделать (правда ни одной найти сейчас не могу), так там часто было так, что таймер работал отдельным потоком. Это конечно здорово. Мы получаем таймер который выполниться через точный промежуток времени, но нам это не нужно. Честно.

21 марта 2011

Дневник разработки: main_loop

Привет. Сел я тут за написание теста для функции main_loop и задумался. Тут ведь вот какое дело, функция это по сути сердце всей игры. Именно на ее плечи ложиться ответственность без устали ждать ввода со стороны игрока, рисовать игровой процесс, и пинать его вперед, что бы игроку было интересно.

Давайте напиши этот тест вместе. Будем считать что это мои рассуждения в слух. Что уж тут поделать, но в слух мне думается гораздо лучше, терпите.

13 марта 2011

Продолжаем писать тесты (Шаг 3.2)

И так, мы продолжили писать тесты. Если вы загляните в репозиторий, то заметите что в папке tests имеются тесты, возможно даже несколько. Они небольшие и вызвать их можно при помощи команды make test.

Для тех кто еще не выбрал репозиторий, сделайте следующее:

git clone git://github.com/Plambir/Tank-of-Destiny.git
cd Tank-of-Destiny/
cmake .
make test

Остальные могут сделать:

git pull origin master
cmake .
make test

12 марта 2011

Тесты (Шаг 3.1)

Привет. Давайте писать тесты! Как? Сейчас? Да! Тесты нам помогут определиться с архитектурой, вселят в нас уверенность, подарят нам много часов крепкого и здорового сна.

В CMake есть CTest. Его очень легко использовать. Давайте напишем простой тест для ознакомления с тем как это работает.

08 марта 2011

Первая сборка (Шаг 2)

Привет. С чего начинается программа? Странный вопрос. Ответ на него простой. Начинается все с вывода Hello World!!!. Зачем? Затем что это хороший способ проверить как работает система сборки, завести репозиторий и сделать первый комит.

Что мы делаем:

  1. Скрипт сборки для CMake
  2. Простой код, выводящий на экран "Hello World!!!"
  3. Первый комит в систему контроля версий (git)

28 февраля 2011

Идея (Шаг 1)

Привет. А давайте попробуем сделать простую, но не слишком, игру шаг за шагом? Мне будет точно интересно. Вам может быть тоже.

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

  1. Идея
  2. Первая сборка
  3. Тесты
  4. Список отображения
  5. Загрузка ресурсов (модели, текстуры и звуки)
  6. Управление
  7. AI
  8. Мелочи
  9. Релиз (скрипты установки)

17 января 2011

Игра в "Жизнь"

Привет. А знаете ли вы, кто такой Джон Хортон Конвей? А знаете ли вы про игру "Жизнь"? Ответы на эти вопросы мне не интересны. Я вам в любом случае буду об этом рассказывать. Джон Хортон, если верить википедии, обладатель равного единице числа Эрдёша, а так же автор игры "Жизнь". Нас конечно же интересует последнее.

Игра "Жизнь", если опять таки верить википедии, клеточный автомат, придуманный английским математиком Джоном Конвеем в 1970 году. Я не буду вдаваться в историю возникновения этой игры или философствовать на тему ее гениальности, я попробую ее сделать на Си с использованием библиотеки ncurses.