Обнаружение столкновений с частицами в Cocos2d

Я использую CCParticleSystemQuad для создания эффекта частиц. Теперь я хотел бы проверить коллизии с CGRect из моей сцены Cocos2d. Я перечислил другую тему, похожую на эту, и подобрался немного ближе, однако у меня все еще нет полного решения, поэтому я повторно перечислил тему с немного другим названием.

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

-(tCCParticle*)getQuadParticle:(int)quadIndex
{
    return &particles[quadIndex];
}

Затем в моей сцене Cocos2d я могу получить частицу и позицию:

tCCParticle *particle = [emitter getQuadParticle:i];
CGPoint pos = particle->pos;

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

[emitter setParticlePos:i newPosition:newPos];

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

Я начал другую тему аналогичного характера под названием «Как получить положение частиц в Cocos2d (iphone)», и мне сказали переопределить метод «обновить» или метод «обновитьQuadWithParticle», но я не уверен, как именно это сделать.

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


person Kangoo    schedule 29.06.2011    source источник
comment
Вам нужно обнаружение столкновений для каждой отдельной частицы? Я могу рассказать вам, как обнаруживать столкновения на эмиттере, но я не думаю, что это то, что вам нужно.   -  person Aaron Goselin    schedule 01.07.2011
comment
Да, мне нужно управлять каждой частицей в отдельности. Любые идеи?   -  person Kangoo    schedule 04.07.2011
comment
Не совсем. Просто догадываюсь, поскольку я еще не изучал системы частиц, но вам действительно не нужно использовать встроенные системы частиц (или вы можете их переопределить). Каждая частица — это просто спрайт, отображаемый с разным оттенком и непрозрачностью (я предполагаю). Лучше всего, вероятно, углубиться в код Cocos2d и переопределить некоторые методы, добавив возможность для каждого спрайта/частицы прикреплять собственное тело.   -  person Aaron Goselin    schedule 04.07.2011
comment
Если у вас получилось, напишите, как вы это сделали :)   -  person Aaron Goselin    schedule 04.07.2011
comment
Хорошо. Я посмотрю на это, но это, вероятно, за пределами моих навыков. Я сделал систему частиц раньше, но она работала довольно медленно, однако в то время я не использовал Cocos2d, так что на этот раз мне может повезти больше. Спасибо за вашу помощь. Я обязательно опубликую результаты, если я добьюсь успеха. Ваше здоровье!   -  person Kangoo    schedule 05.07.2011
comment
Одна из идей состоит в том, чтобы создать собственную систему частиц с помощью box2d. Тогда у вас также будет столкновение. Но, вероятно, это будет довольно жестко для устройства.   -  person Mikael    schedule 13.07.2011
comment
Я думаю, что вам лучше всего попытаться опубликовать этот вопрос на форумах Cocos2D, если вы все еще ищете ответ. Я провел быстрый поиск обнаружения столкновений системы частиц в Cocos 2D (cocos2d-iphone.org/forum/search.php?q=collision+with+particles). Похоже, на эту тему было какое-то активное обсуждение. Извините, я не могу сам ответить на вопрос.   -  person Rob Segal    schedule 29.07.2011


Ответы (1)


Это работает, но предупреждает, что CCParticleSystemQuad может не ответить на getQuadParticle.

Для предупреждения убедитесь, что ваш эмиттер сделан из вашего подкласса (а не из обычного CCParticleSystemQuad), и что ваш метод получения объявлен в интерфейсе (файл .h) и определен в реализации (файл .m).

Глядя на API, я не вижу метод для setParticlePos:newPosition:, но есть что-то похожее: -(void) updateQuadWithParticle:(tCCParticle*)particle newPosition:(CGPoint)pos;

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

Так что попробуйте [emitter updateQuadWithParticle:particle newPosition:newPos];

Надеюсь, это полезно.

person fith    schedule 22.08.2011