Một số chú ý khi biên dịch project cocos2dx trên window

Người đăng: share-nhungdieuhay on Thứ Năm, 10 tháng 4, 2014

Hi mọi người!

Mình đã trở lại và bớt ăn hại hơn. Vì, sau 1 thời gian nghiên cứu mày mò, công việc tiến triển khá thuận lợi. Quả thật để sử dụng tốt được Engine dạng mã mở như thế này đã tiêu tốn của mình khá nhiều thời gian, công sức. Có sẵn code toturial rồi mà khi biên dịch còn lỗi tùm lum, tìm rất khổ. Mình tổng kết vào đây những lỗi phổ biến khi biên dịch để các bạn chú ý. Có lỗi nào là cập nhật ngay lỗi đó.

Vì mình làm trên Window nên build file trực tiếp trên ra file exe ( bắt buộc cài VS 2012 trở nên nhé). Không nên xài bản Express các bạn nhé. Crack đầy ra đấy, xài bản miễn phí Express làm gì.

Lệnh CMD

WIN
>cocos compile -s q:/android/myproject/test -p win32
>cocos run -s q:/android/myproject/test -p win32

Android
>cocos compile -s q:/android/myproject/test -p android --ap 1x 
( x từ 0 đến 9 - bắt buộc SDK Manager phải cài bản API 10 ) . --ap ( có 2 dấu ngang)

Lưu ý quan trọng

1 dự án Mẫu bao gồm 4 file cơ bản

AppDelegate.h
AppDelegate.cpp

HelloWorldScene.h
HelloWorldScene.cpp

1/ Cấu trúc file
Trong Window
và 1 file quan trọng là test.vcxproj theo đường dẫn Q:\ANDROID\MyProject\Test\proj.win32 mở và tìm AppDelegate hoặc HelloWorldScene. Bạn sẽ thấy tên 4 file cần để biên dịch nằm ở đây. Nếu thêm 1 file nào mới bạn phải add vào theo đúng cú pháp. nếu thừa hoặc thiếu 1 file nào đó trong này cũng sẽ báo lỗi.

Nếu bạn Build cho Android: Bạn cũng phải bổ sung thêm file mới vào file Android.mk nằm trong đường dẫn sau

ProjectName\proj.android\jni\Android.mk

Trong các file (.h) nên có dòng lệnh USING_NS_CC; ở dưới phần #include, để tránh một số lỗi ( điển hình là PhysicsContact.

2/ Số lưu ý về Function

contactListener->onContactBegin = CC_CALLBACK_1(GameScene::onContactBegin, this);

CC_CALLBACK_1 chứ ko phải là CC_CALLBACK_2

bool GameScene::onContactBegin(const PhysicsContact& contact)
chứ ko phải

bool GameScene::onContactBegin(EventCustom* event, const PhysicsContact& contact)


3/ Build Android

Bạn mở file Android.MK trong prj.android, thêm vào Class mới tạo như sau ( ví dụ file GameOverScene.cpp)









Chú ý dấu "\" ở dòng gần cuối cùng
Dòng cuối cùng ko cần dấu này

4/ Vòng lặp For cho Vector

vector<T> vec;
for(auto i : vec){} // Chuẩn C++ 11

5/ Phiên bản 3.1

Khi bạn download bản Cocos2d-x 3.1 mới nhất về, nếu build các Project cũ sẽ bị lỗi, nhiều lỗi là khác

Bạn cần phải tạo Project mới với v3.1, sau đó copy  Class+ Resource của Project cũ đè vào build là OK

6/ Build project trên Window, file chạy ở đâu?

Nhiều bạn hỏi mình build game trên win xong click ko chạy?

Đó là do các bạn build game trên win xong lại vào thư mục Proj.win32/Debug.win32 để chạy file Exe trong đó. Vâng, bạn có build 1000 lần thì cũng ko thể chạy nổi vì trong đó KHÔNG CÓ RESOURCE cho game nên Force Stop ngay

=> Các bạn phải vào thư mục PUBLISH ( ngang hàng Proj.win32, Class,.. ) đối với Engine 3.1, hoặc vào thư mục BIN ( cũng ngang hàng Proj.win32, Class,...) với Engine 3.0. Hãy nhớ kỹ!

7/ Chỉnh Độ phân giải (Resolution) trên Window

Khi bạn build ra Android, hoạc IOS, thì tỉ lệ khung hình ( độ phân giải - Resolution ) bạn chỉnh trong file AppDelegate.cpp ( game Sushi) rất dễ dàng. Tuy nhiên, và thường thì bạn sẽ build trên win trước để test game. vậy làm sao chỉnh độ phân giải??

Hãy làm như sau, tìm file CCGLView.cpp theo đường dẫn ( Nằm trong game nhé, không phải trong Engine)

YOURGAME\cocos2d\cocos\platform\desktop mở file CCGLView.cpp

search "960" sẽ thấy 1 dòng thế này ( dòng 288 thì phải )

if(ret && ret->initWithRect(viewName, Rect(0, 0, 960, 640), 1)) {

Đây chính là kích thước màn hình game trên Desktop, giờ thì chỉnh bao nhiêu tùy bạn thôi, tùy thuộc game ngang hay dọc mà chỉnh dài x rộng cho hợp lý.
Bạn chưa tin ư? Hãy nhìn, đã đủ 7 cột, 9 hàng chưa ( ở cuối bài 23 bạn build ra không đủ 7 cột, 9 hàng là do chưa chỉnh Resolution )


( Lại bảo ko đúng đi )

8/ Phân biệt các loại Macro CC_CALLBACK_x

Chắc có nhiều bạn từng thắc mắc cái dòng Macro ở trên vẫn hay dùng trong code nghĩa là gì, khi nào dùng phải không.

Xin trả lời: Mình thấy dùng trong mấy trường hợp sau đây

+ Trong menu để gọi tới hàm thực hiện khi nhấn 1 nút, ví dụ
    MenuItemFont *startNew = MenuItemFont::create("New Game", CC_CALLBACK_1(MenuLayer::onNewGame, this));

+ Trong đối tượng bắt sự kiện ( ví dụ Touch, Contact )
    contactListener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin, this);

+ Trong Action Sequence

asteroid->runAction(Sequence::create(
MoveBy::create(randDuration, Point( - winSize.width - asteroid->getContentSize().width, 0)), 
CallFuncN::create(CC_CALLBACK_1(HelloWorld::setInvisible,this)), 
NULL
));   

Vậy dùng khi nào, ý nghĩa của các số 1,2

Thật ra có 4 Macro CC_CALLBACK_0, CC_CALLBACK_1, CC_CALLBACK_2, CC_CALLBACK_3

Số 0,1,2,3 chính là số tham số truyền vào của hàm được gọi.

Ví dụ hàm setInvisible(float af) thì khi gọi phải dùng CC_CALLBACK_1 ( vì có 1 tham số )

setInvisible(float af, int b)  thì khi gọi phải dùng CC_CALLBACK_2 ( vì có 2 tham số )

tương tự các trường hợp còn lại, và không có thấy CC_CALLBACK_4 à


Update thêm nhiều lắm!

Chúc các bạn sẽ có nhiều game hay!


{ 0 nhận xét... read them below or add one }

Đăng nhận xét