Йййахууу!!! Я разобрался с PNG и JPG. Так что сейчас фреймворк держит 3 формата текстур. Написал конвертер шрифтов от HGE в свой бинарный формат. Так что сегодня выложу работу со шрифтами и HGE'шную тулзень для их генерации. (:
Отлично ! У меня прям без шрифтов депрессия, ниче делать неохота
Правда начал блок проекта внедрять в PSPxIDE, тоже скоро доделаю, много изменений, те что и ты предлагал и BonifacE, в общем потом расскажу
В общем ясделал шрифты, но там какая-то дурная ошибка с цветом. Цвета просто колбасит нипадецки.
Отсюда возникает вопрос: функция sceGumDrawArray сраз пихает массив вершин на обработку? Или сохраняет где-то указатели на структуру данных? А потом их скопом обрабатывает...
Просто цвет задаётся в структуре вершины...
Вот такой вот сумбурный вопрос...
да, у меня тоже подобная трабла была в тетрисе: проставляю цвет кубикам
а они потом какието недоделанные, как будто часть треугольников не прорисовались и тоже "колбасит", это в версии 1.2 было при запуске
, в общем вылечил это "плясками с бубном", из какой то хомки подсмотрел, перед главным циклом ставь:
добавлено через 5 минут
Еще момент, если есть
dList = memalign( 16, 640 );
это буфер прорисовки, чем больше предполагается выводить
объектов, тем больше он должен быть.
У меня была проблема, когда я в тетрисе положил фон,
с какого-то момента он начинал стираться по строчке и
чем больше выводилось кубиков, тем хуже, затем перерыв
все и в том числе psdev, нашел решение-именно ту строчку с dList,
увеличил и все ОК, сейчас поставил
dList = memalign( 16, 50000 ); и все замечательно пашет !
Последний раз редактировалось wSlava; 17.04.2007 в 22:09.
Причина: добавил, подумав
лист у меня такой, подсмотрел в каком-то движке...
static unsigned int __attribute__((aligned(16))) list[262144];
добавлено через 2 часа 22 минуты
Блин, голова не соображает уже. ):
Если кто-то хочет помочь в отладке шрифтов (и, как я догадываюсь не только их) - могу выложить последнюю сборку с примером...
Ррррр, почему всё так заморочено??? И не почитаешь ведь нигде толком. ):
Последний раз редактировалось Mortem; 18.04.2007 в 00:44.
Причина: добавил, подумав
Колдовал, колдовал, так ничего умного и не наколдовал... ):
Пробовал разные варианты инициализации, выдранные из разных примеров из PSPSDK - без толку.
Чего-то я не вижу в упор. Чего-то важного.
Ведь это очень странно, когда один пример работает, а другой нет...
Начинаю грешить на всё подряд...
Смотри, че компайлит:
******************************************
../mgffont.cpp: In member function 'float MGFFONT::GetWidth(const char*, bool)':
../mgffont.cpp(129) : error: '((MGFFONT*)this)->MGFFONT::Quads[((int)c)]->MGFQUAD::Width' cannot be used as a function
../mgffont.cpp: In member function 'void MGFFONT::Render(float, float, int, const char*)':
../mgffont.cpp(194) : error: 'struct MGFQUAD' has no member named 'Vertexes'
../mgffont.cpp(196) : error: '((MGFFONT*)this)->MGFFONT::Quads[((int)n)]->MGFQUAD::Width' cannot be used as a function
make: *** [../mgffont.o] Error 1
я посмотрел, и в правду в
struct MGFQUAD {
....
объявлено float Width, Height;
Эх, Mortem, на кого ж ты нас покинул ... придется самому доделывать. В общем поправил недочеты предыдущего поста, там скорее всего mgfgeometry.сpp нехватало, а там определены прокси-функции доступа к свойствам, в общем Width нужно без скобок указать, и в mgffont.cpp в 195 строке указать
Quads[n]->Vertexes() заменить на Quads[n]->v .
Кстати, со шрифтами вроде разобрался, скоро новая версия териса будет ...
добавлено через 1 час 41 минуту
Прогу с mgf откомпайлил, очень интересно мигают текстуры шрифта
Нечто подобное нашел на pspdev:
You are reusing the vertices in DisplayVertices for every character. Vertices passed into sceGuDrawArray() need to remain valid until the GE has executed the operation, otherwise you will overwrite live data. Easy way to solve this is grab memory from the running display list using sceGuGetMemory()...
В общем, как я понял, что sceGuDrawArray() помещает вершины в буфер прорисовки и затем скопом все это отрисовывает при выводе очередного кадра (видится мне, что каждая sceGuDrawArray() выполняется параллельно в своем потоке), так вот, если выводится многократно один и тот же массив, то он в буфере тот же самый, и если менять информацию в вершине, то это может затронуть как последующую, так и предыдущую sceGuDrawArray ...
Решение, как вижу, либо копать этот dList (буфер вывода) , либо каждую строку текста делать отдельным объектом (либо один объект с несколькими Quad), хотя потестить не смог, создание подряд двух шрифтов
font1 = new MGFFONT("data/font.fb");
font2 = new MGFFONT("data/font.fb");
не работает ..
P.S. Сама реализация шрифта порадовала: масштабирование, угол наклона и т.д. очень прикольно
Последний раз редактировалось wSlava; 01.05.2007 в 01:52.
Причина: добавил, подумав
Дело действительно в буфере вывода, я подсмотрел реализацию подобного момента в gufont из SDK и все получилось, теперь есть отличный шрифтовый движок в составе mgf.
Кому интересно, смотрите в аттачменте подправленный mgf и пример font (уже откомпайленый) на нем. Кстати, в архиве прилагается help, написанный Mortem, все довольно таки подробно описано. Сам движок очень прост и хорошо структурирован, так что с помощью него очень просто будет делать хомки !
Теперь осталось добавить в mgf работу со звуком и будет законченный мини- движок, думаю, дальше я его включу в SDK и сделаю на нем некоторое подобие шаблонов для PSPxIDE (эта идея пока вертится в голове). А пока доделаю тетрис, сначала скорей всего переведу исходникики на mgf ...
P.S. Так же проект по туториалу я сделаю на mgf, код программок будет очень легкий, так как всю рутину скроет mgf . А сейчас ,в принципе, даже небольшая хомка загромождена многими "тяжелыми" и труднообъяснимыми моментами. В общем, стремимся к совершенству
Поднял тему поддержки аудио форматов. Пишу
класс mgfaudio.cpp в стоставе MGF, вот такие вещи в базовом классе:
bool AutoNext;
bool Playing;
bool Paused;
int CurIndex;
int Count;
int Add(const char *filename);
int Delete(int Index);
int Play();
int Stop();
int Pause();
int Next();
int Prev();
int Clear();
void Update();
это будет работать для любого поддерживаемого формата музыки !
сейчас реализовал поддержку MP3 из libmad, так же добавлю AT3.
И еще ! в SDK добавил библиотеку mikmod (так же их привяжу к MGF), а она реализует воспроизведение WAV, MOD, XM, IT, S3M, STM, MTM, 669, FAR, DSM, MED, ULT, UNI !!! Также позже добавлю OGG.
Так что будет мощная поддержка аудио форматов, и после Tetris я наверно сделаю многоформатный аудио-плеер для PSP :neo:
Никак не получается вернутся из отпуска, но программерская ломка взяла своё - начал писать основные классы для кримсона. Думается к концу следующей недели будет работающая версия.
Очень жду обновлений от wSlava.
План игры:
Уровень игры представляет собой двумерное пространство (вид сверху) с расположенными на нём динамическими (аналог физики) и статическими препятствиями. На уровне располагаются один или несколько "генераторов монстров", которые нужно уничтожить игроку для успешного прохождения уровня.
Игра будет построена на линейном прохождении нескольких уровней.
Уровни отличаются количеством и расположением статических и динамических объектов и "генераторов монстров". Так же, возможно, для уровней будет сделана индивидуальная тайловая карта, хотя пока я склоняюсь не делать этого...
Пока планирую только один тип монстров.
Физика представляет из себя столкновения акружностей, поэтому все объекты, игрок и монстры имеют похожую форму. (:
В игре предположительно будет 3 вида оружия и несколько бонусов (обдумывается) - например ускорение игрока.
Очки в игре начисляются за количество убитых монстров и отнимаются за время, привышающее установленное для прохождения конкретного уровня.
Будет вестись таблица рекордов.
Игра по сети и глобальная таблица рекордов не планируются.
Сделаю это, а там посмотрим, задел на улучшение постараюсь заложить в структуре движка...
Прикольно. Я вчера чуть доработал MGF_AUDIO, так что вроде можно уже показать . Еще один баг нашел в MGF в спрайтах, там (точно не помню) есть при вычислении имени игдекс [b+1], так вот нужно [b], это и есть глюк, который в 30 посте описывал. Еще универсальное иерархическое меню в виде дерева организовал, можно потом подумать, как это в MGF вставить, выложу, посмотришь.
Сегодня вечером уже точно выложу SDK и подредактированный MGF.
Ещё в MGFFONT есть косяк с выравниванием по правому краю - что-то я там поломал, когда пытылся ошибку найти. В принципе пока не значительный баг - как только до среды разработки доберусь - поправлю.
В спрайтах гляну, может ещё что не доглядел... Т.к. частично переносил из старого движка.
В общем мне пока нравится, как всё идёт. (:
Надо бы после кримсона занятся разборками с 3д. (:
Выкладываю дополненный SDK http://www.ifolder.ru/2010023
в котором добавил библиотеку libmikmod, а это означает поддержку WAV и большинства треккерных файлов.
Так же выклыдываю свою редакцию MGF, нашел парочку глюков, поправил шрифты, и, самое главное, добавил базовый класс работы с аудио mgfaudio.
Пока реализовал поддержку MP3 и WAV, но позже добавлю треккерные файлы и OGG.
Mortem, посмотри, может чего сам добавишь.
Вот структура MakeFile, когда задействован практически весь движок (из тетриса, полную версию так же вскоре выложу)
TARGET=TETRIS
OBJS=MGF/vram.o MGF/mgfutils.o MGF/mgftexture.o MGF/tgatexture.o MGF/pngtexture.o MGF/jpgtexture.o MGF/mgfcallback.o MGF/mgf.o MGF/mgfsprite.o MGF/mgffont.o MGF/mgfaudio.o MGF/mp3player.o main.o game.o
INCDIR =MGF
CFLAGS=-g -G0 -O0
CXXFLAGS=$(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS=$(CFLAGS)
BUILD_PRX=0
LIBDIR=
LDFLAGS=
LIBS=-lstdc++ -lpspgum -lpspgu -lpng -lz -ljpeg -lpsprtc -lm -lmad -lmikmod -lpspaudiolib -lpspaudio -lpsppower
EXTRA_TARGETS=EBOOT.PBP
PSP_EBOOT_TITLE=tetris
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
при этом в один момент времени можно проигрывать лишь один MP3 (в принципе есть возможность несколько каналов организовать, но MP3 очень ресурсоемкий и смысла пока в этом не вижу), а Wav
можно воспроизводить несколько одновременно (точнее я поставил 10) , так же Wav будет микширован с другими звуковыми каналами это полезно
для эффектов (например поверх фоновой музыки), правда можно использовать только MONO Wave в несжатом RIFF формате.
Ну вроде все, тетрис мой уже почти совсем готов, самому уже не терпится выложить, но хочу уже все доделать, а не выкладывать шлейф бета версий, так что все путем
P.S. Mortem, да, самому хочется что нибудь "навороченное" из 3D замутить, мозг размять, но пока надо имеющиеся проекты закончить
Последний раз редактировалось wSlava; 14.05.2007 в 23:55.
Ух, жесть, еще один серьезный баг.
В общем у тебя (Mortem) есть класс MGFTEXTURE, в
MGFTEXTURE *MGF::Texture_Add
идет создание по типу: tex = new TGATEXTURE(); или tex = new PNGTEXTURE(); или tex = new JPGTEXTURE();
так вот виртуальная функция Load здесь срабатывает, так как в tex
приведенный указатель к конкретному типу, а вот когда возникает
Remove в void MGF::Texture_Remove(MGFTEXTURE *tex) {
указатель уже MGFTEXTURE !!! соответсвенно вызывается пустой Remove из
MGFTEXTURE, и память через некоторое время кончается и зызы виснет...
сначала я в Texture_Remove перед delete поправил так:
((PNGTEXTURE*)t)->Remove() ...
но потом посмотрел что везде одно и тоже и удалил везде Remove
а в базовом MGFTEXTURE оставил невиртуальный базовый Remove ...
В аттачменте все поправлено и работает ОК.
Последний раз редактировалось wSlava; 15.05.2007 в 01:39.
Еще мелкое замечание, ты для таймера используешь float, особо не вдавался в анализ, но чего то странное с ним твориться стало (слабозаметные рывки при анимации), числа delta порядка 0.035, вроде должно нормально, потом посмотрел, что раньше у меня было double, поставил так же и все ОК...