Cocos2d-x 3.3 动作游戏连续普通攻击判断-改进

前端之家收集整理的这篇文章主要介绍了Cocos2d-x 3.3 动作游戏连续普通攻击判断-改进前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

上一篇Cocos2d-x 3.3 动作游戏连续普通攻击判断

改进一下代码,实现了顺序播放动画效果,但是无法做到在播放动画途中按下攻击键,实现"预读"下一个动作效果

void ContButton::update(float dt)
{
	if(this->isTouch) 
	{
		if(touchflag)
		{	
			touchflag=false;
			if(touchCounts==0)touchcounts=1;
			if(touchCounts==1)touchcounts=2;
			if(touchCounts==2)touchcounts=0;
		}

	}
	if(m_pHero->getNomalAttackA()->isDone()||m_pHero->getNomalAttackB()->isDone()||m_pHero->getNomalAttackC()->isDone())
	{touchflag=true;CCLOG("--------->%d",touchCounts);}
	if(touchcounts!=touchCounts)
	{
		if(touchcounts==1)onSingleCLick();
		if(touchcounts==2)onDoubleClick();
		if(touchcounts==0)onThreeClick();
		touchCounts=touchcounts;
	}
}

改进2

void ContButton::update(float dt)
{
	if(this->isTouch) 
	{
		if(touchflag)
		{	
			touchflag=false;
			if(touchCounts==0)touchcounts=1;
			if(touchCounts==1)touchcounts=2;
			if(touchCounts==2)touchcounts=0;
			this->unschedule(schedule_selector(ContButton::updateAttackDelay));
			CCLOG("--------->%d",touchCounts);
		}
		isTouch=false;
	}
	if(m_pHero->getNomalAttackA()->isDone()||m_pHero->getNomalAttackB()->isDone()||m_pHero->getNomalAttackC()->isDone())
	{
		touchflag=true;
	}
	if(touchcounts!=touchCounts)
	{
		if(touchcounts==1)onSingleCLick();
		if(touchcounts==2)onDoubleClick();
		if(touchcounts==0)onThreeClick();
		touchCounts=touchcounts;
		this->scheduleOnce(schedule_selector(ContButton::updateAttackDelay),0.8f);
	}
}
再改,加入蓄力系统,完全实现效果,但是纯过程编程.希望继续优化
void ContButton::update(float dt)
{
	if(touchcounts!=touchCounts)
	{
		if(touchflag)
		{
			if(touchcounts==1)onSingleCLick();
			touchflag=false;
		}
		if(m_pHero->getNomalAttackA()->isDone())
		{
			if(touchcounts==2)onDoubleClick();
		}
		if(m_pHero->getNomalAttackB()->isDone())
		{
			if(touchcounts==0)onThreeClick();
		}
		if(m_pHero->getNomalAttackC()->isDone())
		{	
			touchflag=true;
		}
	}
}
void ContButton::touchBegan()
{
	isTouch=true;//按钮按下
	this->schedule(schedule_selector(ContButton::updatelongprogress),1);//蓄力时间判断
	this->unschedule(schedule_selector(ContButton::updateAttackDelay));//取消连击数变0延时
	//做连击判断
	if(touchCounts==0)touchcounts=1;
	if(touchCounts==1)touchcounts=2;
	if(touchCounts==2)touchcounts=0;
	CCLOG("--------->%d",touchCounts);
}
void ContButton::touchEnded()
{
	isTouch=false;
	pressTimes=0;
	this->unschedule(schedule_selector(ContButton::updatelongprogress));
	//如果刚完成长按事件 则把按下次数清零 长按状态置空 直接返回 不继续执行
	if (m_longProgress ) 
	{
		touchCounts=0;
		m_longProgress=false;
		onLongPressed();
		return;
	}
	else
	{
		//判断是否为蓄力状态,是的话切换默认站立状态.蓄力失败
	}

}
void ContButton::onSingleCLick()
{
	CCLOG("signle");//1连击
	m_pHero->runNomalAttackA();
	touchCounts=touchcounts;
	this->scheduleOnce(schedule_selector(ContButton::updateAttackDelay),0.8f);
	//touchCounts++;
}      
void ContButton::onDoubleClick()
{
	CCLOG("double"); //2连击
	m_pHero->runNomalAttackB();
	touchCounts=touchcounts;
	this->scheduleOnce(schedule_selector(ContButton::updateAttackDelay),0.5f);
}      
void ContButton::onThreeClick()
{
	CCLOG("three"); //3连击
	m_pHero->runNomalAttackC();
	touchCounts=touchcounts;

}       
void ContButton::updateAttackDelay(float ft)
{
	touchCounts=0; 
	touchcounts=0;
	touchflag=true;
}
void ContButton::updatelongprogress(float ft)
{
	if (isTouch) 
	{
		pressTimes++;
		if(pressTimes>0.5)
		{
			//放个蓄力动画什么的
			//状态切换为蓄力状态
			//连击延时计数最高也是0.5,所以不会冲突

			if (pressTimes >= 2) 
			{
				m_longProgress=true;
			}
		}
	}
	else
	{
		pressTimes=0;
	}
}
void ContButton::onLongPressed()
{
	CCLOG("preassed");//长按
	//使用蓄力招数
}     

猜你在找的Cocos2d-x相关文章