hello,好像过了好长时间。
上一次在《占星起源》(中)的时候,布置好了星星和线段和星星接触后的一个算法,额,那确实是个不怎么高明的算法,这里想纠正一下。
弄得有些急,很多东西没有去完善(还有就是没有美术资源);
。。。。。
看一张图:
假设A B 线段要过蓝色小球,那么角BAC 一定会小于某一个值,同时角BCA 一定会大于某一值(保证AB线段的长度已定超过C)。
所以只要时刻监测这两个角度的关系即可判断是否想接触了。
下面是具体的检测函数:
(3个关节)
float ab_angle=getMyAngle(sp1->getPosition(), sp->getPosition(), sp2->getPosition());
float c_angle=getMyAngle(sp2->getPosition(), sp->getPosition(), sp1->getPosition());
float bc_angle=getMyAngle(sp2->getPosition(), sp->getPosition(), sp3->getPosition());
float d_angle=getMyAngle(sp3->getPosition(), sp->getPosition(), sp2->getPosition());
log("%f",d_angle);
log("ccc%f",bc_angle);
if((ab_angle<3&&c_angle<90)||(bc_angle<3&&d_angle<90)){
}else{
}
float GameScene::getMyAngle(Point cen,Point fristPoint ,Point scendPoint){
float dx1,dx2,dy1,dy2;
float angle;
dx1=fristPoint.x-cen.x;
dx2=scendPoint.x-cen.x;
dy1=fristPoint.y-cen.y;
dy2=scendPoint.y-cen.y;
float c=sqrtf(dx1*dx1+dy1*dy1)*sqrtf(dx2*dx2+dy2*dy2);
if(c==0){
}
float p_angle=acosf((dx1*dx2+dy1*dy2)/c)/(3.1415)*180;
return p_angle;
}
上面用到了,求角度的方法,可以查阅之前的文章,里里面有很详细的讲解(这个函数我用了很多次了(《实现鲤的控制》里有说道))。
这个算法根据关节数的不同,相应的会变更。
接下来就要解决一些问题了;
每一关玩家所要完成的星星数量是不同的,所以检测数量也是不一样的。怎么样才能检测玩家把所有的星星都连接完了呢?
还记得上一次写星星类的时候吗,里面注明了一些会有变动的地方。
我们需要给已经连接好的星星一个标记,通过改变当中的值来模拟该星星是否已经被连接:
比如:
void setOk(bool ok);//设置连接状态
bool getOk();//获取连接状态
bool isok;//用来记录是否被连接
void Star::setOk(bool ok){
isok=ok;
}
bool Star::getOk(){
return isok;
}
然后再检测的时候:
void GameScene::check(Star*sp){
//省略
if((ab_angle<3&&c_angle<90)||(bc_angle<3&&d_angle<90)){
sp->SMove();
sp->setOk(true);//改变状态
}else{
sp->setOk(false);//改变状态
sp->Setop();
}
}
最后,检测连接好的星星个数:
通过获取状态来判断个数(是不是很简单);
int indx=0;
for(auto it=pol->begin();it!=pol->end();it++){
if((*it)->getOk()){
indx++;
}
2,玩家连接好所有的星星后,游戏本身应该有一个反馈。
最常见的就是结算界面了,这个其实是很简单的东西。
比如:
现在先简单说一下,这个结算界面必须是一个实体,如果只是在游戏中用图片和一些按钮的形式组合起来,整个界面如果要执行动作是会被跳过的。
再有,在玩家完成游戏的时候,例如游戏用时,分数也需要交给这个实体去处理:
比如它有这些方法:
static ScoreLayer*create(int score);//创建
virtual bool init(int score);//初始化
......
void Show();//出现
void Vis();
void ShowStart();//星星个数
这里我是这样实现的(虽然不好看,也没有加入分数,你们可以在文章末尾获取到源码)
3.关卡问题:
游戏中有很多关卡,每个关卡的星星个数,位置都是不一样的,而且线段的额关节个数也是不一样的。
比如:
因为这里我只设置了5小关。所以不打算用读配置文件的方法创建关卡,如果你有兴趣也可以自己试着去尝试,比如读XML,TXT ,jison文件,都是可以的,下次如果有机会,也会详细的介绍这种方法。
因为这里比较简单,所以只是用了简单判断。
对了,有没有发现,现在的星星不是用小圆圈了,而是真的该用星星了(谢谢一位老哥发了一张图过来。)
而且当线段没有连接星星是星星是暗的,连接后星星是亮的,这里说一下,其实也没有什么技术含量,这里并没有使用shader。
看一张图:
他们是这样一个关系:
在游戏开始的时候,暗层就显示暗的星星,亮层则是为空的,接触的时候,就调用它的接口,让它亮起来,再次移走之后就把亮层移除。
代码地址:
http://pan.baidu.com/share/link?shareid=1814932273&uk=1435100278
(感觉这篇质量很不好,以后要继续加油)
拜~