cocos2d-x 3.0游戲開發xcode5帥印博客教學 003.[HoldTail]游戲世界以及背景畫面


cocos2d-x 3.0游戲開發xcode5帥印博客教學 003.[HoldTail]游戲世界以及背景畫面

寫給大家的前言,在學習cocos2d-x的時候自己走了很多的彎路,也遇到了很多很多問題,不管是簡單的還是困難的現在都慢慢的一步一步克服了,其實用cocos2d-x做游戲特別的簡單,大家不要被是做游戲嚇到了,支持我把游戲開源的原因是因為  eoe上海  的大家的支持。加油,加油,要說明一下的是,寫得不好還請大家多多包含哦。相信你們跟着我得博客,一步一步做肯定會成功的。


昨天做了游戲的主場景的開始畫面,今天要做的是整個游戲的世界和游戲的滾動的背景

注意由於是在模擬器上門進行所以幀不高,但是如果是在真機上,則是60幀滿幀運行


效果圖


首先建立背景地圖類

 

//
//  SWGameMap.h
//  Holdtail
//
//  Created by 帥 印 on 13-12-02.
//
//

#ifndef __Holdtail__SWGameMap__
#define __Holdtail__SWGameMap__

#include <iostream>
#include "cocos2d.h"

using namespace cocos2d;

//定義圖片的枚舉的類型
typedef enum{
    tag_Img01_01,
    tag_Img01_02,
    tag_Img02_01,
    tag_Img02_02,
    tag_Img03_01,
    tag_Img03_02,
    tag_Img04_01,
    tag_Img04_02,
    tag_Img05_01,
    tag_Img05_02,
    tag_Img06_01,
    tag_Img06_02
}tagMap;

class SWGameMap:public cocos2d::Layer{
public:
    static SWGameMap* createMap (const char* fileName01,
                                 const char* fileName02,
                                 const char* fileName03,
                                 const char* fileName04,
                                 const char* fileName05,
                                 const char* fileName06);
    
    //提供一個方法修改所有圖片的高度,使之隨着背景移動
    static void updateLayerHeight(float layh);
    
    //提供一個公共靜態的方法獲取地圖對象
    static SWGameMap *sharedMap();
    //獲取地圖現在的高度
    float getMapHeight();
    
    //地圖下移   每次下移的高度
    void downMap(float time);
    //地圖上移   每次上移的高度
    void upMap(float time);
    
private:
    void mapInit(const char* fileName01,
                 const char* fileName02,
                 const char* fileName03,
                 const char* fileName04,
                 const char* fileName05,
                 const char* fileName06);
    
    void update(float time);
    virtual void onExit();
    
};



#endif /* defined(__Holdtail__SWGameMap__) */


 

 

//
//  SWGameMap.cpp
//  Holdtail
//
//  Created by 帥 印 on 13-12-02.
//
//

#include "SWGameMap.h"
#include "SWGameWorld.h"
using namespace cocos2d;

static float layHeight;
static SWGameMap *sm;

SWGameMap *SWGameMap::sharedMap(){
    if(sm != NULL){
        return sm;
    }
    return  NULL;
}


//創建一個地圖對象
SWGameMap *SWGameMap::createMap(const char* fileName01,
                                const char* fileName02,
                                const char* fileName03,
                                const char* fileName04,
                                const char* fileName05,
                                const char* fileName06){
    SWGameMap *map = new SWGameMap();
    if(map && map->create()){
        layHeight = 210;
        
        map->autorelease();
        map->mapInit(fileName01,
                     fileName02,
                     fileName03,
                     fileName04,
                     fileName05,
                     fileName06);
        return map;
    }
    
    CC_SAFE_DELETE(map);
    return NULL;
}

float SWGameMap::getMapHeight(){
    return layHeight;
}

//提供一個方法修改所有圖片的高度,使之隨着背景移動
void SWGameMap::updateLayerHeight(float layh){
    if(0 == layh){
        //地圖的上下移動
        sm->unschedule(schedule_selector(SWGameMap::upMap));
        sm->schedule(schedule_selector(SWGameMap::downMap), 0.005f);
    }else if(1 == layh){
        //地圖的上下移動
        sm->unschedule(schedule_selector(SWGameMap::downMap));
        sm->schedule(schedule_selector(SWGameMap::upMap), 0.005f);
    }
}

void SWGameMap::downMap(float time){
    float layh = -2;
    //控制地圖的最底高度
    if (layHeight >= -500) {
        
        layHeight = layHeight+layh;
        
        //Sprite *sp0101 = (Sprite *)sm->getChildByTag(tag_Img01_01);
        //sp0101->setPosition(sp0101->getPosition(), ccp(0, layh)));
        //Sprite *sp0102 = (Sprite *)sm->getChildByTag(tag_Img01_02);
        //sp0102->setPosition(sp0102->getPosition(), ccp(0, layh)));
        
        Sprite *sp0201 = (Sprite *)sm->getChildByTag(tag_Img02_01);
        sp0201->setPosition(sp0201->getPosition() + Point(0, layh));
        
        Sprite *sp0202 = (Sprite *)sm->getChildByTag(tag_Img02_02);
        sp0202->setPosition(sp0202->getPosition() + Point(0, layh));
        
        Sprite *sp0301 = (Sprite *)sm->getChildByTag(tag_Img03_01);
        sp0301->setPosition(sp0301->getPosition() + Point(0, layh));
        Sprite *sp0302 = (Sprite *)sm->getChildByTag(tag_Img03_02);
        sp0302->setPosition(sp0302->getPosition() + Point(0, layh));
        
        Sprite *sp0401 = (Sprite *)sm->getChildByTag(tag_Img04_01);
        sp0401->setPosition(sp0401->getPosition() + Point(0, layh));
        Sprite *sp0402 = (Sprite *)sm->getChildByTag(tag_Img04_02);
        sp0402->setPosition(sp0402->getPosition() + Point(0, layh));
        
        Sprite *sp0501 = (Sprite *)sm->getChildByTag(tag_Img05_01);
        sp0501->setPosition(sp0501->getPosition() + Point(0, layh));
        Sprite *sp0502 = (Sprite *)sm->getChildByTag(tag_Img05_02);
        sp0502->setPosition(sp0502->getPosition() + Point(0, layh));
        
        Sprite *sp0601 = (Sprite *)sm->getChildByTag(tag_Img06_01);
        sp0601->setPosition(sp0601->getPosition() + Point(0, layh));
        Sprite *sp0602 = (Sprite *)sm->getChildByTag(tag_Img06_02);
        sp0602->setPosition(sp0602->getPosition() + Point(0, layh));
    }else{
        //自動停止
        sm->unschedule(schedule_selector(SWGameMap::downMap));
    }
}


void SWGameMap::upMap(float time){
    float layh = +2;
    //控制人物的最高高度
    if (layHeight < 210) {
        
        layHeight = layHeight+layh;
        
        //Sprite *sp0101 = (Sprite *)sm->getChildByTag(tag_Img01_01);
        //sp0101->setPosition(sp0101->getPosition(), ccp(0, layh)));
        //Sprite *sp0102 = (Sprite *)sm->getChildByTag(tag_Img01_02);
        //sp0102->setPosition(sp0102->getPosition(), ccp(0, layh)));
        
        Sprite *sp0201 = (Sprite *)sm->getChildByTag(tag_Img02_01);
        sp0201->setPosition(sp0201->getPosition() + Point(0, layh));
        Sprite *sp0202 = (Sprite *)sm->getChildByTag(tag_Img02_02);
        sp0202->setPosition(sp0202->getPosition() + Point(0, layh));
        
        Sprite *sp0301 = (Sprite *)sm->getChildByTag(tag_Img03_01);
        sp0301->setPosition(sp0301->getPosition() + Point(0, layh));
        Sprite *sp0302 = (Sprite *)sm->getChildByTag(tag_Img03_02);
        sp0302->setPosition(sp0302->getPosition() + Point(0, layh));
        
        Sprite *sp0401 = (Sprite *)sm->getChildByTag(tag_Img04_01);
        sp0401->setPosition(sp0401->getPosition() + Point(0, layh));
        Sprite *sp0402 = (Sprite *)sm->getChildByTag(tag_Img04_02);
        sp0402->setPosition(sp0402->getPosition() + Point(0, layh));
        
        Sprite *sp0501 = (Sprite *)sm->getChildByTag(tag_Img05_01);
        sp0501->setPosition(sp0501->getPosition() + Point(0, layh));
        Sprite *sp0502 = (Sprite *)sm->getChildByTag(tag_Img05_02);
        sp0502->setPosition(sp0502->getPosition() + Point(0, layh));
        
        Sprite *sp0601 = (Sprite *)sm->getChildByTag(tag_Img06_01);
        sp0601->setPosition(sp0601->getPosition() + Point(0, layh));
        Sprite *sp0602 = (Sprite *)sm->getChildByTag(tag_Img06_02);
        sp0602->setPosition(sp0602->getPosition() + Point(0, layh));
    }else{
        //自動停止
        sm->unschedule(schedule_selector(SWGameMap::upMap));
    }
}

void SWGameMap::mapInit(const char* fileName01,
                        const char* fileName02,
                        const char* fileName03,
                        const char* fileName04,
                        const char* fileName05,
                        const char* fileName06){
    
    sm = this;
    
    //CCSize size = CCDirector::sharedDirector()->getWinSize();
    
    //創建第一一個地圖背景
    Sprite *turnImg0101 = Sprite::create(fileName01);
    turnImg0101->setPosition(Point(turnImg0101->getContentSize().width*0.5, 250));
    this->addChild(turnImg0101,0,tag_Img01_01);
    //創建第一二個地圖背景
    Sprite *turnImg0102 = Sprite::create(fileName01);
    turnImg0102->setPosition(Point(turnImg0102->getContentSize().width*1.5, 250));
    this->addChild(turnImg0102,0,tag_Img01_02);
    
    //創建第二一個地圖背景
    Sprite *turnImg0201 = Sprite::create(fileName02);
    turnImg0201->setPosition(Point(turnImg0201->getContentSize().width*0.5, layHeight+700));
    this->addChild(turnImg0201,0,tag_Img02_01);
    //創建第二二個地圖背景
    Sprite *turnImg0202 = Sprite::create(fileName02);
    turnImg0202->setPosition(Point(turnImg0202->getContentSize().width*1.5, layHeight+700));
    this->addChild(turnImg0202,0,tag_Img02_02);
    
    //創建第三一個地圖背景
    Sprite *turnImg0301 = Sprite::create(fileName03);
    turnImg0301->setPosition(Point(turnImg0301->getContentSize().width*0.5, layHeight+500));
    this->addChild(turnImg0301,0,tag_Img03_01);
    //創建第三二個地圖背景
    Sprite *turnImg0302 = Sprite::create(fileName03);
    turnImg0302->setPosition(Point(turnImg0302->getContentSize().width*1.5, layHeight+500));
    this->addChild(turnImg0302,0,tag_Img03_02);
    
    //創建第四一個地圖背景
    Sprite *turnImg0401 = Sprite::create(fileName04);
    turnImg0401->setPosition(Point(turnImg0401->getContentSize().width*0.5, layHeight+300));
    this->addChild(turnImg0401,0,tag_Img04_01);
    //創建第四二個地圖背景
    Sprite *turnImg0402 = Sprite::create(fileName04);
    turnImg0402->setPosition(Point(turnImg0402->getContentSize().width*1.5, layHeight+300));
    this->addChild(turnImg0402,0,tag_Img04_02);
    
    //創建第五一個地圖背景
    Sprite *turnImg0501 = Sprite::create(fileName05);
    turnImg0501->setPosition(Point(turnImg0501->getContentSize().width*0.5, layHeight+100));
    this->addChild(turnImg0501,0,tag_Img05_01);
    //創建第五二個地圖背景
    Sprite *turnImg0502 = Sprite::create(fileName05);
    turnImg0502->setPosition(Point(turnImg0502->getContentSize().width*1.5, layHeight+100));
    this->addChild(turnImg0502,0,tag_Img05_02);
    
    //創建第六一個地圖背景
    Sprite *turnImg0601 = Sprite::create(fileName06);
    turnImg0601->setPosition(Point(turnImg0601->getContentSize().width*0.5, layHeight));
    this->addChild(turnImg0601,0,tag_Img06_01);
    //創建第六二個地圖背景
    Sprite *turnImg0602 = Sprite::create(fileName06);
    turnImg0602->setPosition(Point(turnImg0602->getContentSize().width*1.5, layHeight));
    this->addChild(turnImg0602,0,tag_Img06_02);
    
    //更新
    this->scheduleUpdate();
}

void SWGameMap::update(float time){
    //CCSize size = CCDirector::sharedDirector()->getWinSize();
    
    //第一張圖片
    Sprite *sp0101 = (Sprite *)this->getChildByTag(tag_Img01_01);
    if(sp0101->getPositionX() <= -sp0101->getContentSize().width*0.5){
        sp0101->setPosition(Point(sp0101->getContentSize().width*1.5f-2, 250));
    }else{
        sp0101->setPosition(sp0101->getPosition() + Point(-2, 0));
    }
    Sprite *sp0102 = (Sprite *)this->getChildByTag(tag_Img01_02);
    if(sp0102->getPositionX() <= -sp0102->getContentSize().width*0.5){
        sp0102->setPosition(Point(sp0102->getContentSize().width*1.5f-2, 250));
    }else{
        sp0102->setPosition(sp0102->getPosition() + Point(-2, 0));
    }
    
    
    //第二張圖片
    Sprite *sp0201 = (Sprite *)this->getChildByTag(tag_Img02_01);
    if(sp0201->getPositionX() <= -sp0201->getContentSize().width*0.5){
        sp0201->setPosition(Point(sp0201->getContentSize().width*1.5f-3, layHeight+700));
    }else{
        sp0201->setPosition(sp0201->getPosition() + Point(-1.5, 0));
    }
    Sprite *sp0202 = (Sprite *)this->getChildByTag(tag_Img02_02);
    if(sp0202->getPositionX() <= -sp0202->getContentSize().width*0.5){
        sp0202->setPosition(Point(sp0202->getContentSize().width*1.5f-3, layHeight+700));
    }else{
        sp0202->setPosition(sp0202->getPosition() + Point(-1.5, 0));
    }
    
    //第三張圖片
    Sprite *sp0301 = (Sprite *)this->getChildByTag(tag_Img03_01);
    if(sp0301->getPositionX() <= -sp0301->getContentSize().width*0.5){
        sp0301->setPosition(Point(sp0301->getContentSize().width*1.5f-2, layHeight+500));
    }else{
        sp0301->setPosition(sp0301->getPosition() + Point(-2, 0));
    }
    Sprite *sp0302 = (Sprite *)this->getChildByTag(tag_Img03_02);
    if(sp0302->getPositionX() <= -sp0302->getContentSize().width*0.5){
        sp0302->setPosition(Point(sp0302->getContentSize().width*1.5f-2, layHeight+500));
    }else{
        sp0302->setPosition(sp0302->getPosition() + Point(-2, 0));
    }
    
    //第四張圖片
    Sprite *sp0401 = (Sprite *)this->getChildByTag(tag_Img04_01);
    if(sp0401->getPositionX() <= -sp0401->getContentSize().width*0.5){
        sp0401->setPosition(Point(sp0401->getContentSize().width*1.5f-2.5, layHeight+300));
    }else{
        sp0401->setPosition(sp0401->getPosition() + Point(-2.5, 0));
    }
    Sprite *sp0402 = (Sprite *)this->getChildByTag(tag_Img04_02);
    if(sp0402->getPositionX() <= -sp0402->getContentSize().width*0.5){
        sp0402->setPosition(Point(sp0402->getContentSize().width*1.5f-2.5, layHeight+300));
    }else{
        sp0402->setPosition(sp0402->getPosition() + Point(-2.5, 0));
    }
    
    //第五張圖片
    Sprite *sp0501 = (Sprite *)this->getChildByTag(tag_Img05_01);
    if(sp0501->getPositionX() <= -sp0501->getContentSize().width*0.5){
        sp0501->setPosition(Point(sp0501->getContentSize().width*1.5f-3, layHeight+100));
    }else{
        sp0501->setPosition(sp0501->getPosition() + Point(-3, 0));
    }
    Sprite *sp0502 = (Sprite *)this->getChildByTag(tag_Img05_02);
    if(sp0502->getPositionX() <= -sp0502->getContentSize().width*0.5){
        sp0502->setPosition(Point(sp0502->getContentSize().width*1.5f-3, layHeight+100));
    }else{
        sp0502->setPosition(sp0502->getPosition() + Point(-3, 0));
    }
    
    //第六張圖片
    Sprite *sp0601 = (Sprite *)this->getChildByTag(tag_Img06_01);
    if(sp0601->getPositionX() <= -sp0601->getContentSize().width*0.5){
        sp0601->setPosition(Point(sp0601->getContentSize().width*1.5f-4, layHeight));
    }else{
        sp0601->setPosition(sp0601->getPosition() + Point(-4, 0));
    }
    Sprite *sp0602 = (Sprite *)this->getChildByTag(tag_Img06_02);
    if(sp0602->getPositionX() <= -sp0602->getContentSize().width*0.5){
        sp0602->setPosition(Point(sp0602->getContentSize().width*1.5f-4, layHeight));
    }else{
        sp0602->setPosition(sp0602->getPosition() + Point(-4, 0));
    }
}

//退出
void SWGameMap::onExit(){
    this->unscheduleUpdate();
    CCLayer::onExit();
}


 


地圖類建立完成之后,接下來建立游戲世界類

 

//
//  SWGameWorld.h
//  Holdtail
//
//  Created by 帥 印 on 13-12-02.
//
//

#ifndef __Holdtail__SWGameWorld__
#define __Holdtail__SWGameWorld__

#include <iostream>
#include "cocos2d.h"

//定義屬性
typedef enum {
    tag_player
}tagWorld;

class SWGameWorld:public cocos2d::Layer{
public:
    static cocos2d::Scene *scene();
    static SWGameWorld *sharedWorld();
private:
    virtual bool init();
    CREATE_FUNC(SWGameWorld);
    
};
#endif /* defined(__Holdtail__SWGameWorld__) */


 

 

//
//  SWGameWorld.cpp
//  Holdtail
//
//  Created by 帥 印 on 13-12-02.
//
//

#include "SWGameWorld.h"
#include "cocos2d.h"
#include "SimpleAudioEngine.h"
#include "SWGameMap.h"

using namespace cocos2d;
using namespace CocosDenshion;

//聲明靜態變量
static SWGameWorld *SWGW;

SWGameWorld *SWGameWorld::sharedWorld(){
    if(SWGW != NULL){
        return SWGW;
    }
    return  NULL;
}


Scene *SWGameWorld::scene(){
    Scene *scene = Scene::create();
    SWGameWorld *layer = SWGameWorld::create();
    scene->addChild(layer);
    return scene;
}

//創建場景
bool SWGameWorld::init(){
    if( !Layer::init()){
        return false;
    }
    SWGW = this;
    
    //地圖
    SWGameMap *map = SWGameMap::createMap("cloudbg.png","cloud04.png","cloud03.png","cloud02.png","cloud01.png","treesbg.png");
    addChild(map);
    
    return true;
}


 


當這兩個類都建立完成后,就可以使用了,點擊開始游戲按鈕,切換到世界類,背景就可以滾動咯

 

//各種按鈕點擊的方法實現
void SWMenu::PlayPressed(Object* pSender){
    //實現
    CCDirector::getInstance()->replaceScene(CCTransitionFade::create(0.5, SWGameWorld::scene()));
}


 

今天的這個階段的項目打包下載-->飛機直達

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM