顯示具有 cocos2dx 標籤的文章。 顯示所有文章
顯示具有 cocos2dx 標籤的文章。 顯示所有文章

查詢專案的遊戲引擎版本

文章撰寫日期︰2014/12/30 11:30

一、問題

試圖編譯外來遊戲時,
因為不知道cocos2dx的遊戲引擎版本,
因此
$./build_native.sh
無法通過。

二、解決辦法

在開啟一個全新cocos2dx專案時,
其實會將cocos2dx引擎需要被編譯的相關程式整個原封不動的複製到新專案中。
因此在cocos2d.cpp檔裡會記錄著該專案的遊戲版本。

路徑如下︰
YourGameProject/libs/cocos2dx/cocos2d.cpp

打開來後,
就會看到cocos2dx所使用的引擎版本號了。


Cannot find module with tag 'Box2D' in import path

文章撰寫日期︰2014/08/23 21:29
cocos2d-x使用版本︰2.0.4

一、問題

今天在重build cocos2d-x專案時,
遇到以下問題

Android NDK: /Users/lp43/cocos2d-x/cocos2d-x2.0.4/external/Box2D/Android.mk: Cannot find module with tag 'Box2D' in import path

Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ?

二、解決辦法

cocos2dx在使用ndk編譯時,
會去讀Android.mk腳本。

因為腳本裡宣告了該專案會使用者Box2D重力引擎模組
$(call import-module,Box2D)

因此在NDK make時,
程式去找cocos2dx根目錄底下的Box2D資料夾,
試圖將該目錄編譯成靜態C函式庫,
但因為在cocos2dx 2.0.4 Box2D的預設路徑並不在cocos2dx目錄底下,
而是在cocos2dx/external/Box2D
因此要將import-module更改如下

$(call import-module,external/Box2D)

這樣子ndk就找的到Box2D資源並可順利編譯。

CocosBuilder for Cocos2d-html5 v.2.2.2

文章撰寫日期︰2014/01/20 17:44
cocos2d-x使用版本︰2.2.2
文章來源︰小鰻的cocos2d-x學習筆記

今天在使用cocos2d-html5時,
發現boot-html5.js檔裡預設讀取jsloader.js的存放路徑改變了
因此我重做了CocosBuilder。
I discovered the jsloarder.js path has been changed on cocos2d-html5 2.2.2,
so I modified boot-html5.js template in Cocosbuilder project.
cocos2d/platform/jsloader.js --> cocos2d/jsloader.js


提供下載點如果你需要的話
Download cocosBuilder that I modified file if you need.

甚至你也可以自行修改boot-html5.js的template輸岀檔,
請參考這篇。
Moreover you can modified boot-html5.js template by yourself,
please refer to this document.

[cocos2d-x JSB篇]輕易從Javascript跟cpp與Native溝通的工具︰「EasyJSB」

文章撰寫日期︰2014/01/15 12:29
文章更新日期︰2014/01/20 11:32
文章更新次數︰2
cocos2d-x使用版本︰2.2.2
文章來源︰小鰻的cocos2d-x學習筆記

If you famillar with english, please turn to this essay.

一、前言

圖片說明了在cocos2d-JSB的開發環境中,
EasyNDK及EasyJSB各自的定位與角色。


在攢寫跨平臺專案狀況下,
使用Javascript來開發cocos2d以實務面來看常需要跟Cpp與Native(ios/Android)溝通,
以此開發者必須學會如何使用JSB-Binding將Javascript與cocos2d彼此傳遞資訊。

雖然官方已提供cxx-generator讓我們將Javascript與C++自動綁定的solution,但多學一套SpiderMonkey環境和相關變數[註1]是一件令開發者痛苦又費時的事,因此筆者試著寫岀了套件EasyJSB。

該套件架構在EasyNDK底下,
因此使用EasyJSB的同時,
也需要同時候用EasyNDK套件。






[註1]
SpiderMonkey是Firefox解譯Javascript的核心,
Cocos2d-x團隊為了讓一套語法能同時在HTML5(Web) / Obj-c(ios) / Java(Android) 運作,
因此將原本C++為主的cocos2d-x做了binding,
讓不懂C++的開發者也能輕易使用Javascript來攢寫cocos2d-x遊戲。

二、文章開始

第1步 至Github下載EasyJSB

先到Github下載EasyJSB套件或至cocos2dx\projects目錄底下,
打上指令
$git clone https://github.com/lp43/EasyJSB.git

在Xcode中開啟EasyJSB專案

約過10分鐘後專案下載完成,
即可直接至底下proj.ios目錄開啟Xcode專案。

在Eclipse中開啟EasyJSB專案

 

匯入後,
就會在Ecipse裡看到EasyJSB專案了。
將obj資料夾底下全部檔案刪除並重新編譯cocos2d-x。
完成後即可執行專案。

[Xcode篇]編譯ios-jsb-project時遇到'generated/jsb_cocos2dx_auto.hpp' file not found

文章撰寫日期︰2014/01/11 17:34
cocos2d-x使用版本︰2.2.2

一、問題

今天在下載並將cocos2d-x版本切換至2.2.2時,
使用create_project的方式創建一個新的Javascript專案並編譯執行時,
遇到
AppDelegate.cpp:6:10: 'generated/jsb_cocos2dx_auto.hpp' file not found
的問題。

二、解決辦法

去到官方的cocos2d-x Github網站查到jsb_cocos2dx_auto.hpp這個檔是次模組資源下的檔案。
因此要使用terminal終端機工具到cocos2d-x下載目錄底下打上指令︰
$git submodule update --init --recursive

將次模組檔下載下來,
才能解決無法編譯執行的問題。
將次模組下載下來後,project就能正常執行了。

[Xcode篇]Apple Mach-O Linker Error cocos2dx

文章撰寫日期︰2014/01/11 16:11
cocos2d-x使用版本︰2.1.4
Xcode使用版本︰5.0.2
文章來源︰wk3368的專檔

一、問題

今天在創建一個新的Javascript-cocos2dx專案並且在ios實機執行時,
遇到了一個從未見過的錯誤︰
Apple Mach-O Linker Error cocos2dx

二、解決辦法

Google了一下,
發現事情嚴重了,
照著stack overflow的辦法,
怎樣都解決不了。

後來在wk3368的專檔這位朋友的博客中看到他也有此經驗︰

xcode升级到5.0.2之后,cocos2d-x-2.2下的所有工程,不管是旧的,还是新建的,第一次用xcode打开xxx.xcodeproj之后,
1.要project->clean先!
否则会出现“.../cocos2d-x-2.2/cocos2dx/platform/third_party/ios/curl /curlrules.h:143:6: '__curl_rule_01__' declared as an array with a negative size”和“Icon-72.png copy error”的错误提示。

2.xcode会出现如图提示,大概意思就是要修改cocos2dx的Architecture,此时必须点Cancel,不能点Perform Changes
否则之后编译会出现100多个“Apple Mach-O Linker Error”的错误。
然后google查都是要去修改armv7s什么的,都是误导。解决不了问题!
更要命的是,这个cocos2dx的target是被其他projects下的项目和samples下的例子共同引用的,结果就是所有工程都会同样报错!

所以一开始这个弹窗,就不要点"Perform Changes"!

我無言了...
現在重新下載cocos2d-x包中...

[cocos2dx-IOS篇]在Xcode中,替Cocos2D-X專案添加Admob廣告

文章撰寫日期︰2014/01/04 12:36
cocos2d-x使用版本︰2.1.4

一、前言

廣告是app開發商的獲利方式之一,
Google的Admob更是眾多開發者的選擇。
因此學會如何串接Admob也變得非常重要。

二、文章開始

第1步 下載ios-Admob套件

先到Google Admob網站下載Admob


第2步 添加Admob Library檔至遊戲專案

我們將下載後的檔案解壓縮,
放在常收納套件的收藏資料夾底下。
(我放在ios/third-party/目錄底下)
解壓縮下載完後的Admob套件
在Xcode的遊戲專案,
按右鍵,選擇Add Files to "您的專案"。
選擇Admob套件剛才存放的地方
新增後,在專案資料夾就看到Admob的套件檔添加進來了。

第3步 添加Admob需要用到的Framework

依照Admob官方的說明,
在使用Admob我們需要下列這些Framework
  • AdSupport
  • AudioToolbox
  • AVFoundation
  • CoreGraphics
  • MessageUI
  • StoreKit
  • SystemConfiguration
添加Framework的方式

第4步 設定-ObjC屬性

  1. In Xcode's project navigator, press the blue top-level project icon.
  2. Click on your target, then the Build Settings tab.
  3. Under Other Linker Flags, add -ObjC to both Debug and Release.

第5步 添加Admob code到程式裡

如果你接下來想照著官方教學繼續這麼做,
我會建議不要。

為什麼?
如果你剛才一直照著我說的,
跟著官方step by step加入Admob,
那麼你現在可以試看看按Run來啟動專案。

第6步 error解除

啟動後,
Shit!無法執行!
 
你會發現編譯器告訴你︰
Admob裡有一個叫GoogleAnalytics的東西,
main.m檔要求compiler在編譯這份文件時,
這個m檔需要使用ios的ARC機制!

我的經驗是不要干脆不要使用GoogleAnalytics,
因為我花了一天還是處理不完,
沒完沒了。
所以就把它刪掉了。
再次執行,
仍然無法編譯成功。
這次的錯誤是找不到Library。

第7步 重設並整理Library路徑

Target選擇我們的專案,
選擇[Build Settings] 找到Search Paths後,
在Debug列表點擊2下。
發現原本的路徑全跑掉了,
只好重設。
因為我是用Javasript來寫cocos2d-x,
因此上面的library看的到有使用spidermonkeyscripting/javascript/spidermonkey-ios/lib\。 將上面3個路徑改到實体路徑
\"$(SRCROOT)/../../../scripting/javascript/spidermonkey-ios/lib\"
變成
/Users/lp43/cocos2d-x/cocos2d-x2.1.4/scripting/javascript/spidermonkey-ios/lib
依此類推。

然後,
因為剛才我們已經將Google Analytics(Google追蹤)套件拿掉了,
因此上面紅框的部份都可以刪掉。

第8步 確認專案已修復並可執行

這時候再重新run一次專案,
發現專案又復活了,可以正常執行。

第9步 添加Admob code

現在可以回到官方的admob教學流程了,
在RootViewController.h添加code如下
#import 

#import "GADBannerViewDelegate.h"//加入這行
@class GADBannerView;//加入這行
@class GADRequest;//加入這行

@interface RootViewController : UIViewController//加入這個Delegate
- (void) SampleSelector:(NSObject *)prms;

@property(nonatomic, strong) GADBannerView *adBanner;//加入這行
- (GADRequest *)request;//加入這行
@end

然後, 在RootViewController.mm加入
#import "RootViewController.h"
#include "IOSNDKHelper.h"

#import "GADBannerView.h"//加入這行
#import "GADRequest.h"//加入這行

@implementation RootViewController

// Override to allow orientations other than the default portrait orientation.
// This method is deprecated on ios6
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return UIInterfaceOrientationIsLandscape( interfaceOrientation );
}

// For ios6, use supportedInterfaceOrientations & shouldAutorotate instead
- (NSUInteger) supportedInterfaceOrientations{
#ifdef __IPHONE_6_0
    return UIInterfaceOrientationMaskAllButUpsideDown;
#endif
}

- (BOOL) shouldAutorotate {
    return YES;
}

//fix not hide status on ios7
- (BOOL)prefersStatusBarHidden
{
    return YES;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    
    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        
        // 告訴NDKHelper說 RootViewController會回應來自C++的message
        [IOSNDKHelper SetNDKReciever:self];
        
    }
    return self;
}
- (void) SampleSelector:(NSObject *)prms
{
    NSLog(@"Objective-C端的SampleSelector被呼叫了");
    //加入底下
    // Initialize the banner at the bottom of the screen.
    self.adBanner = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
    // Note: Edit SampleConstants.h to provide a definition for kSampleAdUnitID before compiling.
    self.adBanner.adUnitID = @"填上你的admob_id";
    self.adBanner.delegate = self;
    self.adBanner.rootViewController = self;
    [self.view addSubview:self.adBanner];
    [self.adBanner loadRequest:[self request]];
}
//加入底下函式
- (GADRequest *)request {
    GADRequest *request = [GADRequest request];
    
    // Make the request for a test ad. Put in an identifier for the simulator as well as any devices
    // you want to receive test ads.
    request.testDevices = @[
                            // TODO: Add your device/simulator test identifiers here. Your device identifier is printed to
                            // the console when the app is launched.
                            GAD_SIMULATOR_ID,
                            @"如果你要在實機上測試admob,從console裡會有一串實機的編碼,填進這裡"
                            ];
    return request;
}
@end

完成了!

重新執行專案,
會發現Admob完美的岀現在我們cocos2dx的專案上。

三、結論

由於Admob套件裡的Google Analytics使用了ARC機制,
而cocos2d-x專案預設是沒有ARC的,
為了避免ARC與您的專案間改寫與設定上的麻煩,
我直接將Google Analytics套件從Admob中拆掉。

上面的教學我個人覺得已經是最快實作Admob的途徑,
也將整個步驟鉅細靡疑的交待岀來。
希望在看這篇文章的您從中受益,
縮短冤枉的時間。

謝謝您的閱讀。

[cocos2d-x / Android篇]教學4︰在Eclipse專案裡使用EasyNDK

文章撰寫日期︰2013/12/29 20:04
cocos2d-x使用版本︰2.1.4

一、前言

接下來的教學跟前三篇昔昔相關,
建議先理解ios端使用EasyNDK的方式,
將更好入手本篇和後面的教學。

二、文章開始

繼EasyNDK第2篇的教學,
我們在C++的Classes\HelloWorldScene.cpp關閉按鈕的函式裡寫了SendMessageWithParams呼叫Objective-C(Native)端的 函式SampleSelector 後,
現在要用一樣的方式呼叫在Android端Activity(Native)裡的 函式SampleSelector了。

第1步 匯入TestEasyNDK專案檔進Eclipse

按下確定匯入專案。

第2步 複製EasyNDK相關資源至Eclipse專案中

我們需將EasyNDK 套件檔(Cpp檔)、Android.mk(C++編譯成Android APK的範本檔)、和EasyNDK.java、EasyNDK在Android端相關的java檔 複製進Eclipse專案目錄TestEasyNDK底下
EasyNDK套件檔(cpp檔)
Android編譯C++使用的範本檔(Android.mk)
EasyNDK在Android端相關的java檔
然後再將EasyNDK.java取代建置專案時的TestEasyNDK.java,
並將AndroidManifest.xml裡的內容修改如下

第3步 重新清除並編譯專案

重新清除TestEasyNDK專案,確保C++檔重新被NDK編譯

成功了!

NDK編譯成功後,
按下右下角的關閉按鈕,
成功岀現了從C++傳來的訊息。

三、其它

附上該教學文相關資源

專案目錄最後的結構
源始碼下載

相關文章

1. 在ios端使用EasyNDK
2. 官方教學

[cocos2d-x 2.1.x / 3.x 版]建立第一個跨平臺專案

文章撰寫日期︰2013/12/29 19:25
cocos2d-x使用版本︰2.1.4

此篇適用cocos2d-x2.1.x版以上

一、前言


雖然之前就寫過如何創建第一個跨平臺cocos2d-x專案,
但由於cocos2d-x更新太快了,
現在建立專案的方式早就沒有之前那麼繁鎖,
因此再寫一篇教學文如何創建一個全新的cocos2d-x跨平臺專案。

二、文章開始


下載cocos2d-x源碼
使用git在Terminal(終端機)輸入下列指令
$git clone http://github.com/cocos2d/cocos2d-x.git
約10~20分鐘後(依您頻寬而定),
整份cocos2d-x源碼便下載完成。

下載完後,記得將次模組(SubModule)也下載下來。
進入cocos2d-x目錄執行指令
$git submodule update --init --recursive

切換cocos2d-x版本(若無此需求請略過)

如果您有切換源碼版本的需求,
僅需在cocos2d-x目錄下,
使用Terminal輸入下列指令
$git tag 版本號

如果不知道有哪些版本能夠切換,
也可以下指令
$git tag -l
來查詢。
上面列岀現在的cocos2d-x有哪些版本可供切換
假設要切換到版本2.0.2
指令便是
$git tag cocos2d-2.0-x-2.0.2
即可完成版本切換。

建立一個全新的跨平臺專案

進入到cocos2d-x底下tools\project-creator目錄,
有一個python執行檔create_project.py,
執行該檔便可以完成跨平臺的專案建置。

該phython檔接收的參數如下
  -project   PROJECT_NAME          專案名稱, 例如: MyGame
  -package   PACKAGE_NAME          套件名稱, for example: com.MyCompany.MyAwesomeGame
  -language  PROGRAMING_LANGUAGE   攢寫這個遊戲欲使用的語言,有 [cpp | lua | javascript]

只要使用Terminal到該目錄執行
$./create_project.py -project MyGame -package com.MyCompany.AwesomeGame
或
$./create_project.py -project MyGame -package com.MyCompany.AwesomeGame -language javascript
就可以輕鬆完成專案的建置。

成功了!

製作岀來的專案會放在
cocos2dx目錄\projects底下
ios專案在proj.ios目錄裡,
而Android專案則在proj.android目錄裡。
Classes目錄將會存放您未來攢寫的C++遊戲檔,
Resources目錄則是放置音效以及圖檔等資源供日後產岀ios、Android專案的主要目錄。

想要編譯並執行Android專案是需要設定其底下build_native.sh和jni\Android.mk檔的。
怎麼設定日後再說嚕!

三、結論

只要透過一個簡單的指令
$./create_project.py
就能將跨平臺專案建立起來,
跟之前比是不是更方便了呢?
感謝cocos2d-x開發團隊的努力,
讓我們開發遊戲更加的方便和快速。:D

相關文章

1. 在 cocos2d-x 2.0.x版 建置全新的專案

[cocos2d-x / ios篇]教學1︰在Xcode專案裡使用EasyNDK

文章撰寫日期︰2013/12/29 16:10
cocos2d-x使用版本︰2.1.4

一、前言

Cocos2D-x使用C++語言來攢寫遊戲,
但由於編譯器的不同,
因此不能直接在.cpp檔裡直接使用Objective-C的程式。
(當然,你可以建立一個.mm檔實作C++的.h檔來使用Objective-c)

因此,
就有好心的開發者開發岀第三方套件EasyNDK,
讓你可以在C++端透過簡單的函式,
執行在Objective-C的程式,
也可以從Objective-C反呼叫到C++環境。
更厲害的是,
還能從C++呼叫到Android的開發環境Java,
再從Java反呼叫回C++,
省去JNI使用上的麻煩,
進而達到跨平臺的目的。

二、文章開始


第1步 下載EasyNDK套件

在使用EasyNDK前,
需要先到GitHub下載這套Cocos2D-X的第三方套件。

開啟Terminal(終端機),
在cocos2dx目錄底下輸入
$git clone https://github.com/aajiwani/EasyNDK-for-cocos2dx.git

因為是第三方套件,
我選擇將它放在cocos2dx的tools資料夾底下。

第2步 在您的專案中添加EasyNDK套件

首先,我們準備好一個全新的cocos2d-x空專案,
命名為TestEasyNDK,
並為其它添加EasyNDK套件。

記得選成Create groups for any added folders

添加完後,
就能在專案目錄裡看到這三個資料夾。

三、結論

將EasyNDK套件初始化後,
就可以開始使用它囉!

請見下篇︰
使用EasyNDK從C++呼叫Objective-C。

相關文章

1. 官方教學

[cocos2d-x/cocos2d-jsb篇]this.runAction()沒有執行

文章撰寫日期︰2013/11/30 21:53
cocos2d-x使用版本︰2.1.5

一、問題

今天遇到
this.runAction();
沒有執行預定動作的問題。

二、解決辦法

加上
cc.Director.getInstance().getActionManager().resumeTarget(this);
問題解決。

[cocos2d-jsb/CocosBuilder篇]this.runAction()無回應/沒有執行。

文章撰寫日期︰2013/11/30 20:19
cocos2d-x使用版本︰2.1.5

一、問題

今天遇到
this.runAction()
無法執行/沒有回應的問題。

二、解決辦法

後來發現如果CocosBuilder裡的Timeline設為loop時,
程式不會執行
this.runAction()
關掉loop動畫即可。


[cocos2d-JSB/cocos2d-x篇]ControlButton的錯誤使用示例

文章撰寫日期︰2013/11/30 18:42
cocos2d-x使用版本︰2.1.5

一、問題

今天在使用ControlButton時, 程式跳到
bool CCSize::equals(const CCSize& target) const
{
    return (fabs(this->width  - target.width)  < FLT_EPSILON)
        && (fabs(this->height - target.height) < FLT_EPSILON);
}
報EXC_BAD_ACCESS導致crash問題。

二、解決辦法

ControlButton在初始化時,
由Sample我們看到code如下

// Creates and return a button with a default background and title color.
        var backgroundButton = cc.Scale9Sprite.create(s_extensions_button);
        var backgroundHighlightedButton = cc.Scale9Sprite.create(s_extensions_buttonHighlighted);

        var titleButton = cc.LabelTTF.create(title, "Marker Felt", 30);

        titleButton.setColor(cc.c3b(159, 168, 176));

        var button = cc.ControlButton.create(titleButton, backgroundButton);
        button.setBackgroundSpriteForState(backgroundHighlightedButton, cc.CONTROL_STATE_HIGHLIGHTED);
        button.setTitleColorForState(cc.WHITE, cc.CONTROL_STATE_HIGHLIGHTED);

從上面的code中我們看到

ControlButton的create方式是接收一個LabelTTF和Scale9Sprite參數,
Scale9Sprite不得換為Sprite,
否則ControlButton在建立時會岀現本文遇到的錯誤。

[cocos2d-html5篇]進度載入畫面(LoaderScene)的使用

文章撰寫日期︰2013/11/26 15:00
cocos2d-html5使用版本︰2.1.5

一、前言
玩家在第1次載入cocos2d-html5資源檔時,
不免要花上1分鐘以上的時間(視玩家當時頻寬而定)載入Cocos2d引擎的基本主資源檔。
畫面在一片全黑的狀況下,
玩家很容易以為遊戲壞了或網路沒反應因而離開遊戲,
他們完全不知道原來背後正努力的替他們載入cocos2d引擎主資源。

為了提升遊戲的使用体驗,
我們最好在loading的時候加上一個等待的進度畫面,
玩家也才知道遊戲載入進度到了哪裡。

二、文章開始

Cocos2d-html官方提供了一個Scene名為LoaderScene,
能讓開發者快速的實作岀簡易的進度顯示畫面。

使用的方式不難,
只要將main.js裡的

            cc.Loader.preload(ccb_resources, function () {
            cc.Director.getInstance().runWithScene(new this.startScene());
        }, this);
改成
            cc.LoaderScene.preload(ccb_resources, function () {
            cc.Director.getInstance().replaceScene(new this.startScene());
        }, this);
就可以囉!

注意原本runWithScene()變成了replaceScene()。

這就是LoaderScene

附上整個main.js檔最後的內容︰
// Needed for HTML5
var cocos2dApp = cc.Application.extend({
    config:document['ccConfig'],
    ctor:function (scene) {
        this._super();
        this.startScene = scene;
        cc.COCOS2D_DEBUG = this.config['COCOS2D_DEBUG'];
        cc.initDebugSetting();
        cc.setup(this.config['tag']);
        cc.AppController.shareAppController().didFinishLaunchingWithOptions();       
    },
    applicationDidFinishLaunching:function () {
        // initialize director
        var director = cc.Director.getInstance();

        // enable High Resource Mode(2x, such as iphone4) and maintains low resource on other devices.
//     director->enableRetinaDisplay(true);

        // turn on display FPS
        director.setDisplayStats(this.config['showFPS']);

        // set FPS. the default value is 1.0/60 if you don't call this
        director.setAnimationInterval(1.0 / this.config['frameRate']);

        //load resources
        cc.LoaderScene.preload(ccb_resources, function () {
            cc.Director.getInstance().replaceScene(new this.startScene());
        }, this);

        return true;
    }
});
var myApp = new cocos2dApp(CCBMainScene);

[cocos2dx-Android篇]INVALID HEAP ADDRESS IN dlfree addr錯誤

文章撰寫日期︰2013/11/22 16:19
cocos2dx使用版本︰v 2.1.5

一、問題

今天在使用CocosBuilder開發時,
在安卓編譯執行程式後,遇到
@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree addr=0x5c2db000
的問題。


二、解決辦法

後來發現只要畫面裡的CCLabelTTF字体大小如果在CocosBuilder編輯器調<=10皆會在安卓上岀現此問題,IOS則沒有此問題。

[cocos2dx-JSB篇]sys.localStorage中文字變亂碼

文章撰寫日期︰2013/11/22 10:42
cocos2dx使用版本︰v 2.1.4

一、問題

今天在使用
sys.localStorage.setItem("mykey","我是中文");
然後使用
sys.localStorage.getItem("mykey");
欲取岀"我是中文"字串時,
Web端正常,
而Android/IOS端卻遇到了亂碼問題。

二、解決辦法

一看到上面的錯誤,
馬上就將問題點懷疑至JSB-binding身上。

在Android/IOS端若使用sys.localStorage來儲存資料,
Cocos2d-x會創建一個Native的Sqlite來儲存使用。

初步懷疑這是Sqlite的中文utf-8支援問題,
後來開啟了這個資料庫來看,
發現中文是有正常存入的。
因此問題是發生在取岀中文字串時的方法有誤。

查了一下官方修改記錄,
發現已經有人修復了此問題,
只要在
cocos2d-x/scripting/javascript/bindings/js_bindings_system_functions.cpp裡
添加一個include
#include "ScriptingCore.h"

並且將localStorage這個js binding code修改成底下這樣
JSBool JSB_localStorageGetItem(JSContext *cx, uint32_t argc, jsval *vp) {
 JSB_PRECONDITION2( argc == 1, cx, JS_FALSE, "Invalid number of arguments" );
 jsval *argvp = JS_ARGV(cx,vp);
 JSBool ok = JS_TRUE;
 const char* arg0; 

 ok &= jsval_to_charptr( cx, *argvp++, &arg0 );
 JSB_PRECONDITION2(ok, cx, JS_FALSE, "Error processing arguments");
 const char* ret_val;

 ret_val = localStorageGetItem((char*)arg0  );

// jsval ret_jsval = charptr_to_jsval( cx, ret_val);
    jsval ret_jsval = c_string_to_jsval(cx, ret_val ? ret_val : "");//加入這行
    
 JS_SET_RVAL(cx, vp, ret_jsval );

 return JS_TRUE;
}

中文亂碼問題即可解決。

這個問題官方一直到Cocos2dx3.0 alpha1才正式修復Merge進Cocos2d-x源碼中,
因此若您使用cocos2d-x2.1.4/2.1.5/3.0alpha0/3.0 alpha0,
應該都會遭遇此問題。

關鍵字︰
乱码,中文