1小时开发《占星起源》(下)

hello,好像过了好长时间。

上一次在《占星起源》(中)的时候,布置好了星星和线段和星星接触后的一个算法,额,那确实是个不怎么高明的算法,这里想纠正一下。

弄得有些急,很多东西没有去完善(还有就是没有美术资源);

。。。。。

看一张图:

1小时开发《占星起源》(下)_第1张图片

假设A B 线段要过蓝色小球,那么角BAC 一定会小于某一个值,同时角BCA 一定会大于某一值(保证AB线段的长度已定超过C)。

所以只要时刻监测这两个角度的关系即可判断是否想接触了。

下面是具体的检测函数:

(3个关节)

1小时开发《占星起源》(下)_第2张图片

 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,玩家连接好所有的星星后,游戏本身应该有一个反馈。

最常见的就是结算界面了,这个其实是很简单的东西。

比如:

1小时开发《占星起源》(下)_第3张图片

现在先简单说一下,这个结算界面必须是一个实体,如果只是在游戏中用图片和一些按钮的形式组合起来,整个界面如果要执行动作是会被跳过的。

再有,在玩家完成游戏的时候,例如游戏用时,分数也需要交给这个实体去处理:

比如它有这些方法:

    static ScoreLayer*create(int score);//创建

 virtual bool init(int score);//初始化

    ......

 void Show();//出现

 void Vis();

 void ShowStart();//星星个数

这里我是这样实现的(虽然不好看,也没有加入分数,你们可以在文章末尾获取到源码)

1小时开发《占星起源》(下)_第4张图片

3.关卡问题:

游戏中有很多关卡,每个关卡的星星个数,位置都是不一样的,而且线段的额关节个数也是不一样的。

比如:

1小时开发《占星起源》(下)_第5张图片
1小时开发《占星起源》(下)_第6张图片

因为这里我只设置了5小关。所以不打算用读配置文件的方法创建关卡,如果你有兴趣也可以自己试着去尝试,比如读XML,TXT ,jison文件,都是可以的,下次如果有机会,也会详细的介绍这种方法。

1小时开发《占星起源》(下)_第7张图片
1小时开发《占星起源》(下)_第8张图片

因为这里比较简单,所以只是用了简单判断。

对了,有没有发现,现在的星星不是用小圆圈了,而是真的该用星星了(谢谢一位老哥发了一张图过来。)

而且当线段没有连接星星是星星是暗的,连接后星星是亮的,这里说一下,其实也没有什么技术含量,这里并没有使用shader。

看一张图:

他们是这样一个关系:

1小时开发《占星起源》(下)_第9张图片

在游戏开始的时候,暗层就显示暗的星星,亮层则是为空的,接触的时候,就调用它的接口,让它亮起来,再次移走之后就把亮层移除。

代码地址:

http://pan.baidu.com/share/link?shareid=1814932273&uk=1435100278

(感觉这篇质量很不好,以后要继续加油)

拜~

你可能感兴趣的:(1小时开发《占星起源》(下))