Cocos2d-x for WindowsPhone:開發一個打地鼠游戲(上)


本篇主要介紹如何使用cocos2d-x for xna開發一個打地鼠的游戲,雖然cocos2d的入門教程也有打地鼠,但是本篇着重簡單的學習實現,因為涉及了幀動畫,所以使用了另外的地鼠圖片資源,盡可能的在單一項目內學習一個知識點,不在一些繁瑣的繞人地方浪費時間,所以你將看到非常直接的代碼實現示例,本開發實例着重使用了如下cocos2d-x類:CCSprite、CCMenuItemSprite、CCScene

 

  建立工程

首先現建立一個工程,從工程模板里可以找到“cocos2d-x”的分類,輸入名字點擊確認,我們在這里叫:Hit_Mole。

然后引用一下cocos2d-x for xna的4個dll:(這些dll來自於cocos2d-x for xna的編譯結果,詳細請參看之前一篇)

cocos2d-xna.dll : cocos2d-x for xna主類庫

cocos2d.Framework.dll : 內容管線使用的CCContent類,它會和Importers配合讀取項目的plist文件

ICSharpCode.SharpZipLib.dll

zlib.net.dll


注意Hit_MoleContent工程要引用內容管線dll:

cocos2d.Content.Pipeline.Importers.dll

編譯運行一下確認無錯誤。

 

  建立基本游戲場景

第一件事就是要准備好一套用於做此游戲的圖片,並將他們添加到你的Hit_MoleContent工程中

然后在你的工程中添加一個類,在這里多說一下,可以直接在模板中修改Helloworld類,不過模板生成的有點復雜,不利於說明,我為了簡單明了直接新建一個類作為開始,這個類名暫叫:Scene1

類的代碼如下:

 

using cocos2d;
namespace Hit_Mole
{
     public  class Scene1 : CCScene
    {
         public Scene1()
        {
             // 初始化
            initialize();
        }
         public  bool initialize()
        {
             // 從Hit_MoleContent里面讀取scene.jpg的圖像成為游戲當中的一個精靈
            CCSprite background = CCSprite.spriteWithFile( " scene ");
             // 將錨點設置到(0,0)處,單張圖片的讀取默認錨點在(0.5f,0.5f)處
            background.anchorPoint =  new CCPoint( 00);
             // 將背景添加到場景中
             this.addChild(background);
             return  base.init();
        }
    }
}

 

然后打開AppDelegate.cs找到applicationDidFinishLaunching()下的導演顯示場景代碼

QQ截圖20120605191805

你會發現模板自動加了一個Helloworld(雖然名字不叫這個)的場景,而這個場景的代碼在HelloWorldScene.cs之中,我們不需要它,直接換成咱們場景

CCScene pScene = new Scene1();

運行一下看看效果:

QQ截圖20120605192511

一個基本的游戲場景出現了。

 

  制造老鼠

鬼頭的老鼠會按照一定的規則露頭然后回去,在這里我們先實現被點擊這個效果,在另外一篇里面着重看動畫部分,所以我們先制造一個不是很聰明的老鼠,它只是傻傻露着頭等敲打。

在Cocos2d-x for xna里面有各種方式實現點擊,其中CCMenuItem是用來做UI界面中的菜單選項,我認為它等同於其他引擎的Button,打地鼠游戲本身就是一個點擊游戲,將鼴鼠做成按鈕也未嘗不可。

新建一個類:Mole

特別注意!下面的代碼中的NormalImage和SelectedImage在最新版本的cocos2d-x for xna中是私有變量,需要自己修改成為public

using cocos2d;
namespace Hit_Mole
{
     public  class Mole : CCMenuItemSprite
    {
        Scene1 gamescene;
        CCSprite body;
        CCSprite hideimage;
         public Mole(Scene1 root, SEL_MenuHandler selector)
        {
             // 將游戲的根保存
            gamescene = root;
             // 讀取一張“鼠洞”的圖片並添加到菜單項里,它將作為底背景
            CCSprite hole = CCSprite.spriteWithFile( " Hole ");
            hole.anchorPoint =  new CCPoint( 00);
             this.addChild(hole);
             // 讀取一張鼴鼠身體的圖片並設置為默認的圖像
            body = CCSprite.spriteWithFile( " marmot_3 ");
            NormalImage = body;
             // 讀取一張鼴鼠被選擇(點擊)時候顯示的圖像
            SelectedImage = CCSprite.spriteWithFile( " marmot_4 ");
             // 隱蔽時發生出現的圖像,在本篇中暫時無用,所以它是不可見的
            hideimage = CCSprite.spriteWithFile( " marmot_4 ");
            hideimage.visible =  false;
             this.addChild(hideimage);
             // 初始化選擇器,Hit將發生與被點擊時候的狀態
            initWithTarget(root, selector);
             // 設置內容的大小,用繼承類時,contentSize不會被刷新,需要自己指定
            contentSize = body.contentSize;
        }
    }
}

通常CCMenuItemSprite通過靜態方法取得,而為了更好實現效果,通過繼承的方式自己創造一個自定義的按鈕,這里需要注意的是構造方法Mole(Scene1 root, SEL_MenuHandler selector),它要求傳入游戲根(root)和一個回調事件,它們的存在才能使其發揮作用,具體的可以參考CCMenuItemSprite.itemFromNormalSprite相關說明

現在改造一下Scene1這個類,讓地鼠們出現在場景當中:

using cocos2d;
namespace Hit_Mole
{
     public  class Scene1 : CCScene
    {
         public Scene1()
        {
             // 初始化
            initialize();
        }
         public  bool initialize()
        {
             // L1
            
// 從Hit_MoleContent里面讀取scene.jpg的圖像成為游戲當中的一個精靈
            CCSprite background = CCSprite.spriteWithFile( " scene ");
             // 將錨點設置到(0,0)處,單張圖片的讀取默認錨點在(0.5f,0.5f)處
            background.anchorPoint =  new CCPoint( 00);
             // 將背景添加到場景中
             this.addChild(background);
             // L2
            
// 取得當前窗口的寬
             var w = CCDirector.sharedDirector().getWinSize().width /  4;
             // 取得高,並偏移80像素
             var h = (CCDirector.sharedDirector().getWinSize().height -  80) /  3;
             // 聲明一個CCMenuItemSprite數組
            CCMenuItemSprite[] moles =  new CCMenuItemSprite[ 4 *  3];
             for ( int i =  0; i <  4; i++)
            {
                 for ( int j =  0; j <  3; j++)
                {
                     // 建立一個地鼠的菜單(按鈕),並且按照4*3的方式排列
                    Mole mole =  new Mole( this, onClick);
                    mole.position =  new CCPoint(i * w + w /  2, j * h + h /  2);
                    moles[j *  4 + i] = mole;
                }
            }
             // 創建CCMenu
             var menus = CCMenu.menuWithItems(moles);
             // 菜單項目默認是在父節點的中間,所以要把他們移動到0,0處
            menus.position =  new CCPoint( 00);
             this.addChild(menus);
             return  base.init();
        }
         // 被點擊的回調
         public  void onClick(CCObject sender)
        {
        }
    }
}

這里注意的是,直接new出來的Mole是無法接收到點擊事件的,需要將其創建成為一個CCMenu,在引擎內部的機制當中才可以運行起來。

那么現在整體的結構應呈現為:

在一些游戲里面的場景可能會非常的復雜,會加入CCLayer等做各種的區分,但是不用擔心,只要能理解節點和對象之間的關系,很容易就能駕輕就熟。

 

  運行效果

現在運行一下看看效果是什么樣子的呢,當點擊的時候會有變化。

QQ20120605231135

本篇中的例子代碼下載:

cocos2d-x for WindowsPhone :打地鼠(上)

特別推薦:深藍色右手

 


免責聲明!

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



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