Search…

Giới Thiệu về Scene trong Cocos2d-x 3.x.x

29/09/20204 min read
Tìm hiểu về Scene và các thao tác trong Cocos2d-x 3.x.x.

Scene là gì?

Scene là một cảnh game chứa đựng những Sprites, Lables, Nodes và tất cả các đối tượng khác mà trò chơi cần. Có trách nhiệm điều hành logic của trò chơi, Render lên Screen (màn hình hiển thị) các nội dụng cần thiết cho từng Scene đã thiết kế. Cần ít nhất một Scene để bắt đầu trò chơi. Một game có thể có rất nhiều Scene nhưng trong một thời điểm nhất định chỉ có một Scene được hoạt động.

Khởi tạo Scene

// www.stdio.vn
// Khởi tạo Screne có tên là gameScene.
Auto gameScene= Scene::create();

Ví dụ về Scene

Cocos2d-x sử dụng hệ tọa độ Oxy với gốc tọa độ O(0,0) nằm tại góc bên trái phía dưới Screen. Vì vậy, khi thiết kế các thành phần của Scene nên chú ý tới điều này để sao cho thiết lập vị trí của các các thành phần trong game phù hợp.

Để thêm một Sprite, Label hay một đối tượng vào Scene thì sử dụng phương thức addChild() API.

// www.stdio.vn
// www.stdio.vn/users/index/11/truong-dat
// Khởi tạo một Scene có tên là gameScene.
auto gameScene = Scene::create();

// Lấy kích thước của màn hình.
// Với mỗi Platform thì sẽ có kích thước màn hình khác nhau, khi trò chơi được build 
// qua nhiều nền tảng không thể áp dụng kích thước "cứng" của một số thiết bị nào đó. 
// Việc lấy kích thước màn hình sẽ giúp có thể thiết lập vị trí với các platform khác.
Size visibleSize = Director::getInstance()->getVisibleSize();

// Khởi tạo Sprite.
// Sprite boar.
auto board = Sprite::create("spr_board.png");
board->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
board->setScale(0.5);
gameScene->addChild(board, 1);

// Sprite title zero
auto titleZero = Sprite::create("spr_title_zero.png");
titleZero->setPosition(Point(board->getPositionX(), 
                       board->getPositionY() + board->getContentSize().height/8));
titleZero->setScale(0.5);
gameScene->addChild(titleZero , 1);

// Menu.
// Menu item play button.
auto playButton = MenuItem::create("spr_btn_play.png", "spr_btn_play_press.png",
                                   CC_CALLBACK_1(MenuGame::playGameCallback, this)));
playButton->setPosition(Point(board->getPositionX(),
                        board->getPositionY() - board->getContentSize().height / 8));
playButton->setScale(0.5);

// Menu item training.
auto trainingButton = MenuItem::create("spr_btn_training.png", "spr_btn_training_press.png ",
                                      CC_CALLBACK_1(MenuGame::trainingGameCallback, this)));
trainingButton->setPosition(Point(board->getPositionX() + board->getContentSize().width / 8,
                            board->getPositionY() + board->getContentSize().height / 4));
trainingButton->setScale(0.5);
 
// Menu item about.
auto aboutButton = MenuItem::create("spr_btn_about.png", "spr_btn_about_press.png ",
                                      CC_CALLBACK_1(MenuGame::aboutGameCallback, this)));
aboutButton->setPosition(Point(board->getPositionX() + board->getContentSize().width / 8 + trainingButton->getContentSize().width/2,
                         board->getPositionY() + board->getContentSize().height / 4));
aboutButton->setScale(0.5);

// Khởi tạo Menu.
auto menu = Menu::create(playButton, trainingButton, aboutButton, NULL);
// Thêm menu vào Scene hiện tại.
gameMenu->addChild(menu, 1);

Ở đoạn code trên hiện thực lại Scene Menu Game của game Zero.

Scene Graph

Là một cấu trúc dữ liệu để sắp xếp những đối tượng cần có trên Scene. Đây là một điều quan trọng vì cần phải chắc chắn rằng kết quả nhận được thỏa mãn với mục đích khi thiết kế game.

Dưới đây là Scene Graph của mục Ví dụ về Scene.

Một số cách chuyển đổi giữa các Scene

runWithScene 

Được sử dụng cho Scene đầu tiên trong game.

// runWithScene.
Director::getInstance()->runWithScene(gameScene);

replaceScene 

Đối với các Scene còn lại (Ngoại trừ Scene đầu tiên ra) thì dùng phương thức replace để thay thế Scene mới cho Scene hiện tại.

Khi thay thế một scene bằng một Scene khác, các Scene mới được load vào RAM trước khi Scene cũ được giải phóng. Vì vậy việc chuyển đổi giữa các Scene dễ bị crash liên quan tới việc không đủ bộ nhớ. Nên kiểm tra thường xuyên việc thay đổi giữa các Scene khi game cần nhiều bộ nhớ.

// replaceScene.
Director::getInstance()->replaceScene(gameScene);

pushScene và popScene

Scene cũ được thay bằng Scene mới mà không phải giải phóng Scene cũ ra khởi bộ nhớ.

Ưu điểm

Việc chuyển sang Scene mới sẽ nhanh hơn do không phải khởi tạo lại vùng nhớ cho Scene mới và giải phóng vùng nhớ Scene cũ.

Nhược điểm

Chiếm một lượng lớn RAM và có thể làm cho game bị crash. Phải nhớ chính xác có bao nhiêu Scene để việc pushSence popScene sao cho phù hợp với mục đích chính.

Nên dùng PushScene và PopScene lúc nào?

Giả sử game hiện tại Scene đang chạy là Scene Play, muốn game chuyển sang Scene Pause và không thay đổi đến trạng thái hiện tại của trò chơi. Lúc này sẽ sử dụng pushScene để chuyển sang Scene Pause và dùng popScene để chuyển sang Scene Play. Một điều phải luôn nhớ là phải đủ bộ nhớ để cùng lúc chứa 2 Scene và tránh làm dụng pushScenepopScene.

// pushScene.
Director::getInstance()->pushScene(gameScene);

// popScene.
Director::getInstance()->popScene(gameScene);

Hiệu ứng chuyển Scene

Cocos2d-x còn cung cấp những hiệu ứng chuyển Scene. Điều này có thể giúp game đẹp và bắt mắt hơn. Nhưng cũng cần chú ý rằng không nên làm dụng các hiệu ứng nhất là các hiệu ứng cần nhiều thời gian vì rất dễ gây cho người chơi có cảm giác khó chịu.

// Khởi tạo một Scene có tên là gameScene.
auto gameScene = Scene::create();

// Hiệu ứng chuyển Scene Transition Fade.
Director::getInstance()->replaceScene(TransitionFade::create(0.5, gameScene, Color3B(0,255,255)));

// Hiệu ứng chuyển Scene FlipX
Director::getInstance()->replaceScene(TransitionFlipX::create(2, gameScene));

// Hiệu ứng chuyển Scene Transition Slide In
Director::getInstance()->replaceScene(TransitionSlideInT::create(1, gameScene) );

Tham khảo

http://www.cocos2d-x.org

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024