STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ

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

    Tìm hiểu về Scene và các thao tác trong Cocos2d-x 3.x.x.
    23/01/2015 29/09/2020 4 phút đọc
    Giới Thiệu về Scene 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

    0 Bình luận
    Lập Trình Game

    Lập Trình Game

    Kiến thức, kỹ thuật, kinh nghiệm lập trình game.

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021