code-prettify

2014年4月18日 星期五

Cocos2d-x 3.0 - Chapter 3 - How to Move a sprite

Cocos2d-x 3.0 - Chapter 3 - How to Move a sprite
Cocos2dxSimpleGame Series

在上一篇 Chapter 2 - How to Add a sprite 中,我們已經增加了一位英雄。但是英雄只有一個人太孤單了,所以我們來增加一些敵人。

addTarget() 這個函式會讓敵人隨機的出現,並從右向左移動。


void HelloWorld::addTarget()
{
 Sprite *target = Sprite::create("Target.png", Rect(0, 0, 27, 40));

 // Determine where to spawn the target along the Y axis
 Size winSize = Director::getInstance()->getWinSize();
 int minY = target->getContentSize().height / 2;
 int maxY = winSize.height - target->getContentSize().height / 2;
 int rangeY = maxY - minY;
 // srand( TimGetTicks() );
 int actualY = (rand() % rangeY) + minY;

 // Create the target slightly off-screen along the right edge,
 // and along a random position along the Y axis as calculated
 target->setPosition(Point(winSize.width + (target->getContentSize().width / 2), actualY));
 this->addChild(target);

 // Determine speed of the target
 int minDuration = (int)2.0;
 int maxDuration = (int)4.0;
 int rangeDuration = maxDuration - minDuration;
 // srand( TimGetTicks() );
 int actualDuration = (rand() % rangeDuration) + minDuration;

 // Create the actions
 FiniteTimeAction* actionMove =
  MoveTo::create((float)actualDuration,
  Point(0 - target->getContentSize().width / 2, actualY));

 FiniteTimeAction* actionMoveDone =
  CallFuncN::create(std::bind(&HelloWorld::spriteMoveFinished, this, std::placeholders::_1));

 target->runAction(Sequence::create(actionMove, actionMoveDone, NULL));
}

其中 CallFuncN::create(std::bind(&HelloWorld::spriteMoveFinished, this, std::placeholders::_1)) 使用了回呼函式,所以我們需要宣告 spriteMoveFinished 函式在 HelloWorld。


void HelloWorld::spriteMoveFinished(Node* sender)
{
 Sprite *sprite = (Sprite *)sender;
 this->removeChild(sprite, true);
}

接著,我們需要定時讓敵人出現在場景上,加入下列這段程式到 init 函中的 return 之前


this->schedule(schedule_selector(HelloWorld::gameLogic), 1.0);

然後實作 gameLogic() 函式


void HelloWorld::gameLogic(float dt)
{
 this->addTarget();
}

好了,所有的工作都完成了,建置然後看看結果吧:



參考資料:
Cocos2d-x
http://www.cocos2d-x.org/

Step by Step Cocos2dxSimpleGame Series (Old Version for cocos2d-x v2.x)
http://www.cocos2d-x.org/wiki/Step_by_Step_Cocos2dxSimpleGame_Series


Cocos2d-x 3.0 - Step by Step Cocos2dxSimpleGame Series

Cocos2d-x 3.0 - Step by Step Cocos2dxSimpleGame Series

將原先官方 wiki 上的 範例,從 Cocos2d-x 2.x 版本,改為 3.x 版本。
Souse : Step by Step Cocos2dxSimpleGame Series ( for cocos2d-x 2.x)

其中關於 Cocos2d-x 2.x to 3.0 的注意事項,請參考 Cocos2d-x 2.x to 3.0 rc1 Note 。

Chapter 1 - How to Create a New cocos2d-x project
Chapter 2 - How to Add a sprite
Chapter 3 - How to Move a sprite
Chapter 4 - How to Fire some Bullets
Chapter 5 - How to Detect the Collisions
Chapter 6 - How to Play Music and Sound Effect
Chapter 7 - Some Icing on the Cake

2014年4月10日 星期四

Cocos2d-x 3.0 - Chapter 2 - How to Add a sprite

Cocos2d-x 3.0 - Chapter 2 - How to Add a sprite
Cocos2dxSimpleGame Series

一、前言
接續前一篇 Cocos2d-x 3.0 - Chapter 1 - How to Create a New cocos2d-x project 產生的專案,如果還沒有專案的話可以先參考上面的連結。如果之前用過 Cocos2d-x 2.x 版本的話,那你可能會想要參考一下 Cocos2d-x 2.x to 3.0 rc1 Note

在第一篇我們已經建置過整個方案了,習慣上我會將 libcocos2d, libchipmunk, libAudio 三個專案「卸載專案」,避免之後重新建置這三個專案。只留下 MyGame 這個主要專案。




二、背景
在開始前,因為 3.0 的 Layer 預設是黑底,所以我們先把他改為白底。先將 HelloWorldScene.h 裡面,HelloWorld 繼承的 Layer 改為 LayerColor,然後將 HelloWorldScene.cpp 裡面的 init 函式的 if ( !Layer::init() ) 改為 if (LayerColor::initWithColor(Color4B(255, 255, 255, 255)) == false)。


if (LayerColor::initWithColor(Color4B(255, 255, 255, 255)) == false)
{
    return false;
}

三、新增 Sprite
在 MyGame 專案中,找到 HelloWorldScene.cpp 中的 init 函式,在 return true 之前加上這一段

Size winSize = Director::getInstance()->getWinSize();
Sprite *player = Sprite::create("Player.png",Rect(0, 0, 27, 40));
player->setPosition(Point(player->getContentSize().width / 2, winSize.height / 2));
this->addChild(player);

最後,我們可以看到一位英雄孤獨的站在白色背景中


參考資料:
Cocos2d-x
http://www.cocos2d-x.org/

Step by Step Cocos2dxSimpleGame Series (Old Version for cocos2d-x v2.x)
http://www.cocos2d-x.org/wiki/Step_by_Step_Cocos2dxSimpleGame_Series

Cocos2d-x 2.x 到 3.x 筆記

Cocos2d-x 2.x to 3.x Note
Cocos2d-x 2.x 到 3.x 筆記

一、命名規範跳脫原本 Cocos2d 的 Object-C 規範,更接近 C++ 規範,像是去除 CC 前贅字。
Ex:
CCSize => Size
CCDirector => Director
CCSprite => Sprite
CCRectMake => Rect
ccp => Point

二、命名的變更除了類別之後,有些函式也有改變,像是 sharedXXX() 改為 getInstance()。
Ex:
sharedDirector() => getInstance()

三、儘可能使用 std lib,而非自己的函式,
Ex:
CallBackFunction 使用
2.x 寫法:
CCFiniteTimeAction* actionMoveDone =
CCCallFuncN::create( this, callfuncN_selector(HelloWorld::spriteMoveFinished));
3.0 寫法:
FiniteTimeAction* actionMoveDone =
CallFuncN::create(std::bind(&HelloWorld::spriteMoveFinished, this, std::placeholders::_1));

四、CCLabelTTF, CCLabelBMFont and CCLabelAtlas 改用 Label 取代

參考資料:
EventDispatcher Mechanism
http://www.cocos2d-x.org/docs/manual/framework/native/input/event-dispatcher/en

cocos2d-x 3.0 beta: the new Vector class
http://dev.bunnyhero.org/2014/01/cocos2d-x-30-beta-the-new-vector-class/

Improved Label in Cocos2d-x-3.0
http://www.cocos2d-x.org/docs/manual/framework/native/v3/label/en

2014年4月8日 星期二

Cocos2d-x 3.0 - Chapter 1 - How to Create a New cocos2d-x project

Cocos2d-x 3.0 - Chapter 1 - How to Create a New cocos2d-x project
Cocos2dxSimpleGame Series

Cocs2d-x v3.0 rc1 建置環境需求 (Build Requirements)
------------------
* Mac OS X 10.7+, Xcode 4.6+
* or Ubuntu 12.10+, CMake 2.6+
* or Windows 7+, VS 2012+
* Python 2.7.5

實際測試環境
* Cocos2d-x v3.0rc1 版本。
* Windows 7。
* Vistual Studio 2013 Express for Desktop。
* Ptyhon 2.7.6

步驟
一、下載 並解壓縮 cocos2d-x (這裡使用的是 v3.0rc1),假設解壓縮後的資料夾為 D:/cocos2d-x-3.0rc1。

二、進入 D:/cocos2d-x-3.0rc1/build 資料夾,開啟 cocos2d-win32.vc2012.sln,因為本來是 Vistual Studio 2012 的專案,所以使用 Vistual Studio 2013 開啟時會出現專案升級畫面,放心的給他按下去。等一陣子之後就會開啟專案了,然後開始建置方案,建置過程會比較久一點。

三、進入 D:/cocos2d-x-3.0rc1/tools/cocos2d-console/bin,使用 command line 輸入
「cocos new MyGame -p com.MyCompany.MyGame -l cpp -d D:/MyCompany」
之後會在 D:/MyCompany 產生一個 MyGame 資料夾,一個 Cocos2d-x 專案就產生了!



四、開啟 D:/MyCompany/MyGame/proj.win32/MyGame.sln 後,開始建置。
等待建置完成後執行程式,噹噹!


小結:Cocos2d-x 專案越來越方便了…

下一篇: Cocos2d-x 3.0 - Chapter 2 - How to Add a sprite

參考資料:
Cocos2d-x
http://www.cocos2d-x.org/

How To Start A New Game (New Version for v3.0 rc1)
https://github.com/chukong/cocos-docs/blob/master/manual/framework/native/getting-started/v3.0/how-to-start-a-new-game/en.md

How to create a new game (Old Version for cocos2d-x v3.0-alpha0 ~ v3.0 beta2)
http://www.cocos2d-x.org/wiki/How_to_create_a_multi-platform_project_in_one_command_line

Step by Step Cocos2dxSimpleGame Series (Old Version for cocos2d-x v2.x)
http://www.cocos2d-x.org/wiki/Step_by_Step_Cocos2dxSimpleGame_Series

Log2Console 使用 log4net 的設定

Log2Console

先看一下圖片,(更多圖片)



先承認令我非常心動的是右邊那樹狀圖,可以很清楚的針對 Logger 做訊息的過濾 (Filter)。解決了想看 Log,卻又不想被龐大資料量淹沒的窘境。
缺點是資料量過多時,等待過濾的處理速度還是有點慢的,可能要適時的按一下 Clear。

打開 Log2Contole 之後,點選上方的 Receivers 設定要接受哪些來源的 Log,
按下 Add 按鍵,選 UDP (IP v3 and v6),預設 UDP Port 是 7071,
右下角從貼心的顯示 log4net 的 config 設定喔,直接複製貼上就可以用啦!



提醒一下,因為訊息太多的話,切換 Fillter 的時候會很慢很慢,甚至有時候會當掉,所以如果有一些 Logger 確定是不需要的話,可以先在 config 直接 Fillter 掉喔。

另外,官方提供的 Log2Console 中文會亂碼,網路上有人提供修正版,請到參考資料的第二個連結裡面下載喔!

參考資料
Log2Console
https://log2console.codeplex.com/

log4net和log2console的配置
http://www.cnblogs.com/yao2yao4/archive/2013/06/06/3120355.html