2011-12-22 10 views
1

シンプルなcocos2d iPhoneゲームを作成しました。CCParticleSystemQuadエミッターは、風の錯覚を与えるために、葉のような形をしたシーン全体に粒子を放出します。CCParticleSystemQuad on touchイベントでemitter.gravityを更新する

今のところ、風(重力)が右から左に向かって吹いています。私は現在、既に描画されているパーティクルを削除せずに、(-500、80)から(500,80)に切り替えるためにemitter.gravityを更新する方法を理解しようとしています。

この例では、スイッチが画面上の任意の場所で発生するタッチイベントで発生するようにしたいと考えています。

私のタッチイベントはどのように見えますか?

どのように画面上のどこで発生する接触を検出するにはどうすればよいですか?

スケジュールされた更新ループを実装したこともありません。これは私が考えなければならない方向ですか?もっと基本的な質問があると思いますが、私はこれについて正しい方向に進んでいますか?

ここで私はこれまで持っているコードです:

私のinit:

-(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; 
} 

マイ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時間以上のためにこれを任せる

答えて

0

あなたはccTouchesBegan

内emitter.gravityを変更することができますので、あなただけの私はyou'rを達成しようとして風の影響を正確にどのような取得didntのプライベートインスタンスメンバーとしてCCParticleSystemQuadの*エミッタを保つことができます。あなたは、単に

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

そのかなり簡単に-500,80する1 500,80から切り替えたい場合は、スカイボックスの魔女側に基づいて風向を変更したい場合は、中央等しいなしを打つと、ヒット風が強くなればなるほど、センターから遠く離れたところに触れることになります。

私はこれを試していませんでしたが、良い出発点でなければなりません。

あなたはスカイボックス内のタッチ点が

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の値を掲示したように)

+0

ニース!これは素晴らしい投稿です。それは私が最初に尋ねたことをもう少し深め、制御します。素晴らしいヒントをありがとう!トピックから少し外れて、タイムイベントを作成するためのヒントはありますか?私はどのようにスプライトを作成するのか把握しようとしていて、プレイヤーにそれが作成されてから1秒近くに触れるようにしています。私は、プレイヤーのスコアが、アイテムにヒットした1秒のマークにどれくらい近づいているか、あまりにも早すぎる、または遅すぎるとスコアが低くなることによって決定されることを望みます。何かご意見は? – GreenWire

関連する問題