【广而告之】山寨腾讯“爱消除”游戏已经正式入驻GitHub,项目地址是:https://github.com/3125788/CrazyLink
欢迎广大寨友一起来完善这个游戏。
这个山寨开源工程得到了以下网友的关注,在这里先谢过了!
在山寨腾讯“爱消除”游戏第四日的教程中,我们介绍了交换特效drawExchange的详细实现方法。这个特效一直沿用到现在。
细心的寨友可能已经发现了,如果用手指在屏幕上快速地乱滑,也就是在前一个交换动作没有彻底完成之前又开始另一个交换动作,屏幕上的显示会出现动物消失的情况,滑动的动作如果较慢,就不会有这种现象。
今天,我们就来解决这个问题。这个 解决问题的方法也可以用到其它特效上。
首先,我们用一个ArrayList来保存可操作的DrawExchange对象列表,取而代之原来仅有的一个DrawExchange对象。(红色是删除的代码,绿色是新替换的代码)
其次,我们新增了一个函数来处理交换特效对象列表的初始化:
void initExchangeList()
{
DrawExchange drawExchange;
for(int i = 0; i < CrazyLinkConstent.EXCHANGE_OBJ; i++)
{
drawExchange = new DrawExchange(drawAnimal);
controlRegister(drawExchange.control);
mDrawExchangeList.add(drawExchange);
}
}
第三步,增加一个获取DrawExchange对象的方法,如果没有可用的对象,则返回null,这个方法在触发交换动作EXCHANGE_START时会用到:
case EXCHANGE_START:
{
clearAutoTip();
Bundle b = msg.getData();
int col1 = b.getInt("col1");
int col2 = b.getInt("col2");
int row1 = b.getInt("row1");
int row2 = b.getInt("row2");
mStatus[col1][row1] = EFT_EXCHANGE; //处于交换状态
mStatus[col2][row2] = EFT_NONE;
setSingleScorePosition(col1, row1);
int pic1 = getPicId(col1, row1);
int pic2 = getPicId(col2, row2);
DrawExchange drawExchange = getDrawExchange();
if(drawExchange != null) drawExchange.init(pic1, col1, row1, pic2, col2, row2);
break;
}
获取DrawExchang对象函数:
static DrawExchange getDrawExchange()
{
DrawExchange drawExchange;
CtlExchange ctl;
for(int i = 0; i < CrazyLinkConstent.EXCHANGE_OBJ; i++)
{
drawExchange = mDrawExchangeList.get(i);
ctl = (CtlExchange)drawExchange.control;
if(!ctl.isRun()) return drawExchange;
}
return null;
}
第四步,新增交换渲染对象的执行函数,该函数在渲染EFT_EXCHANGE特效时会被调用:
case EFT_EXCHANGE: //交换特效
drawExchangeRun(gl);
break;
交换特效执行函数:
void drawExchangeRun(GL10 gl)
{
DrawExchange drawExchange;
CtlExchange ctl;
for(int i = 0; i < CrazyLinkConstent.EXCHANGE_OBJ; i++)
{
drawExchange = mDrawExchangeList.get(i);
ctl = (CtlExchange)drawExchange.control;
if(ctl.isRun()) drawExchange.draw(gl);
}
}
通过以上简单的四步,就实现了对交换特效的优化,优化后,玩家可用快速地随意在屏幕上快速滑动,多个交换特效会同时得到执行。这个改进可以让玩家更好地利用规则得到高分。