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


  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5271725.html
Copyright © 2011-2022 走看看