cocos2d 高仿doodle jump 无源码

网友投稿 1013 2022-08-28

cocos2d 高仿doodle jump 无源码

cocos2d 高仿doodle jump 无源码

1. 游戏视频

2.向上跳的位移实现

正常情况下,不使用任何的东西,主角在板子上跳,会跳出最上面的屏幕就看不到了!没有视频中主角一直在屏幕中间的感觉。那么如何实现这样的效果呢?非常简单。

这里不得不吐槽下cocos2d, 学过Opengl 或者 DirectX的,都应该知道有Camera这么一个东西存在,2D游戏只是选择了平行投射(parallel projection)参考这篇文章​​《DirectX Camera》​​ .但3.2 之前的Camera根本不能用,3.3才加入了Camera. 如果用Camera这里会非常容易实现,也跟现实比较吻合。

1.如果使用Camera,所有板的PositionY 就定死的,越高的板,它的PositionY 就越大,主角往上跳时,主角的PositionY也不断变大。有一个Camera,它的位置跟着主角来移动就可以了。就这么简单。

2.不使用Camera,我用的是3.2的cocos2d,所以不好使用Camera,采用了移动整个Layer的实现。主角会跳出最上面的屏幕的,怎么办的?把整个Layer往下移动就可以了。

float minPositionY = 0;void update(float dt){ //follow the hero float nextPositionY = VISIBLE_HEIGHT / 2 - hero->getPositionY(); if(nextPositionY < minPositionY){ minPositionY = nextPositionY; this->setPositionY(minPositionY); }}

看起来比较简单,如果是主角掉下屏幕最底下,有一个坠落感觉,逻辑上又比较麻烦了。还是用Camera的比较好。

3.板子生成的逻辑

最块又比较麻烦了。首先是板子连续生成的逻辑,不可能一次生成几十个板子,反正屏幕之上和屏幕之下用户都是看不到的,也就是说10几个板子,整个游戏就够用了。到后面,10个都不用。正常的update是一秒中执行60次。我们需要整一个慢一点的定时器,这样不会太影响性能, schedule ( schedule_selector ( GameObjectsLayer :: createAndRemoveObjects ), 0.064 );,专门在里面创建板和移除不需要的板子。

deque _boardObjects;void generateSomeBoards(const int& lastPositionX,int startPosition,const int& count);void createAndRemoveObjects(float dt){ if(_pause == true){ return; } if(_boardObjects.size() <= 12){//generate some boards if we only have few boards JumpBoard *lastBoard = _boardObjects.back(); generateSomeBoards(lastBoard->getPositionX(), lastBoard->getPositionY() + getGeneratorHigh(),5); } //remove unused boards JumpBoard* firstBoard = _boardObjects.front(); if(hero->getPositionY() - firstBoard->getPositionY() > 600){ firstBoard->removeFromParent(); _boardObjects.pop_front(); }}

再简单用语言来说下上面中没有给出详细代码的generateSomeBoards。

游戏要考虑的东西很多:

1.刚开始的时候两个板之间的距离要短些,看起来会密些,这样游戏会容易上手些,两个板之间的距离会随着主角的变高而增大。

2.刚开始的时候生成板的类型要简单些,我这里只有最两种类型,到后面才会出现各种类型的板。

我现在越来越意识到,如果一个游戏的主要玩法能让不懂程序逻辑的策划很容易修改的话,这个游戏写的就还不错。这里游戏的玩法就是如何控制生成板子。我必须承认这块做的还不好。

typedef enum{ kNormalBoard, //0 kCloudBoard, //1 kMoveBoard, //2 kMoveLttleBoard, //3 kSpringBoard //4}JumpBoardType;int level1[] = {0,0,0,0,0,0,0,0,0,0,1,1,1};int level2[] = {0,0,0,0,0,0,0,0,0,0,1,1,2,3,4};

这里简单有两个数组,后面会用它们初始化两个vector,然后用random_shuffle,进行洗牌。会根据当前的hero高度来选择不同的数组。当index移到最后一个时候,就归0,再次洗牌。

int getBoardTypeDueToFloorNum(){ int floorCount = getFloorCount(); int result = 0; if(floorCount <= 2){ if(_levelIndex >= _level1.size()){ _levelIndex = 0; random_shuffle(_level1.begin(), _level1.end()); } result = _level1[_levelIndex]; ++_levelIndex; return result; }else if(floorCount > 2 && floorCount <= 10){ if(_levelIndex >= _level2.size()){ _levelIndex = 0; random_shuffle(_level2.begin(), _level2.end()); } result = _level2[_levelIndex]; ++_levelIndex; return result; }else{ //无限模式 }}

当然后面的无限模式更加复杂点,我搞了5种不同类型的数组进行洗牌。这里不再赘述。

4.道具和怪物生成位置

道具和怪物生成位置我就简单处理了,每隔几个屏幕高度就放置一个。

//typedef enum{// kHelicopterItem, //0// kFlyItem, //1// kShortItem, //2// kLongItem, //3// kDefenceBall //4//}EatItemType;int allEatItemType[] = {4,4,4,0,0,1};

为了让不同道具出现概率不一样,又用了跟上面板子类似的逻辑。怪物这里就2种,就50%概率会生成不同怪物。Doodle jump这块做的变态的好,一般怪物出现之前会有杀死怪物或者躲避怪物的道具出现。

5.主角光环和抛物线掉落

主角光环的椭圆移动,可以参考这篇文章​​《​​​ ​​cocos2d 绕椭圆移动》​​。

还有一个是使用过后道具的掉落轨迹。这块第一次玩Doodle jump就给我带来了惊喜,竹蜻蜓或者火箭,时间到后,完美的扔掉,处理的非常自然和有趣。

实现起来跟上面的椭圆移动类似。就是数学用的抛物线,只是这个是开口向下的。只用到了左边红色的部分。

我用的公式是x = t * -400,  y = x * x *  - 0.02 ( x  = [0, -400] )。update中,t = [0, 1],代入这个公式就可以了。

6. 其他

其他像道具生成的位置比较讲究,最后添加到板子中去,这样板子移动,就会跟着移动了,会自然点。

无论是主角碰上怪物或者主角的嘴巴碰上怪物,怪物都会旋转地往那个方向飞出去,这个效果非常好,可以简单地计算下两个点的角度,给怪物一个速度属性,在update的每一帧中进行移动。

主角的嘴巴飞出去还会飞回来,飞回来的时候,因为主角的位置一直变化的,所以也要在update的每一帧中,不断改变位置,离主角越来越近,像飞机的跟踪导弹。这里就不再赘述。

感觉Cocos2d-x 3.2这块重力感应Accelerometer控制的似乎有问题,在这个游戏中偶尔会失控,我还不知道发生的原因和规律,非常头痛。还有游戏的速度,看起来都是60帧,但速度偶尔会有区别。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:很少人真正了解 \n 和 \r 有什么区别!(真正了解我的人没几个)
下一篇:python 垂直投影分割
相关文章

 发表评论

暂时没有评论,来抢沙发吧~