您的位置:首页 > 其它

基于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);

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: