zoukankan      html  css  js  c++  java
  • cocos2d 高仿doodle jump 无源代码

    1. 游戏视频



    主角眼熟吗?没错,上次跑酷游戏中的“30”来Jump了,有三种道具。主角光环,竹蜻蜓。翅膀; 有两种怪物,螃蟹和鸟; 有5种板子。点击屏幕,30会把它的嘴巴3给发射出去。能够攻击怪物。

    上次的跑酷參考cocos2d 简单高仿天天跑酷游戏》 。苹果已经审核通过...但做的很差,兴许有时间再更新。后面考虑会出很多其它的该主角游戏。

     



    事实上蛮讨厌"高仿"这两个字的,争取下一款游戏有很多其它原创部分。


    2.向上跳的位移实现




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

    这里不得不吐槽下cocos2d, 学过Opengl 或者 DirectX的,都应该知道有Camera这么一个东西存在,2D游戏仅仅是选择了平行投射(parallel projection)參考这篇文章《DirectX Camera》 .但3.2 之前的Camera根本不能用,3.3才加入了Camera. 假设用Camera这里会很easy实现,也跟现实比較吻合。
    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<JumpBoard*> _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.刚開始的时候两个板之间的距离要短些,看起来会密些,这样游戏会easy上手些,两个板之间的距离会随着主角的变高而增大。
    2.刚開始的时候生成板的类型要简单些,我这里仅仅有最两种类型。到后面才会出现各种类型的板。
    我如今越来越意识到,假设一个游戏的主要玩法能让不懂程序逻辑的策划很easy改动的话。这个游戏写的就还不错。

    这里游戏的玩法就是怎样控制生成板子。我必须承认这块做的还不好。


    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<int>,然后用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帧,但速度偶尔会有差别。
    这些高仿的游戏我想不太可能有好的市场。仅仅能通过它们积累经验来做真正原创游戏。只是做这些小游戏比那些网络游戏有趣些。

    有真正游戏的感觉。



    第一个是IPhone 下载地址,第二个是android的。点击跳转链接,或者扫描二维码。

    ios fly30 android fly30


    http://www.waitingfy.com/archives/1358


  • 相关阅读:
    C++:Ubuntu 中GCC和G++的安装
    pycharm所有包
    机器学习--推荐引擎
    均值漂移法 + 轮廓系数+DBSCAN算法
    聚类模型
    事件预测 -- 解决分类问题
    网格搜索
    置信概率
    样本类别均衡化
    爬虫用到的知识点
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5271725.html
Copyright © 2011-2022 走看看