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

[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 / 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 / ios篇]教學2︰使用EasyNDK從C++呼叫Objective-C

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

一、前言

上一篇我們在Xcode專案初始化EasyNDK環境後,
這篇就要繼續來說明怎麼從C++呼叫Objective-C

二、文章開始

底下示例從 C++ 叫岀 IOS 的 UIAlertView彈跳視窗

實作C++端

在Classes\HelloWorldScene.cpp開始處宣告
#include "NDKHelper.h"

然後修改關閉按鈕觸發後的事件如下
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
    CCLog(__FUNCTION__);
    
    // 在C++中呼叫Objective-C的函式︰SampleSelector
    SendMessageWithParams(string("SampleSelector"), NULL);
}

實作Objective-C端

在ios\RootViewController.h宣告即將從C++呼叫的函式SampleSelector

在RootViewController.mm裡匯入EasyNDK套件
#include "IOSNDKHelper.h"

添加底下函式讓Objective-C端註冊IOSNDKHelper,
目的是讓RootViewController.mm有能力監聽從C++端傳來的呼叫
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {

        // 告訴NDKHelper說 RootViewController會回應來自C++的message
        [IOSNDKHelper SetNDKReciever:self];
        
    }
    return self;
}

實作SampleSelector函式
- (void) SampleSelector:(NSObject *)prms
{
    NSLog(@"Objective-C端的SampleSelector被呼叫了");
    
    // Show a bogus pop up here
    UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Hello World!"
                                                      message:@"This is a sample popup on iOS"
                                                     delegate:nil
                                            cancelButtonTitle:@"OK"
                                            otherButtonTitles:nil];
    [message show];
}

成功了!

執行專案,
此時看到ios simulator跳岀畫面如下
從C++呼叫岀來的UIAlertView彈跳視窗

三、結論

從上面的教學來看,
從C++呼叫Objective-C一點也不難。
只要將EasyNDK專案匯入遊戲專案,
然後在.cpp和.mm檔引用套件並使用EasyNDK的函式SendMessageWithParams,
便能輕易地與Objecitve-C溝通。

這篇教學文的目的是簡單易懂,
如果您還有進階的需求,
像是想用SendMessageWithParams傳送Object給Objective-C,
或者希望從Objective-C呼叫回C++端,
可以參考官方教學使用CCDictionary的方式或者下一篇

[cocos2d-CocosBuilder篇]compile(編譯製作)自己專用的CocosBuilder

文章撰寫日期︰2013/08/30 23:20
cocos2dx使用版本︰v 3.0 alpha 0
cocosBuilder使用版本︰v 3.0 alpha 5

一、前言

CocosBuilder使用上很方便,
但想要改一些程式碼,
或者模版編譯岀來的東西離自己的需求離很遠,
該怎麼辦?

答案是複製原始碼修改自己想要的

筆者在學會怎麼載入並製作自己想要的cocosBuilder遇到了很大很大很大的阻礙(stuck in it),
現在會了,
不吝嗇的在部落格上跟大家分享。

廢話不多說,
我們看下去。

二、文章開始

步驟1 從gitHub上複製一份原始碼到你的桌機上

我們需要在github上clone一份cocosBuilder的原始碼至桌機裡,
底下放上一張示意。

步驟2 將submodule也複製下來

很多人都漏作或卡在這個步驟,
其實這個步驟在cocosBuilder下載下來後,
README.md檔裡寫得相當清楚︰

Cocos2d and other extensions are provided as a submodules to this project. To be able to compile the source code you need first check out the module. Change directory into the top (this) directory of CocosBuilder and run:
cocos2d和其它的擴充套件都使用了submodule(在git裡維護一個專案底下的次專案我們用submodule,這個次專案是一個被共用的Library,像我們開發Cocos2d-x遊戲都要用到最基本的Library:cocos2d一樣),如果你希望能夠編譯您的code,你就一定要下載這個module(這裡指Cocos2d Library)。請在您的terminal視窗,下載完cocosBuilder源碼(下列第1行)後,進入cocosBuilder目錄再打上下列第3行指令,便可以下載cocosBuilder需要的submodule。

    $git clone https://github.com/cocos2d/CocosBuilder //下載CocosBuilder源碼
    $cd CocosBuilder
    $git submodule update --init --recursive //下載CocosBuilder源碼需要的Library

包含我,
都是不看說明文件的那一個(><)。

步驟3 Xcode的輸岀Target設為cocosBuilder

一樣,說明文件中接著寫道︰

When building CocosBuilder, make sure that "CocosBuilder" is the selected target (it may be some of the plug-in targets by default).
當在建置cocosBuilder專案時,請確定"CocosBuilder"是您選擇的建置target(因為有時候還會有很多其它的plug-in在target列表中),沒有選擇這個動作可能會導致您的專案怎樣都無法run起來


三、總結

經過2次的git下載(第1次下載cocosBuilder源碼,第2次下載它需要的submodule)並選擇target為cocosBuilder後,
整個專案就被編譯起來了。
編譯出來的.app檔案會放在product資料夾底下。
把它複製到你容易使用的地方吧(像是應用程式資料夾底下)!

[JSB-IOS篇]遇到 error: failed to attach to process ID 0 resources

文章撰寫日期︰2013/08/24 04:20
文章修改時間︰2013/08/31 23:36
文章修改次數︰2
cocos2dx使用版本︰v 2.1.4
cocosBuilder使用版本︰v 3.0 alpha 5

一、問題

今天遇到Xcode回報
error: failed to attach to process ID 0 resources

導致cocos2dx專案在Xcode上一直無法啟動的問題。

二、解決辦法

我遇到的問題是Resources資料夾同時做為Group,
又同時做為References產生的問題。

在Stackoverflow有網有提到︰
I experienced the same problem, and after a while I found out that it was due to the fact that my XCode project included a Folder Reference to a folder named Resources.
It seems that XCode doesn't like that name.
Just removing the folder reference or renaming the folder solved the issue.
將藍色資料夾的Resources(References)移除即可解決問題。

如果這個問題解決不了你的狀況,
請再爬文,
因為看起來造成這個error的原因有很多。

2013/08/31
今天又遇到一次問題,
解決辦法是到
/Users/你的名稱/Library/Developer/Xcode/DerivedData
底下去把專案刪掉,IOS Simulator重新reset,
最後才告訴我在main.js裡多宣告了一個已被我刪除的require導致整隻程式run不起來。

[cocos2dx-JSB篇]tool-project-creator無法Run創建岀來的Xcode專案

文章撰寫日期︰2013/08/17 16:48
cocos2dx使用版本︰v 2.1.4
cocosBuilder使用版本︰v 3.0 alpha 5

一、問題

今天遇到使用/Users/urname/cocos2d-x/tools/project-creator/create_project.py創建跨平臺專案時,遇到創建岀來的cocos2dx-JSP-Xcode專案無法在simulator和device Run的問題,編譯完後一直沒任何開啟simulator的動作,整個呆在那邊。

二、解決辦法

後來交叉查明後發現,
這個被create_project創建岀來的proj.ios專案裡面又吃了一個cocos2dx專案,
把它當成framework來用,
因此在編譯它時,最好不要又另外開啟一個同為cocos2dx的專案,
避免Xcode在編譯時,遇到找不到此專案檔導致無法編譯的問題。

[Git篇]在Dropbox上使用Git版本控制

文章攢寫時間︰2013/03/20 14:37

本篇文章完全取自MRMU STUDIO部落格

一、前言

專案如果是一人開發還好,
要是多人開發,
那要怎麼一起搞下去呢?

如果要跟其他人一起開發專案,
就需要架Git server,
讓多位開發者可以透過存取遠端Server的Repo來進行協同開發,
共同維護同一個專案。
順帶一提,
每位老手大大都建議先去Github.com開一個免費帳號練習一下。

Github提供Git server,
也就是遠端的Repo,
但是免費的限制是你的Repo都是開放的,
如果不想讓他人看到你的程式碼,
就必須付費。

你也許會因為工作的關係,
所以不能公開專案的程式碼,
若是一個人開發那還好,
多人開發的情況下也許又覺得要自架Git server有點麻煩,
有沒有經濟簡單的解決方案呢?
在此提供一個簡單的方式,
就是使用Dropbox作為Git server。

二、本文

什麼是Dropbox?

先在此大致簡介一下:
Dropbox是一個非常棒的雲端檔案儲存服務,
把它安裝好後,
你就可以指定本機端的任一目錄 (預設名叫My Dropbox)成為有雲端儲存功能的目錄,
從此就可以在任何有安裝Dropbox的電腦存取該目錄內的檔案 (當然你要先登入自己的帳密),
所以如果你有一台以上的電腦,
或有iphone、android手機等(皆有dropbox app可下載),
共享檔案就變得非常方便。

除此之外,
你還可以在dropbox的目錄裡開設公開分享的目錄,
邀請其他朋友共同使用該目錄,
如此該目錄也就成為了一個公用槽。

因為dropbox可以開公用目錄,
因此我們可以開一個共用的目錄並邀請開發團隊所有成員一起共用此目錄,
然後把git server放在這個目錄。

在此假設這個共用的目錄叫OurProject。
說是git server,
其實就只是一個共用的Repo存在這裡。
為OurPeoject目錄建立一個repo,
請注意,記得使用加上bare參數:
git init --bare

備註︰
在不加--bare所init完的結果,會是在目前的working目錄下建立.git目錄,並把上述的git相關檔案放在.git目錄裡。
加了--bare的話,則是不建.git目錄,而把裡面的檔案直接放在目前目錄下。
適合在沒有修改檔案或開發的機器上,ex GIT server。
好處是只要maintain git repository,project的資料只存在repository中,不需要再複製一份最新的版本出來,會省點空間。


如此這個目錄就會變成Repo了,
而因為加了bare,
這個目錄不會有.git目錄,
而是把原先.git目錄中的東西都放進來,
而且你日後在這個目錄中不會看到你的程式檔案。

對,不會看到你專案的程式檔案哦,
就是大家把最新進度從遠端Repo拿下來、更新、放回去,
這個目錄裡都看不到專案的程式檔案。
但是其實它已經記錄了最新進度,
只是需要你「拿回家」才看得到。

好,所以現在你的狀況應該是:
專案的程式碼已經先放在一個Repo了(內有程式檔案),
而dropbox也有一個Repo,
但是用bare的方式建立的
(只有git相關檔案,沒有你的程式檔案),
dropbox的Repo我們就先稱之為「遠端Repo」。
在dropbox目錄建好遠端Repo後
(說是遠端,
但其實位在我們本機的dropbox目錄,
但也能說是遠端,
因為跟其他人同步共用中),
進入你專案所在的Repo目錄,
並執行:
git remote add origin Dropbox的目錄/OurProject

如此就會在你專案Repo中建立一個遠端Repo的位址,
然後把這個位址取名為origin,
日後就可以把你的進度放進遠端Repo了。
(通常本地端的Repo預設名是master,而遠端的Repo預設名就是origin)

接著要把你專案Repo的進度放進遠端Repo中,
供其他人取用,
所以要在專案Repo目錄執行Push的指令:
git push origin master

如果push有成功,
你在遠端Repo (dropbox目錄裡的OurProject目錄) 看不到你的程式檔案(剛剛有提過),
要確定是不是真的有push進最新進度,
我們需要再Pull回來看看,
看現在遠端Repo裡是不是最新進度:
git pull origin master 

一下本機一下遠端,操作很複雜?

簡單來說,
 add、commit、branch、checkout等這些都是你自己在本機跟自己玩,
都是操作本機的Repo,
當你要跟其他人一起玩時,
你就要用push、pull,
把別人的成果從遠端Repo拿下來(pull),
自己玩一玩(先commit進自己的Repo,再修改、再commit…),
再丟上遠端Repo(push),
讓其他人也能抓最新進度去玩。

通常我們從遠端Repo拿東西下來,
可以用Clone、Pull、Fetch等方法,
其差異 (就我的理解) 說明如下:

Clone:
會把遠端的repo整個專案抓下來,
放在目前路徑下的新目錄中。
(所以不需要先把新目錄建立成Repo,
就可以整包抓下來,
隨包附上.git目錄)

Pull:
會把遠端的repo整個專案抓下來,
跟你目前所在的Repo及所用的Branch作合併(Merge),
此指令等同Fetch+Merge。

Fetch:
會把遠端的repo整個專案抓下來,
但不跟你目前所用的branch合併,
而是放在本地中的另一個Brance(remoteBranch)。
別人的code跟我寫的衝突了!!!!!!!!!

槽了!專案全亂了!

在teamwork中一「推」一「拉」很有趣,
尤其第一次在Pull別人的成果回來跟自己的成果merge時,
有點怕怕的,
但當你發現它自動merge作得很棒時,
心情也跟著很興奮。
但衝突就這麼發生了!

故事是這樣的… 假設程式檔案Sample.php本來的code是:AA
小明加上BB後,
Pull server的code下來,
跟自己的code完美的合併了(AA+BB沒衝突) 小明commit到自己本地端Repo後,
再Push回Server,
目前Server最新版是:AABB

你現在的code是之前Pull的,
也就是:AA,
現在你刪一個A,
加一個C,
成為了:
AC 接著你先commit到本地端,
然後執行Pull,
要合併別人的進度,
但挫屎了,產生衝突!!
衝突的原因是,
Git不曉得第二個A是否要刪除 (有人要刪,有人要留),
所以它會把這個衝突反應在Sample.php這個檔案中。
開啟Sample.php,
你會看到類似這樣的標記:

第一個A的內容
<<<<<<<
你加的C內容
=======
第二個A的內容
後面BB的內容
 >>>>>>>

<<<<<<< 跟 >>>>>>>標記描述了產生衝突的程式碼,
其間以=======作為區隔,
第一個部份就是你新加的內容,
第二個是遠端的內容,
你一看就會知道這邊有衝突,
於是你要決定怎麼合併它們,
手動更改檔案,
處理好衝突,
先Commit接著Pull再看看有沒有衝突發生,
若還有衝突發生,
就要再手動去檢查產生衝突的檔案,
再Commit,
然後再Pull看看。

直到Pull成功後,
就可以Push回Server,
享受整併最新進度的快感。

相關文章

1. 在Xcode底下使用Git版本控制
2. Git版本控制的進階觀念

[Git篇]Git進階觀念說明

文章攢寫時間︰2013/03/20 13:56

一、前言

繼前一篇簡單扼要的提到如何使用Git版本控制,
這一篇會對Git裡所有我們應該知道的術語做了解。

二、本文


(以下文章取自MRMU STUDIO部落格)

每個人的程式倉庫Repo

Repo是repository的簡稱,
指的是倉庫、程式庫、版本庫…,
簡單來說,
Repo就是一個受Git版本控制的目錄。

你可以先找一個空資料夾執行git init來建立新的Repo,
若你有裝TortoiseGit(俗稱小烏龜)
就可在空資料夾按右鍵,
選擇Git create repository here,
意思一樣。

當然若你有現成的程式專案目錄,
也可以直接把它建成Repo,
操作跟上述相同。

執行git init後這個資料夾就變成一個Repo了,
裡頭會多一個名叫.git的目錄,
而Repo在日後進行版本控制時所需的相關資訊都會存放在這個.git資料夾中。
(.git目錄若砍掉了,這個目錄就不再是一個Repo了) 

使用版本控制的第1步︰將檔案加入版本控制器

現在Repo目錄裡啥都沒有,
所以可以先隨便新增一個README來試玩看看,
執行:
touch README

執行後就會多一個空白的檔案叫README,
如果要你放進其他的檔案試試看也行,
就直接copy放進來吧。

這時我們的repo已經有新檔案了,
但都還沒受到版本控制(untracked),
不在版本控制清單中的檔案,
就不會受到git控制,
也就是你要把程式碼提交變更(commit)至repo時,
這些untracked的檔案都不會被放進去。
所以要執行add,
讓檔案們進入所謂的staged狀態,
才能接著把它們commit進Repo中。

要把所有檔案都加入staged狀態,
執行:
git add -A

git add .

要把個別的檔案加入staged,
執行:
git add 主檔名.副檔名

如果有些檔案你不想要再讓它受到版本控制了,
也就是要把它unstage,
那可以執行:
git reset 主檔名.副檔名

使用版本控制的第2步︰遞交你的程式

好的,
現在確定好要commit第一版程式碼了,
所以可以執行:
git commit -m "Initial commit"

也就是把所有檔案commit進repo,
並且附上’Initial commit’的說明註解。
而日後,
如果commit過的檔案有再修改過,
也需要再add一次成為staged狀態,
然後再commit它們。

出事了,我要還原程式碼

現在我們可以自己寫code自己commit了,
天天記錄新進度,
感覺很踏實。

但有一天發現某功能挫屎了。
也許你確定上禮拜這邊還沒問題的,
或某一版一定沒問題,
這時我們可以利用Checkout來回溯之前的版本:
git checkout xxxx

xxxx指的是版本編號的前四碼。

相關文章

1. 在Xcode底下使用Git版本控制
2. 在Dropbox上使用Git版本控制

[Git篇]在Xcode底下使用Git版本控制

文章攢寫時間︰2013/03/20 12:18
章修改時間︰2013/03/23 18:24
文章修改次數︰3

一、前言

(以下文章取自MRMU STUDIO的部落格)
開發專案時,
開發者會一直寫入新的程式碼,
或放進新檔案。

如果有天出事了,
某個功能以前明明可以跑,
但突然掛點了,
通常我們會回頭去看相關的程式碼,
試著找出問題並修復。
但如果專案規模不小或者是由很多人一起開發的專案,
就會大大增加debug的難度。

版本控制軟體讓我們可以儲存專案不同時期的版本,
如果每次有修改就存下一個版本(有些叫check-in,有些叫commit),
出事時就可以回溯到之前還能正常執行的版本,
並且比較兩個版本間有何不同,
找出引起問題的程式碼。

另外有一些情況是:
如果你想開發新功能,
我們可以利用版本控制軟體,
在專案中開一個分支(branch)來發展看看或實驗看看,
如果成功了,
又能合併(merge)回原來的開發主線。

這些都是版本控制的好處。

二、本文

(以下文章取自靜水深流部落格)

什麼是Git

Git就一套版本控制軟體,
相對於subversion(SVN)的中心式版本控制,
git是分散式版本控制,
幾乎什麼事都在本機進行,
設計上「只會增加資料」,
因此不要太怕出事,
東西都可輕鬆復原。

每個開發者的本機端都會有完整的程式庫,
都能獨立作業,
不受開發主線的拘束,
不需網路連線也能工作。

開始使用版本控制

內建了git 可以簡易的做Xcode的版本控制


在建立專案後有勾選使用 local Git,
只要一偵測檔案被修改,
馬上就可以在檔案名稱後 看到 "M" 的標記。


新增的檔案也會有 "A" 的標記。
選取檔案, 右鍵 選取 Souce Controll -> Commit Selected Files
填寫 Commit Message 後 送出。

之後就可以在編輯器中選 Show the Version Editor
比對兩版本的差異。


如果一開始沒有做版本控制呢?也ok~
1. 關閉Xcode
2. 開啟終端機視窗
3. 進入專案底下的根目錄資料夾
4. $ git init
5. $ git add .
6. $ git commit -a -m "Initial commit" (Possibly not necessary)
7. 再開一次Xcode,成功了!

刪除版本控制控管

那⋯怎麼刪除git控管呢?
根據stackOverflow論壇網民的回應
只要先將Xcode完整的關閉,
並在專案資料夾底下將隱藏檔.git資料夾刪除就可以了

查看所有的commit記錄

$git log --graph  --all

切換到特定版本

//建議Xcode先關閉
$git checkout commit編號前4碼
//再加上-f表示強制切換到指定版本

相關文章

1. Git版本控制的進階觀念
2. 在Dropbox上使用Git版本控制

[Android篇]使用CCLabelTTF換行會漏字(最後一個字不見)的問題

文章撰寫日期︰2013/03/20 10:35
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

針對CCLabelTTF設定setDimensions,
想要做到文字過長會自動換行的效果,
在IOS上能正常顯示,
Android上卻會被截掉每一行的最後一個字元的問題。

請參見下圖示意的題目的部份
畫面在IOS上的樣子
畫面在Android上的樣子
可以看到,
"一條尾巴"後面的"逗號"在Android上不見了

二、解決方法

與Cocos2dX開發人員詢問後,
發現此問題是2.0.x的一個bug,
已經在cocos2d-x 2.1.x獲得改善,
可參見它們的更新LOG #1610
Bug   #1610: fix a bug that CCLabelTTF will lost a character at the end of a line
 
解決方法是將cocos2d-x在Android上的一個類別
Cocos2dxBitmap.java line 298

while (pString.indexOf(i++) == ' ') {
 ;
}
改成
while (pString.indexOf(i) == ' ') {
          ++i;
}
記得,
cocos2dx/cocos2dx/platform/android/java/src/org/cocos2dx/lib/Cocos2dxBitmap.java也要改掉。

免得之後建立的新Android-Cocos2dx專案又遇到同樣的問題。

[Android篇]SQLite在Android無法讀取(返回錯誤碼14)的決解方案

文章撰寫日期︰2013/03/19 13:46
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在Xcode中,使用
sqlite3 *pDB = NULL;//資料庫指針

string  szResPath(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("millionschool.sqlite"));
sqlite3_open(szResPath.c_str(), &pDB);
就能順利將Resources資料夾下的millionschool.sqlite打開並使用。

但是,
Android卻無法這樣子打開,
返回了錯誤碼14

二、解決方法

經爬文後發現,
sqlite3 *pDB = NULL;//資料庫指針CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("millionschool.sqlite"));
這個取到的路徑在Android下會被壓縮,
無法正常存取。
解決方法只有將sqlite檔案複製至可存取的Android資料夾方可使用。
CCFileUtils::sharedFileUtils()->getWriteablePath();
此方法在Android底下會取到本機裡data\data\package_name\這個目錄,
於是我們將assets底下的sqlite複製到這邊來。
        sqlite3 *pDB = NULL;//資料庫指針
        char * errMsg = NULL;//錯誤訊息
        std::string sqlstr;//SQL指令
        int result;//sqlite3_exec返回值
        
        string  szResPath(CCFileUtils::sharedFileUtils()->fullPathFromRelativePath("millionschool.sqlite"));//IOS可以這樣用,但Android卻不行

        //取得Android可以使用的data\data\package_name資料夾
        string dbPath = CCFileUtils::sharedFileUtils()->getWriteablePath();
        dbPath.append("millionschool.sqlite");

        //將資料寫入串流
        unsigned long tmpSize;
        unsigned char* dbData = CCFileUtils::sharedFileUtils()->getFileData(szResPath.c_str(), "rb", &tmpSize);
        FILE *fp = fopen(dbPath.c_str(), "wb");
        fwrite(dbData, tmpSize, 1, fp);
        fclose(fp);

        //將資料庫打開來看看
        result = sqlite3_open(dbPath.c_str(), &pDB);
        
        if( result != SQLITE_OK ){
            CCLog( "打開資料庫失敗,錯誤碼:%d ,錯誤原因:%s\n" , result, errMsg );
        }else{
            CCLog( "打開資料庫成功!" );
        }
成功了! 讀到資料庫了!

[cocos2d-x篇]static member EXC_BAD_ACCESS

文章撰寫日期︰2013/03/18 10:46
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在Cocos2d-X裡希望將某個特定物件存放於static member裡,
以供日後實體成員使用,
但卻發生該static member EXC_BAD_ACCESS的問題。

二、解決方法

使用static member有幾個需要注意的新手事項︰

1.標頭檔(.h)裡要宣告靜態成員變數

static std::string question;
//宣告要使用一個string型別的question靜態成員變數

2.Body(.cpp)裡要初始化該成員變數

string GameScene::question;
/*如果沒有初始化,
會遇到
Undefined symbols for architecture armv7
的錯誤。*/

3.注意static member靜態成員變數的使用時機

有時候會發生在將某物件指針給static member,
卻造成static member為EXC_BAD_ACCESS的程式錯誤,
主要是欲被指派的指針物件可能都尚未初始化完成,
就將指針給了static member並做static member的存取,
如果注意程式建構的順序和時間,
掌握程式的呼吸方式,
基本上是不會有static member成為EXC_BAD_ACCESS的狀況的。

[cocos2d-x篇]'jni.h' file not found

文章攢寫時間︰2013/02/14 19:15
文章修改時間︰2013/03/09 15:32
文章修改次數︰2
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在編譯cross-platform時遇到'jni.h' file not found的錯誤。

二、解決辦法

由於Android lib要置入CocosDenshion\android才能跨系統透過JNI控制Android的音控,
將Xcode裡CocosDenshion\android資料夾移除Reference即可。

因為jni.h要在Android編譯時才會找到。


[IOS篇]Xcode cannot run using the selected device.錯誤

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

今天在運行Xcode時,遇到了一個Xcode cannot run using the selected device.的錯誤。


二、解決辦法

上網爬文,很多人都說是運行版本的設置不一致而產生該問題(見下圖)

但筆者在實際實作時,
發現是因為擅自更改專案相關目錄名稱造成的問題。

如果以上辦法無法改善,
建議直接將整個專案砍掉重新建置了。

[IOS篇]【iOS-cocos2d-X 游戏开发之一】在Mac下结合Xcode搭建Cocos2d-X开发环境&卸载Cocos2dx模版

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1
本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/599.html

2011-3-6更新:
今天大概说下关于cocos2d与cocos2d x的卸载方面的小提示,至于Cocos2d与Cocos2dX卸载基本网上都有相关文章,但是!今天说的是如何卸载Cocos2d在Xcode的模版;
卸载Cocos2d/X其实就是删除其相关文件即可,这个好说,但是模版这东西有些郁闷,因为其模版是被放置隐藏文件中了,所以我们想要删除必须先让你的mac显示隐藏文件才是关键!
首先打开你mac终端,然后输入如下命令:
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
或者
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles YES
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles NO
输入后回车即可,然后我们关闭终端。然后点击你mac桌面菜单的“小苹果”图标,选择“强制退出”菜单,然后选择“Finder”,然后点击“重新 启动”,OK。所有隐藏文件可以看到了。那么这里我把删除我电脑Xcode中的Cocos2d/Cocos2dX模版的路径放出:
/Users/Himi/Library/Developer/Xcode/Templates
对应文件夹路径如下:
Macintosh HD->用户->Himi(你的用户名)-> 资源库(隐藏的)->Developer->Xcode->Templates
OK,直接删除Templates(Xcode中的模版)中的cocos2d-x还是cocos2d文件夹即可!
———————————————————————-
从今天开始Himi将陆续更新cocos2d-X的博文,毕竟cocos2d-X的跨平台确实很有诱惑力,尤其是网龙公司的《91部落》手机网游更 让Himi有了深入cocos2dX的价值,另外一方面很多iOS游戏公司都已经转入cocos2dX的队列中了,所以今天Himi先来分享如何在Mac 系统下搭建cocos2d-X引擎吧;
首先到Cocos2d-X下载地址下载最新版,Himi下载的是cocos2d-1.0.1-x-0.9.2.zip此版本对于iOS5做了些兼容正好适合,那么可能随着时间推沿,童鞋们看到此篇的时候可能已经不是1.0.1是最新版了,那么这里Himi给出下载列表地址便于大家选择需要的版本,http://code.google.com/p/cocos2d-x/downloads/list
第一步:下载cocos2d-X的引擎包,上面已经给出地址了;
第二步:下载完成之后Himi将其放置到了“文稿”中;(点击Finder-点击左侧的“文稿”);
第三步:启动终端;(点击Finder-前往-实用工具-终端)
第四步:先利用命令进入当前的 “cd documents” 进入Documents文件夹,继续进入文件夹命令:“cd cocos2d-1.0.1-x-0.9.2”,然后“sudo ./install-templates-xcode.sh”命令开始执行安装命令,这时候会如下提示:
1
2
3
4
5
select the template version to install
3 for xcode3
4 for xcode4
input nothing for all
4
让选择对应你的Xcode的版本,对应选择后输入对应数字,然后回车即可安装完成~(Himi悲催,没看到这个直接回车默认给选择了3- . – 我郁闷,无所谓了呵呵~)
OK,下面新建一个项目,然后Xcode出现如下界面,看左侧一栏,多了一个cocos2d-x,如下图:


然后新建好的cocos2d-X项目如下:


直接运行吧,效果如下:


OK,搭建完成,完美运行的说,嘿嘿嘿,不早了,该准备睡觉了,晚安 各位童鞋~