Перемещение системы частиц в cocos2d-x

Обсуждение специальной версии Magic Particles (Dev), предназначенной для разработчиков игр.

Перемещение системы частиц в cocos2d-x

Сообщение koseki » Вс окт 06, 2013 9:48 pm

Привет, использую враппер для cocos2d-x, пытаюсь переместить эмиттер через SetPosition в режиме перемещения MAGIC_CHANGE_EMITTER_ONLY, в результате эмиттер двигается, шлейф есть, но он движется по оси Y в обратном направлении, т.е. когда эмиттер летит вверх, то шлейф за ним летит так, как будто эмиттер движется вниз, и наоборот. Я так понимаю проблема в том, что в кокосе используется система координат OpenGL, где начало координат в нижнем левом углу. Как можно решить эту проблему, может я что-то не так настроил?
koseki
 
Сообщения: 6
Зарегистрирован: Вс окт 06, 2013 9:41 pm

Re: Перемещение системы частиц в cocos2d-x

Сообщение koseki » Вс окт 06, 2013 10:55 pm

Похоже нашел проблему, в mp_wrapp.cpp в методе void MP_Atlas_WRAP::Draw(MAGIC_PARTICLE_VERTEXES* vertexes), есть обработка этого момента в #ifdef FLIP_Y_2D. Вот тут неверно стоит знак перед ry, заменил -ry на +ry, частицы стали отображаться на нужных позициях.

Код: Выделить всё
#ifdef FLIP_Y_2D
float ry=vertexes->vertex1.y-device->emitter_y_source;
vertexes->vertex1.y=device->emitter_y_target+ry;

ry=vertexes->vertex2.y-device->emitter_y_source;
vertexes->vertex2.y=device->emitter_y_target+ry;

ry=vertexes->vertex3.y-device->emitter_y_source;
vertexes->vertex3.y=device->emitter_y_target+ry;

ry=vertexes->vertex4.y-device->emitter_y_source;
vertexes->vertex4.y=device->emitter_y_target+ry;
#endif
koseki
 
Сообщения: 6
Зарегистрирован: Вс окт 06, 2013 9:41 pm

Re: Перемещение системы частиц в cocos2d-x

Сообщение Odin_KG » Пн окт 07, 2013 5:55 am

koseki
Благодарю за информацию!
Мне думается, что с моей стороны стоит тут еще немного повозиться. Жаль только, что глюки обычно находятся в самый последний момент - я почти было выпустил новую версию...
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Перемещение системы частиц в cocos2d-x

Сообщение koseki » Вт окт 08, 2013 10:19 pm

Есть еще один косяк, если добавить эмиттер на слой, а потом этот слой промасштабировать, то частицы смещаются по оси Y, в результате чего не совпадают с реальными координатами внутри этого слоя. Не знаю пока, куда копать.
koseki
 
Сообщения: 6
Зарегистрирован: Вс окт 06, 2013 9:41 pm

Re: Перемещение системы частиц в cocos2d-x

Сообщение Odin_KG » Ср окт 09, 2013 1:24 am

Есть еще один косяк, если добавить эмиттер на слой, а потом этот слой промасштабировать, то частицы смещаются по оси Y, в результате чего не совпадают с реальными координатами внутри этого слоя.

Magic Particles же не знает про слои cocos-а. Вообще как бы работать с Magic Particles через слои не совсем верно, так как привязки свойств эмиттера к свойствам слоя отсутствует (я пытался привязать только положение). В Magic Particles есть собственное масштабирование эмиттеров Magic_SetScale и собственное вращение Magic_SetEmitterDirection.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Перемещение системы частиц в cocos2d-x

Сообщение koseki » Вт ноя 05, 2013 1:13 am

С последними обновлениями все стало работать как надо, но возникла проблема внезапно. У меня проект был на cocos2dx 2.0.3, сегодня решил обновиться на 2.2, и обнаружил, что у частиц неверные текстурные координаты. Проверил эти же частицы на примере из враппера, там та же борода с ними. Оказалось, что они работали нормально на версии 2.0.3, а начиная с 2.1 уже с ошибкой. При этом частицы из примера рисуются нормально. Добавлю к посту частицы, на которых я проверял, чтобы можно было посмотреть на них.
Вложения
screen.png
Скриншот ошибки
screen.png (15.32 Кб) Просмотров: 65422
test.ptc.zip
Пример частиц
(3.69 Мб) Скачиваний: 3593
koseki
 
Сообщения: 6
Зарегистрирован: Вс окт 06, 2013 9:41 pm

Re: Перемещение системы частиц в cocos2d-x

Сообщение Odin_KG » Вт ноя 05, 2013 9:10 pm

Я разобрался с этой проблемой. Постараюсь завтра выложить обновление.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Перемещение системы частиц в cocos2d-x

Сообщение koseki » Ср ноя 06, 2013 12:17 am

Спасибо.

Нашел еще одну проблему. После того, как отрендерится система частиц не восстанавливается glBlendFunc, из-за чего могут возникнуть проблемы с отображением слоев, которые будут рендериться после частиц. У себя я исправил это сохранением текущих настроек блендинга в int MP_Emitter::Render() и восстановлением их в конце метода.

Ниже код приведу на всякий случай.

Код: Выделить всё
// save off current state of blend enabled
GLboolean blendEnabled;
glGetBooleanv(GL_BLEND, &blendEnabled);

// save off current state of src / dst blend functions
GLint blendSrc;
GLint blendDst;
glGetIntegerv(GL_BLEND_SRC_ALPHA, &blendSrc);
glGetIntegerv(GL_BLEND_DST_ALPHA, &blendDst);

//
// change blend state... do other stuff
//

// restore saved state of blend enabled and blend functions
if (blendEnabled) {
    glEnable(GL_BLEND);
}
else {
    glDisable(GL_BLEND);
}

glBlendFunc(blendSrc, blendDst);


И еще, другая проблема возникает не только на кокосе, но и на мармеладе как минимум. Некоторые системы частиц не получается перемещать, они все время рисуются в одной и той же позиции, приходится в редакторе создавать систему частиц заново и перекидывать в нее частицы из "поломанной". Могу скинуть эмиттеры, на которых это проявляется, если нужно.
koseki
 
Сообщения: 6
Зарегистрирован: Вс окт 06, 2013 9:41 pm

Re: Перемещение системы частиц в cocos2d-x

Сообщение Odin_KG » Ср ноя 06, 2013 6:47 am

По поводу BlendFunc... у меня это вроде бы исправлено уже:
Код: Выделить всё
void CCMagicEmitter::visit(void)
{
   GLint attr_GL_BLEND_SRC_ALPHA, attr_GL_BLEND_DST_ALPHA;
   glGetIntegerv(GL_BLEND_SRC_ALPHA, &attr_GL_BLEND_SRC_ALPHA);
   glGetIntegerv(GL_BLEND_DST_ALPHA, &attr_GL_BLEND_DST_ALPHA);

   // Set the shader program for OpenGL
   CCGLProgram* program=CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColor);
   setShaderProgram(program);
   program->use();
   program->setUniformsForBuiltins();
   ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position | kCCVertexAttribFlag_TexCoords | kCCVertexAttribFlag_Color);

   emitter->Render();

   glBlendFunc(attr_GL_BLEND_SRC_ALPHA, attr_GL_BLEND_DST_ALPHA);
}


хотя... можно еще добавить:
Код: Выделить всё
GLboolean blendEnabled;
glGetBooleanv(GL_BLEND, &blendEnabled);

хуже точно не будет.

У себя я исправил это сохранением текущих настроек блендинга в int MP_Emitter::Render() и восстановлением их в конце метода.

Здесь ничего исправлять не рекомендую - это ядро враппера, которое одинаково для всех платформ, включая DirectX.

И еще, другая проблема возникает не только на кокосе, но и на мармеладе как минимум. Некоторые системы частиц не получается перемещать, они все время рисуются в одной и той же позиции

Такие проблемы, скорее всего, относятся к настройкам эмиттера. У эмиттера есть режим перемещения и вращения, который определяет, остаются ли частицы на месте или перемещаются/вращаются вместе с эмиттером. В API это задается через Magic_SetEmitterPositionMode/Magic_SetEmitterDirectionMode. В редакторе есть кнопка под сценой (следующая после масштаба сцены), которая устанавливает этот режим для эмиттера. Вы попробуйте сначала менять режим через API (передавайте true).
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

Re: Перемещение системы частиц в cocos2d-x

Сообщение Odin_KG » Сб ноя 09, 2013 2:30 pm

Только что обновил все библиотеки: http://astralax.ru/engine
и все врапперы: http://astralax.ru/wrapper

Хотел сделать это пару дней назад, но у меня проблема с платформой Android для Cocos-а. Её делал другой человек, но потом как выяснилось, она толком не работала. Я ждал пока будет исправлено, но не дождался. Поэтому выкладываю так.
Аватара пользователя
Odin_KG
Administrator
Administrator
 
Сообщения: 841
Зарегистрирован: Чт янв 15, 2009 2:57 pm

След.

Вернуться в Magic API

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron