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

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

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

streak特效如下:

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

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

2)封装一个函数

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




你可能感兴趣的:(Engine)