Thursday, April 10, 2014

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

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!


12 comments:

  1. Bạn làm ơn cho mình hỏi, khi mình build thử cocos2d-x v3.1 nền win32 thì làm sao để chỉnh được resolution cho khung hình chuẩn dạng dọc hoặc ngang? Nó chỉ toàn chạy 1 khung 800x600 rất khó coi. Mình code trên windows7 Visual Studio 2012 với cocos2d-x v3.1

    ReplyDelete
  2. Ko phải 800x600 mà chính xác là 960x640px

    Bạn chỉnh như thế này

    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 rộng cho hợp lý.

    ReplyDelete
  3. Cám ơn bạn nhiều nhé nhưng mình đã tự tìm được giải pháp rồi, đơn giản lắm chỉ cần thêm 3 dòng code sau vào trontg hàm AppDelegate::applicationDidFinishLaunching của file AppDelegate.cpp là được:

    // Đặt khung cho cửa sổ test của winform là 640x1136
    glview->setFrameSize(640, 1136);

    // Đặt phân giải cho giao diện hiển thị khít với khung hình 640x1136
    glview->setDesignResolutionSize(640, 1136, ResolutionPolicy::EXACT_FIT);

    // Dòng này để fix lỗi hiển thị khung hình mặc định bị zoom2x trên winform
    glview->setFrameZoomFactor(0.5f);

    ReplyDelete
    Replies
    1. Ô, ngon, giờ mới biết, kể ra xài Visual + Visual Assist X, khi gõ đối tượng glview nó sẽ ra mấy hàm này, quên mất, làm mày mò trong file

      Delete
  4. Cho mình hỏi chút ,mình dùng eclipse trong ADT để lập trình game trên mobile , mình chọn engine là cocos2d-x-3.0 , khi tạo project mới thì các folder trong project như : classes, cocos2dx, extensions có hiện dấu chấm cảm . Điều này có ảnh hưởng gì không .
    P/S : mình có thể có kênh liên lạc khác với bạn để trao đổi được không ? Mình là sinh viên năm tư đang đam mê và tự mày mò (100%) mọi thứ :(

    ReplyDelete
    Replies
    1. Cho mình link ảnh được ko? Mình ít xài Eclipse, toàn chơi VS

      + Bạn có build bằng Eclipse được không ( chú ý đường dẫn JDK, NDK trong Eclipse) nếu build được thì không vấn đề gì cả.

      Delete
  5. --ap 1x cái này điền số thế nào vậy ạ ?nó dựa theo cái gì để điền vậy?

    ReplyDelete
    Replies
    1. 1x 2x là số phiên bản Android đó bạn

      Android 4 thì là 19,

      sau này là 20, 21, 22, 23

      Delete
  6. Đâu phải, mình ko quan tâm lắm đến cái đuôi mk, dùng Notepad ++ đọc được là được rồi

    ReplyDelete
  7. anh ơi em bị lỗi tiếng việt khi làm game cocos trên Visual studio 2015 , anh biết cách sửa không chỉ em với

    ReplyDelete
  8. cho hỏi e build ra andori rồi nhưng bị lỗi ứng dụng thông báo bản cập nhật mới, hoặc để game đã tạm ngừng fix như thế nào ạ

    ReplyDelete
  9. mình xin link facebook để tiện trao đổi được không bạn ?

    ReplyDelete