基于WiEngine游戏引擎--角色基本效果 .

转发,请保持地址:http://blog.csdn.net/stalendp/article/details/8600180

游戏中,各种效果能够使游戏更有趣。这里将记录游戏Demo的音效和streak特效。

streak特效如下:


streak效果有点像彗星的尾巴,用来表示物体移动速度快。streak有strip, spot, blade, line四种类型,本例中使用的使spot,对于wiEngine的结构体为MS_STYLE_SPOT。

定义streak,如下:

  1. m_streak1 = wyMotionStreak::make(0.5, wyTexture2D::makePNG(RES("R.drawable.boyhit2")), wyc4b(155, 155, 0, 150), MS_STYLE_SPOT);  
  2. ((wySpotRibbon*)m_streak1->getRibbon())->setDistance(DP(15));  
  3. 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的移动路径。所以只要注册一个函数来记录路径就可以了;代码如下:

  1. timer = wyTimer::make(wyTargetSelector::make(this, SEL(Boy::onAddPoint))); //创建一个timer类来包裹onAddPoint函数,以便注册。  
  2. timer->retain();  
  3. //scheduleLocked(timer); //一旦注册,就会立即生效; 可以使用unscheduleLocked(<SPAN class=s1>timer</SPAN>);来取消注册  
  4.   
  5. ......  
  6. void Boy::onAddPoint(wyTargetSelector* ts) {  
  7.     m_streak1->addPoint(sprite->getPositionX(), sprite->getPositionY()); // 记录sprite的移动路径  
  8. }  
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效果。

  1. void Boy::jump() { //响应Jump按钮事件  
  2.     wyCallFunc* sbegin = wyCallFunc::make(wyTargetSelector::make(this, SEL(Boy::shotBegin)));  
  3.     wyCallFunc* jump = wyCallFunc::make(wyTargetSelector::make(this, SEL(Boy::_jump)));   
  4.     wySequence* s = wySequence::make(sbegin, jump,  NULL);  
  5.     sprite->runAction(s);  
  6. }   
  7.   
  8. void Boy::shotBegin() {   //开启streak效果  
  9.     if (!isRushing) {  
  10.         scheduleLocked(timer);  
  11.         isRushing = true;  
  12.     }  
  13. }  
  14.   
  15. void Boy::_jump() {  //调用scene的_jump函数  
  16.     scene->_jump();  
  17. }  
  18.   
  19. void  MyScene::_jump() { //给hero施加一个向上的impulse,从而使hero离开地面,达到跳跃的效果  
  20.     hero_body->ApplyLinearImpulse(b2Vec2(0, 50.0f),  
  21.             hero_body->GetWorldCenter());  
  22. }  
  23.   
  24. void  MyScene::BeginContact(b2Contact* contact) { //b2ContactListener中的回调函数,将在hero着地的时候被调用。  
  25.     isfly = false;  
  26.     hero->changeAction(BOY_RUN);  
  27.     hero->shotEnd(); //关闭streak效果  
  28. }  
  29.   
  30. void Boy::shotEnd() {  //关闭streak效果  
  31.     if(isRushing) {  
  32.         unscheduleLocked(timer);  
  33.         isRushing = false;  
  34.     }  
  35. }  
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)预加载音效文件

  1. wyAudioManager::getInstance()->preloadEffect(RES("R.raw.jump"), FORMAT_OGG);  
  2. wyAudioManager::getInstance()->preloadEffect(RES("R.raw.shoot"), FORMAT_OGG);  
  3. wyAudioManager::getInstance()->preloadEffect(RES("R.raw.land"), FORMAT_OGG);  
  4. 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)封装一个函数

  1. typedef enum {  
  2.     BOY_RUN = 0, BOY_JUMP, BOY_HIT, BOY_LAND  
  3. } BoyActionsTag;  
  4. ......  
  5. void Boy::playEffect(BoyActionsTag tag) {  
  6.     const char* preEffect = soundEffect;  
  7.     switch (tag) {  
  8.     case BOY_JUMP:  
  9.         soundEffect = "R.raw.jump";  
  10.         break;  
  11.     case BOY_HIT:  
  12.         soundEffect = "R.raw.shoot";  
  13.         break;  
  14.     case BOY_LAND:  
  15.         soundEffect = "R.raw.land";  
  16.         break;  
  17.     case BOY_RUN:  
  18.         soundEffect = "R.raw.run";  
  19.         break;  
  20.     }  
  21.     if (soundEffect != NULL) {  
  22.         if (preEffect != NULL)  
  23.             wyAudioManager::getInstance()->stopEffect(RES(preEffect));  
  24.         wyAudioManager::getInstance()->playEffect(RES(soundEffect),  
  25.                 FORMAT_OGG);  
  26.     }  
  27. }  
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);
	}
}

另外,背景音乐的播发:

  1. wyAudioManager::getInstance()->playBackgroundMusic(RES("R.raw.bg"), FORMAT_WAV, -1);  

 

 

【原文:http://blog.csdn.net/stalendp/article/details/8600180

 

基于WiEngine游戏引擎--战斗场景之技能 --http://blog.csdn.net/stalendp/article/details/8606424

基于WiEngine游戏引擎--战斗场景之boss --http://blog.csdn.net/stalendp/article/details/8605053

基于WiEngine游戏引擎--背景移动 --http://blog.csdn.net/stalendp/article/details/8602281

基于WiEngine游戏引擎--角色基本效果 --http://blog.csdn.net/stalendp/article/details/8600180

基于WiEngine游戏引擎--物理引擎 --http://blog.csdn.net/stalendp/article/details/8593256

基于WiEngine游戏引擎的Sample --http://blog.csdn.net/stalendp/article/details/8589324

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值