转发,请保持地址:http://blog.csdn.net/stalendp/article/details/8600180
游戏中,各种效果能够使游戏更有趣。这里将记录游戏Demo的音效和streak特效。
streak特效如下:
streak效果有点像彗星的尾巴,用来表示物体移动速度快。streak有strip, spot, blade, line四种类型,本例中使用的使spot,对于wiEngine的结构体为MS_STYLE_SPOT。
定义streak,如下:
m_streak1 = wyMotionStreak::make(0.5, wyTexture2D::makePNG(RES("R.drawable.boyhit2")), wyc4b(155, 155, 0, 150), MS_STYLE_SPOT); ((wySpotRibbon*)m_streak1->getRibbon())->setDistance(DP(15)); addChildLocked(m_streak1, -1);
其实streak没有什么神秘的,完全可以理解为一个layer,包含了一组相同的sprite,根据给定的路径,结合特定算法更新layer中的元素的显示,达到相应的效果。不同的算法对应不同类型的streak,选择完特定 的streak后,只要指定路径就可以了。这个例子中的路径是hero的移动路径。所以只要注册一个函数来记录路径就可以了;代码如下:
timer = wyTimer::make(wyTargetSelector::make(this, SEL(Boy::onAddPoint))); //创建一个timer类来包裹onAddPoint函数,以便注册。
timer->retain();
//scheduleLocked(timer); //一旦注册,就会立即生效; 可以使用unscheduleLocked(timer);来取消注册
......
void Boy::onAddPoint(wyTargetSelector* ts) {
m_streak1->addPoint(sprite->getPositionX(), sprite->getPositionY()); // 记录sprite的移动路径
}
注册事件来响应Jump按钮。运行的序列如下,0)点击Jump,1)把onAndPoint函数注册到游戏中,从而开启streak效果;2)调用jump函数来施用一个impluse给hero,使物体向上运动;3)hero进行jump运动,并且有streak效果。4)hero着地,被box2d侦测到,触发b2ContactListener的BeginContact函数,进而调用Boy::shotEnd函数(在scene类中注册过监听器),进而取消streak效果。
void Boy::jump() { //响应Jump按钮事件 wyCallFunc* sbegin = wyCallFunc::make(wyTargetSelector::make(this, SEL(Boy::shotBegin))); wyCallFunc* jump = wyCallFunc::make(wyTargetSelector::make(this, SEL(Boy::_jump))); wySequence* s = wySequence::make(sbegin, jump, NULL); sprite->runAction(s); } void Boy::shotBegin() { //开启streak效果 if (!isRushing) { scheduleLocked(timer); isRushing = true; } } void Boy::_jump() { //调用scene的_jump函数 scene->_jump(); } void MyScene::_jump() { //给hero施加一个向上的impulse,从而使hero离开地面,达到跳跃的效果 hero_body->ApplyLinearImpulse(b2Vec2(0, 50.0f), hero_body->GetWorldCenter()); } void MyScene::BeginContact(b2Contact* contact) { //b2ContactListener中的回调函数,将在hero着地的时候被调用。 isfly = false; hero->changeAction(BOY_RUN); hero->shotEnd(); //关闭streak效果 } void Boy::shotEnd() { //关闭streak效果 if(isRushing) { unscheduleLocked(timer); isRushing = false; } }
接着讨论音效的简单实现:
1)预加载音效文件
wyAudioManager::getInstance()->preloadEffect(RES("R.raw.jump"), FORMAT_OGG); wyAudioManager::getInstance()->preloadEffect(RES("R.raw.shoot"), FORMAT_OGG); wyAudioManager::getInstance()->preloadEffect(RES("R.raw.land"), FORMAT_OGG); wyAudioManager::getInstance()->preloadEffect(RES("R.raw.run"), FORMAT_OGG);
typedef enum { BOY_RUN = 0, BOY_JUMP, BOY_HIT, BOY_LAND } BoyActionsTag; ...... void Boy::playEffect(BoyActionsTag tag) { const char* preEffect = soundEffect; switch (tag) { case BOY_JUMP: soundEffect = "R.raw.jump"; break; case BOY_HIT: soundEffect = "R.raw.shoot"; break; case BOY_LAND: soundEffect = "R.raw.land"; break; case BOY_RUN: soundEffect = "R.raw.run"; break; } if (soundEffect != NULL) { if (preEffect != NULL) wyAudioManager::getInstance()->stopEffect(RES(preEffect)); wyAudioManager::getInstance()->playEffect(RES(soundEffect), FORMAT_OGG); } }
wyAudioManager::getInstance()->playBackgroundMusic(RES("R.raw.bg"), FORMAT_WAV, -1);