За время моего отсутствия у меня многое поменялось.
С С++ программиста я сначала превратился в Flash-аниматора, потом в AS3-программиста :) Бесценный опыт! Правда теперь пытаясь сесть за свой C++ движок обнаружилась одна недоработка. Так, как я не документировал свой движок, то спустя почти полгода я перестал понимать что и как в нём работает :) Приходится методом тыка и разбором исходников понимать, что же я когда-то понаписывал :)
Ещё многое изменилось в моей жизни, не связанным с программированием, но об этом я умолчу ;)
С приближающимися праздниками!
Жизнь программиста
Процесс разработки 2D движка и прочие мелкие шалости :)
четверг, 30 декабря 2010 г.
вторник, 20 июля 2010 г.
Внимательность
Самый главный враг программиста - недостаток внимательности. Проявляется в основном от усталости. В таком состоянии можно допустить самые нелепые ошибки. Потому, как только замечаете за собой рассеянность, постарайтесь незамедлительно дать отдых своему мозгу. Умыться, постоять у окна, выпить чаю, почитать анекдоты, и.т.д. В общем делать всё, что не связанно с программированием и не особо задействующим мозг :)
Показательный пример невнимательности был у меня сегодня. Добавил функциональности к классу отрисовки растровых шрифтов. В частности - возможность изменения размера шрифта в real-time. Скомпилировал, запустил - шрифт изменяет размер, но как-то не плавно. Пересмотрел код и увидел, что часть переменных у меня типа int, а не float. Перевёл их на float, запускаю - и опять нет плавности. Пошёл отдохнул, выпил чаю. Вернулся к компьютеру и сразу же увидел, что float то везде, но параметры функции непосредственной отрисовки как были типа int, так ими и остались %)
В общем, будьте внимательнее, коллеги ;)
понедельник, 19 июля 2010 г.
Получение Lua таблицы в С++ (проблема с lua_next)
Боролся сегодня со злостным багом. Как только пытался получить таблицу из Lua, как тут же слетало приложение. Как оказалось, после прочтения документации, причина была довольно проста - ключи в таблице были типа number и к ним в случае считывания с таблицы нельзя применять функцию lua_tostring(), только lua_tonumber().
Цитата:
While traversing a table, do not calllua_tolstringdirectly on a key, unless you know that the key is actually a string. Recall thatlua_tolstringchanges the value at the given index; this confuses the next call tolua_next.
воскресенье, 18 июля 2010 г.
Передача таблицы в Lua (способ №2)
Наткнулся на статью: http://ilovelua.narod.ru/step4.html
На её основе немного переделал работу с таблицами. Создал глобальный map:
std::map<std::wstring,float>FloatMap;
Далее, используя функцию toLua, описанную в статье, я передают map в Lua в виде таблицы:
int l_SpriteGetActualPos(lua_State* L)
{
fromLua(L,1,String); // Получаю имя спрайта в массиве и записываю его в переменную String
FloatMap.clear(); // очищаю map от данных
FloatMap[L"X"] = Sprites[String].TempPos.x;
FloatMap[L"Y"] = Sprites[String].TempPos.y;
toLua(L,FloatMap);
return 1;
} Как видите, размер функции существенно уменьшился, данный метод существенно удобнее предыдущего.
пятница, 16 июля 2010 г.
Передача таблицы в Lua
Нужно было написать функцию, которая бы передавала несколько переменных в Lua в виде таблицы. Немного погуглил и нашёл простой работающий способ. Покажу его на примере функции, возвращающей текущее положение спрайта на экране:
int l_SpriteGetActualPos(lua_State* L)
{
String = CharToWString(lua_tostring(L, 1)); // Получаю имя спрайта в массиве
lua_pop(L,1); // удаляю имя спрайта из стека Lua
lua_newtable(L); //создаётся новая таблица
lua_pushstring(L,"X"); // добавляю в стек ключ "Х"
lua_pushnumber(L,Sprites[String].TempPos.x); // добавляю в стек значение для ключа "Х"
lua_rawset(L,-3); // записываю пару "значение-ключ" в таблицу
lua_pushstring(L,"Y"); // добавляю в стек ключ "Н"
lua_pushnumber(L,Sprites[String].TempPos.y); // добавляю в стек значение для ключа "Н"
lua_rawset(L,-3); // записываю пару "значение-ключ" в таблицу
return 1;
}
Из Lua эта функция используется следующим образом:
local Pos = Sprite_GetActualPos("Sprite_Name") -- в Pos записывается указатель на таблицу
-- доступ к таблице осуществляется так
Pos.X = 10
Pos.Y = 20
Дела программерские
Автоматизирую сегодня процесс шифрования текстур и компиляции Lua-скриптов. Через пару дней выложу демку с возможностями движка (графика вся нагло взятая с разных сайтов, но демка то некоммерческая, так что можно).
Помимо программирования я увлекаюсь фотографией. Раньше снимал больше, сейчас ощущается острая нехватка времени, снимаю гораздо меньше. 2 дня назад была сильная гроза, удалось заснять молнию:
вторник, 13 июля 2010 г.
Эпическая борьба с кроссплатформенностью
Тяжко, ой как тяжко переходить на OpenGL после 3-х лет разработки в DirectX. Другой подход к текстурам, отсутствие некоторых удобных классов (типа LPD3DXSPRITE) . Но разобраться в этом нужно, ведь в результате будет +30-40% аудитории, у которых MacOS.
Ну что же, старт дан, есть 6-7 месяцев на развитие основного PC-ориентированного движка и перенос его функциональности в кроссплатформенный двиг.
понедельник, 12 июля 2010 г.
Анимация объектов при помощи "временных полос (таймлайнов)"
Обычный мой способ анимации объектов занимает довольно много кода и времени. Идея способа состоит в том, что назначаются объекту состояния (проявление альфы, изменение размера, прыжок, и.т.д ) и для каждого состояния я пишу свою логику. В итоге, для довольно сложной анимации приходится много писать.
И тут я обратил своё внимание на свой же класс системы частиц :) Для сложных эффектов я ввёл в класс понятие "временных полос". Суть их в чём. Работают они у меня на основе ассоциативного массива. В качестве ключа у меня стоит время. Допустим нужно создать объект с альфой 0 и за 2 секунды проявить его до 200. С помощью таймлайна это делается следующим образом:
//Инициализация C_Timeline Alpha; Alpha.Set(0.0f,0.0f) время и значение Alpha.Set(2.0f,200.0f) время и значение LifeTime=0.0f; //время жизни //Update LifeTime += FrameTime; //FrameTime - время рендера предыдущего кадра ObjectAlpha = Alpha.Get(LifeTime);
В этом коде, когда LifeTime будет равен 1, ObjectAlpha будет равно 100.
Так вот, посмотрел я на этот код и написал класс анимации, с использованием этих таймлайнов. Количество кода, необходимого для анимации, снизилось в разы. Результатом доволен :)
суббота, 10 июля 2010 г.
Классы в Lua
В этой небольшой статье я расскажу о создании и использовании классов в Lua при помощи стандартной библиотеки "classlib.lua".
dofile(GetResPath('Scripts\\classlib.lua'))
-- GetResPath() - C++ функция, возвращающая путь к ресурсам движка
C_Sprite = class("C_Sprite") -- так объявляется класс
function C_Sprite:__init(Name,Texture,PosX,PosY,Left,Top,Width,Height) -- Функция инициализации
--Через self. задаются переменные класса
self.Name = Name
self.Texture = Texture
self.Pos = {x=PosX,y=PosY}
self.StartPos = {x=PosX,y=PosY}
self.Size = {Left=Left,Top=Top,Width=Width,Height=Height}
self.Scale = {x=1, y=1}
self.Alpha = 255
Sprite_Add(Name,Texture,PosX,PosY,Left,Top,Width,Height) -- С++ функция, добавляющая спрайт в массив спрайтов
end
function C_Sprite:Sync()
-- Синхронизация данных класса с данными движка
Sprite_MoveTo(self.Name,self.Pos.x,self.Pos.y)
Sprite_SetScale(self.Name,self.Scale.x,self.Scale.y)
Sprite_SetAlpha(self.Name,self.Alpha)
end
function C_Sprite:Draw()
Sprite_Draw(self.Name)
end
-- Теперь чтобы создать объект класса достаточно прописать следующее
SpriteObject = C_Sprite("TestSprite","TestTexture",512,384,100,100,100,100)
--Обращение к свойству класса
SpriteObject.Pos.x = 10
--Вызов функции класса
SpriteObject:Sync()Упаковываем INI файл в бинарник
В старом, "замороженном", проекте список объектов хранился в ini файле. В средней сцене было около 40-50 объектов, у каждого около 15 свойств. Через стандартные WinAPI функции процесс считывания одного такого считывания занимал секунд 6-10, что явно не айс. Решил упаковать ini в бинарник и существенно выиграл в скорости загрузки, которая стала гораздо меньше секунды :)
Подписаться на:
Комментарии (Atom)
