OS X下開發!ios系統貪食蛇!——from cocos2d-x 3.0

   前幾天用cocos2d-x寫了個貪食蛇!這次是完全在osx下開發的。主要的思路是這樣的我建立了一個Snake類,其中有兩個構造函數一個是用於存放蛇身體sprite的圖片和Snake的X座標和Y座標。另外一個是用於存放蛇頭的sprite圖片和Snake的X座標和Y座標dir方向,還有snake的生命。再在helloword類中建立一個容器 vector<Snake *> snake; 在helloword中的init中先建立蛇頭和兩節蛇身體並且加入到snake中    

    Snake *_head_1= new Snake(500.0, 300.0, 2,true);

    this->addChild(_head_1->_snake_body_sprite,3);

    _head_1->_snake_body_sprite->setRotation(-90);

     snake.push_back(_head_1);


    //設置蛇身體圖片 通過對象來創建

    for(int a=1; a<3;a++)

    {

        Snake *sna2 =new Snake(500+a*20,300);

        this->addChild(sna2->_snake_body_sprite,2);

        snake.push_back(sna2);

     }

並且在init中註冊觸屏事件。

接下來我把屏幕分爲了四塊 並且當點擊響應塊的時候讓蛇頭進行旋轉 改變dir的值     (其實是可以改爲用手勢的)

bool HelloWorld::onTouchBegan(Touch* touch,Event *event){

    if(bar)

  {

    Point touchpoint = touch->getLocation();                                //獲取點擊之後的點的座標

    printf("touchpoint.x = %f, touchpoint.y =%f",touchpoint.x,touchpoint.y);

    float touch_x =touchpoint.x;

    float touch_y =touchpoint.y;

    

    if(touch_x >= 0 && touch_x < 350){                  //點擊了左側的區域  設置蛇頭方向爲2  上0 下1 左 2,右 3

        if(sn_head->_snake_dir != 3){

        switch (sn_head->_snake_dir) {

            case 0:sn_head->_snake_body_sprite->setRotation(-90);break;

            case 1:sn_head->_snake_body_sprite->setRotation(-90);break;

            case 2:break;

            case 3:break;

                default:break;

        }

        sn_head->_snake_dir = 2;                       //左

        }

    }

    else if (touch_x >= 350 && touch_x < 785 && touch_y< 320){

        if(sn_head->_snake_dir != 0){

        switch (sn_head->_snake_dir) {

            case 0: break;

            case 1: break;

            case 2:sn_head->_snake_body_sprite->setRotation(180);break;

            case 3:sn_head->_snake_body_sprite->setRotation(180);break;

            default:break;

        }

        sn_head->_snake_dir = 1;

        }

    }

    else if(touch_x >= 350 &&  touch_x < 785 && touch_y >=320){

        if(sn_head->_snake_dir != 1){

        switch (sn_head->_snake_dir) {

            case 0: break;

            case 1: break;

            case 2:sn_head->_snake_body_sprite->setRotation(0); //sn_head->_snake_body_sprite->setPosition(Point(sn_head->_snake_x,sn_head->_snake_y+=20));break;             //它是相對於原始圖片旋轉的不是旋轉過的圖片旋轉地

            case 3:sn_head->_snake_body_sprite->setRotation(0);break;

            default:break;

        }

        sn_head->_snake_dir = 0;

        }


    }

    else if(touch_x >=785){

        if(sn_head->_snake_dir != 2){

        switch (sn_head->_snake_dir) {

            case 0:sn_head->_snake_body_sprite->setRotation(90);break;

            case 1:sn_head->_snake_body_sprite->setRotation(90);break;

            case 2: break;

            case 3: break;

            default:break;

        }

        sn_head->_snake_dir =3;

        }

    }

  }

}

讓蛇移動起來。 這裏用了一個二維數組用來存儲snake的所有座標信息。

然後當蛇頭移動以後。遍歷容器中的所有對象除了蛇頭,把二維數組中的x,y值賦給遍歷的對象的X,Y。

如圖 mac不知道繪圖工具在哪自己用PS隨便畫的:

void HelloWorld::body(float bo) {


    int length_snake = (int)snake.size();

    

    int _a_2array[length_snake][2];

    for(int i=0;i<snake.size();i++)

    {

        Snake *snake_array;

        snake_array = snake.at(i);

        _a_2array[i][0] = snake_array->_snake_x;

        _a_2array[i][1] = snake_array->_snake_y;


    }

   

    

    if(sn_head->life)

    {


              switch (sn_head->_snake_dir) {

                      

                    case 0:sn_head->_snake_y+=22;

                       break;

                    case 1:sn_head->_snake_y-=22;

                       break;

                    case 2:sn_head->_snake_x-=22;

                        break;

                    case 3:sn_head->_snake_x+=22;

                       break;

            }

        sn_head->_snake_body_sprite->setPosition(Point(sn_head->_snake_x,sn_head->_snake_y));

        if(length_snake >1){

            for(int k =1; k <snake.size();k++){

                Snake *snake_body;

                snake_body = snake.at(k);

                snake_body->_snake_x= _a_2array[k-1][0];

                snake_body->_snake_y= _a_2array[k-1][1];

            

                snake_body->_snake_body_sprite->setPosition(Point(snake_body->_snake_x,snake_body->_snake_y));

             }

        }

    }

}


接下來就是當蛇頭吃到東西之後身體變長:這個就是讓蛇頭和食物發生碰撞之後就在蛇尾部再生成一個對象並且把它加入到容器中。這裏說一下我開始是用boundingbox但是那是按照邊框進行碰撞檢測的所以不準確。我前一個flappybird遊戲就是因爲這個原因導致有時候死亡有點奇怪。所以我自己寫了碰撞檢測方法其實這個還簡單我坦克大戰遊戲中寫過但那是矩形之間的碰撞檢測。這個是圓形之間的碰撞檢測,也還是簡單根據勾股定理也能很快的寫出來:

float HelloWorld::impact_round(float x1,float y1,float x2,float y2)

{

    float xie = sqrt(pow(abs(x1-x2),2)+pow(abs(y1-y2),2));

    return xie;


}





對了昨晚上把之前做過的flappybird移植到了IOS上 但是沒有做屏幕適配就發張圖上來吧:

主要就是這些  還是按照慣例我會把程序上傳到  CSDN上和百度網盤上 這次我以爲還沒有在MAC上打包 所以就會發源代碼出來了!遊戲試玩的畫我看有時間了再移植到 Windows 下和發佈ios版的。這次和以往不一樣只有源代碼哦!

百度網盤下載地址: http://pan.baidu.com/s/1i3sVJvv


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章