Обновление emitter.gravity в CCParticleSystemQuad при событии касания - PullRequest
1 голос
/ 22 декабря 2011

Я создал простую игру cocos2d для iPhone, в которой есть излучатель CCParticleSystemQuad, который испускает частицы по всей сцене в форме листьев, создавая иллюзию ветра.

Прямо сейчас, ветер (сила тяжести) дует через сцену справа налево. В настоящее время я застрял, пытаясь выяснить, как обновить emitter.gravity для переключения с (-500, 80) на (500, 80), надеюсь, без удаления уже нарисованных частиц.

В этом примере я хотел бы, чтобы переключение происходило при сенсорном событии, происходящем в любом месте экрана.

Как должно выглядеть мое сенсорное событие?

Как обнаружить касание, которое происходит в любом месте на экране?

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

Вот код, который я получил до сих пор:

Мой инициал:

-(id) init
{
if( (self=[super init])) {

    CCSprite * sky = [CCSprite spriteWithFile:@"sky.png"];
    [self addChild:sky z:0 tag:1];

     windDirection = -200;   
    [self leaveEmitters];
    }
return self;
}

Функция My LeaveEmiiters

-(void) leaveEmitters{

NSLog(@"The wind is :%i", windDirection);
CCParticleSystemQuad * emitter;
emitter = [[CCParticleSystemQuad alloc] initWithTotalParticles:100];
emitter.texture = [[CCTextureCache sharedTextureCache] addImage: @"particlesLeaves.png"];
emitter.emitterMode = kCCParticleModeGravity;
emitter.duration = -1;
emitter.gravity = ccp(windDirection, -80);
emitter.angle = 0;
emitter.angleVar = 360;
emitter.speed = 10;
emitter.speedVar = 100;
emitter.radialAccelVar = 0;
emitter.tangentialAccel = 0;
emitter.tangentialAccelVar = 0;
emitter.life = 10;
emitter.lifeVar = 0;
emitter.startSpin = 0;
emitter.startSpinVar = 360;
emitter.endSpin = 0;
emitter.endSpinVar = 720;

ccColor4F startColorVar = {255, 100, 0, 0};
ccColor4F startColor = {0, 240,0, 255};   
emitter.startColor = startColor;

emitter.startColorVar = startColorVar;
emitter.endSize = emitter.startSize;



emitter.startSize = 60.0f;
emitter.emissionRate = 3;
emitter.blendAdditive = NO;
emitter.position = ccp(500,250); 
[self addChild: emitter z:10]; 
emitter.autoRemoveOnFinish = YES; 


CCParticleSystemQuad * emitter2;
emitter2 = [[CCParticleSystemQuad alloc] initWithTotalParticles:100];
emitter2.texture = [[CCTextureCache sharedTextureCache] addImage: @"particlesLeaves.png"];
emitter2.emitterMode = kCCParticleModeGravity;
emitter2.duration = -1;
emitter2.gravity = ccp(windDirection, 0);
emitter2.angle = 0;
emitter2.angleVar = 360;
emitter2.speed = 10;
emitter2.speedVar = 100;
emitter2.radialAccelVar = 0;
emitter2.tangentialAccel = 0;
emitter2.tangentialAccelVar = 0;
emitter2.life = 10;
emitter2.lifeVar = 0;
emitter2.startSpin = 0;
emitter2.startSpinVar = 360;
emitter2.endSpin = 0;
emitter2.endSpinVar = 720;
emitter2.startColor = startColor;
emitter2.endSize = emitter.startSize;
emitter2.startSize = 60.0f;
emitter2.emissionRate = 3;
emitter2.blendAdditive = NO;
emitter2.position = ccp(-500,250);  
[self addChild: emitter2 z:10]; 
emitter2.autoRemoveOnFinish = YES; 


}

И, наконец, моя функция ccTouchesBegan, которая вообще не работает. Почему?

-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch  *touch = [touches anyObject];
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
int x = location.x;
int y= location.y;
CCSprite * sky = (CCSprite *) [self getChildByTag:1];
sky.anchorPoint = ccp(0, 0);
CGRect skyHitBox = CGRectMake(sky.position.x, sky.position.y, 500, 500);

if (CGRectContainsPoint(skyHitBox, location)) {
NSLog(@"touch accepted: x: %i y:%i", x, y);
}
}

Буду признателен за любую помощь, обратную связь или предлагаемое направление обучения. Большое спасибо!

РЕДАКТИРОВАТЬ: я ответил на мои собственные вопросы примерно через 20 секунд после того, как я опубликовал это ...

Если кто-то захочет опубликовать свои ответы, я оставлю это еще на 7 часов.

1 Ответ

0 голосов
/ 22 декабря 2011

вы просто можете сохранить эмиттер CCParticleSystemQuad * в качестве закрытого члена экземпляра, чтобы вы могли изменить emitter.gravity внутри ccTouchesBegan

Я не получил именно то, какого эффекта ветра вы пытаетесь достичь.Если вы хотите просто переключиться с одного 500,80 на -500,80, это довольно просто

emitter.gravity = ccp(-emitter.gravity.x, emitter.gravity.y);

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

Я не пробовал этого, но это должно быть хорошей отправной точкой.

Сначала нужно получитьточка касания в координатах скайбокса

CGPoint skyTouchedPoint = ccp( x - sky.position.x, y - sky.position.y)

, тогда вы можете определить центральную точку вашего скайбокса как

CGPoint skyCenterPoint = ccp(sky.size.width/2, sky.size.height/2);

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

CGPoint windDirection = ccpSub(skyTouchedPoint, skyCenterPoint);

этот векторный модуль тем выше, чем дальше от центра вы касались, теперь вы должны увеличить этот векторный модульс коэффициентом, который подходит вам с

windDirection = ccpMult(windDirection, 10.f); //try different values here

, теперь вы можете использовать только компонент x этого вектора, если вы хотите, чтобы ветер всегда использовал один и тот же y (так как вы указали значениеиз 80)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...