首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CCParticleSystemQuad on touch事件上更新emitter.gravity

在CCParticleSystemQuad on touch事件上更新emitter.gravity
EN

Stack Overflow用户
提问于 2011-12-22 09:00:01
回答 1查看 1.1K关注 0票数 1

我已经创建了一个简单的cocos2d iPhone游戏,其中有一个CCParticleSystemQuad发射器,该发射器在场景中发射形状像树叶的粒子,以提供风的错觉。

现在,风(重力)从右到左吹过场景。我目前正试图弄清楚如何更新emitter.gravity以从(-500,80)切换到(500,80),希望不会删除已经绘制的粒子。

在本例中,我希望切换发生在屏幕上任何地方发生的触摸事件上。

我的触摸事件应该是什么样子的?

如何检测屏幕上任何位置发生的触摸?

我也从来没有实现过预定的更新循环。这是我应该思考的方向吗?我想一个更基本的问题是,我这样做对吗?

这是我到目前为止得到的代码:

我的init:

代码语言:javascript
复制
-(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函数

代码语言:javascript
复制
-(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函数,它根本不起作用。为什么?

代码语言:javascript
复制
-(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个小时。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-23 00:27:46

您只需保留一个CCParticleSystemQuad *发射器作为私有实例成员,这样就可以在ccTouchesBegan中修改emitter.gravity

我不知道你到底想要达到什么样的风效果。如果你想简单地从一个500,80切换到-500,80,这很容易

代码语言:javascript
复制
emitter.gravity = ccp(-emitter.gravity.x, emitter.gravity.y);

如果你想根据你击中的天盒的一侧来改变风向,击中中心就等于没有风,而且你的触摸距离中心越远,风就会越大。

我没有尝试这一点,但应该是一个很好的起点。

您首先需要获取天框坐标中的接触点。

代码语言:javascript
复制
CGPoint skyTouchedPoint = ccp( x - sky.position.x, y - sky.position.y)

然后,您可以将您的天空框的中心点定义为

代码语言:javascript
复制
CGPoint skyCenterPoint = ccp(sky.size.width/2, sky.size.height/2);

如果你触摸天框的右半侧,则指向右侧,如果触摸天框的左半侧,则指向左侧。

代码语言:javascript
复制
CGPoint windDirection = ccpSub(skyTouchedPoint, skyCenterPoint);

这个向量模块越高,你接触到的中心越远,你现在应该增加这个向量模块一个适合你的因子。

代码语言:javascript
复制
windDirection = ccpMult(windDirection, 10.f); //try different values here

现在,如果您希望风始终使用相同的y(如您发布的值80),则只能使用此向量的x分量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8598280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档