基于WiEngine游戏引擎--角色基本效果 .
2013-11-01 13:22
435 查看
streak微云游戏引擎特效音效
转发,请保持地址:http://blog.csdn.net/stalendp/article/details/8600180
游戏中,各种效果能够使游戏更有趣。这里将记录游戏Demo的音效和streak特效。
streak特效如下:
streak效果有点像彗星的尾巴,用来表示物体移动速度快。streak有strip, spot, blade, line四种类型,本例中使用的使spot,对于wiEngine的结构体为MS_STYLE_SPOT。
定义streak,如下:
[cpp]
view plaincopyprint?
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的移动路径。所以只要注册一个函数来记录路径就可以了;代码如下:
[cpp]
view plaincopyprint?
timer = wyTimer::make(wyTargetSelector::make(this, SEL(Boy::onAddPoint))); //创建一个timer类来包裹onAddPoint函数,以便注册。
timer->retain();
//scheduleLocked(timer); //一旦注册,就会立即生效; 可以使用unscheduleLocked(<SPAN class=s1>timer</SPAN>);来取消注册
......
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效果。
[cpp]
view plaincopyprint?
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)预加载音效文件
[cpp]
view plaincopyprint?
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);
2)封装一个函数
[html]
view plaincopyprint?
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); } }
另外,背景音乐的播发:
[cpp]
view plaincopyprint?
wyAudioManager::getInstance()->playBackgroundMusic(RES("R.raw.bg"), FORMAT_WAV, -1);
【原文:/article/7718232.html】
基于WiEngine游戏引擎--战斗场景之技能
基于WiEngine游戏引擎--战斗场景之boss
基于WiEngine游戏引擎--背景移动
基于WiEngine游戏引擎--角色基本效果
基于WiEngine游戏引擎--物理引擎
基于WiEngine游戏引擎的Sample
转发,请保持地址:http://blog.csdn.net/stalendp/article/details/8600180
游戏中,各种效果能够使游戏更有趣。这里将记录游戏Demo的音效和streak特效。
streak特效如下:
streak效果有点像彗星的尾巴,用来表示物体移动速度快。streak有strip, spot, blade, line四种类型,本例中使用的使spot,对于wiEngine的结构体为MS_STYLE_SPOT。
定义streak,如下:
[cpp]
view plaincopyprint?
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);
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的移动路径。所以只要注册一个函数来记录路径就可以了;代码如下:
[cpp]
view plaincopyprint?
timer = wyTimer::make(wyTargetSelector::make(this, SEL(Boy::onAddPoint))); //创建一个timer类来包裹onAddPoint函数,以便注册。
timer->retain();
//scheduleLocked(timer); //一旦注册,就会立即生效; 可以使用unscheduleLocked(<SPAN class=s1>timer</SPAN>);来取消注册
......
void Boy::onAddPoint(wyTargetSelector* ts) {
m_streak1->addPoint(sprite->getPositionX(), sprite->getPositionY()); // 记录sprite的移动路径
}
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效果。
[cpp]
view plaincopyprint?
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; } }
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)预加载音效文件
[cpp]
view plaincopyprint?
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);
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);
2)封装一个函数
[html]
view plaincopyprint?
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); } }
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); } }
另外,背景音乐的播发:
[cpp]
view plaincopyprint?
wyAudioManager::getInstance()->playBackgroundMusic(RES("R.raw.bg"), FORMAT_WAV, -1);
【原文:/article/7718232.html】
基于WiEngine游戏引擎--战斗场景之技能
--/article/7718235.html
基于WiEngine游戏引擎--战斗场景之boss
--/article/7718234.html
基于WiEngine游戏引擎--背景移动
--/article/7718233.html
基于WiEngine游戏引擎--角色基本效果
--/article/7718232.html
基于WiEngine游戏引擎--物理引擎
--/article/7718231.html
基于WiEngine游戏引擎的Sample
--/content/6744160.html
相关文章推荐
- 基于WiEngine游戏引擎--角色基本效果
- 基于WiEngine游戏引擎的Sample
- 基于WiEngine游戏引擎--战斗场景之boss
- 基于WiEngine游戏引擎--战斗场景之技能
- 基于WiEngine游戏引擎--物理引擎
- 基于WiEngine游戏引擎--背景移动
- 基于Torque游戏引擎的坦克项目进行初步成果测试,效果不错(提供下载)
- 【Cocos2d-x游戏引擎开发笔记(9)】实现DotA的技能冷却效果(转)
- 基于cocos2d-x引擎的游戏框架设计
- 【WiEngine 游戏引擎】基础(1)添加一个精灵
- 基于silverlight GDE-X开发进展 - 游戏引擎状态机
- 基于Unity3d 引擎的Android游戏优化
- 基于OGRE所实现的高层游戏引擎框架(2)
- 基于cocos2d-x引擎的游戏框架设计
- android游戏引擎andengine学习系列五:粒子发射器形成的超炫效果
- android游戏引擎andengine学习系列六:Physics物理碰撞效果理解
- 基于HTML5的战棋游戏引擎
- 【Cocos2d-x游戏引擎开发笔记(11)】粒子系统----实现下雪效果
- 基于cocos2d-x引擎的游戏框架设计