STDIO
Tìm kiếm gần đây

    Nội dung

    Thành Phần Hoá Các Đối Tượng Trong Game Với Cocos2d-x

    Rye Nguyen

    11/08/2015
    Thành Phần Hoá Các Đối Tượng Trong Game Với Cocos2d-x
    Trong quá trình phát triển ứng dụng, việc phát sinh ra lỗi ở một thành phần nào đó trong ứng dụng là điều không thể tránh khỏi. Dự án càng lớn, khả năng phát hiện lỗi càng thấp và chi phí cần sử dụng để giải quyết vấn đề càng lớn. Do đó, chúng ta nên quản lý dự án thành các thành phần riêng biệt.

    Giới thiệu

    Trong lập trình game, và điều này đúng cho nhiều lĩnh vực khác, việc gom nhóm các đối tượng để thực hiện từng chức năng riêng biệt là rất cần thiết. Việc phân chia các đối tượng và xử lý riêng biệt theo chức năng không chỉ giúp mã nguồn đỡ phức tạp mà còn tối ưu cho giai đoạn bảo trì sản phẩm sau này. Nắm bắt tư tưởng đó, tôi và các anh em trong nhóm tái phát triển dự án Sins đã áp dụng phương pháp này trong sản phẩm. Bài viết này nhằm chia sẻ một chút về phương pháp lập trình này và cách hiện thực nó trong Cocos2d-x.

    Tiền đề bài viết

    STDIO Games đã định hướng tư tưởng cho tôi về phương pháp Lập trình Hướng thành phần (Component-base Programming). Dự án Sins là dự án thực tế đầu tiên mà tôi có cơ hội sử dụng phương pháp này để phát triển, và việc này đã mang lại hiệu quả nhất định cho đến thời điểm này.

    STDIO là sự chia sẻ, do đó tôi thực hiện bài viết này nhằm chia sẻ những điều đọng lại với tôi trong suốt quá trình thực hiện dự án. Bài viết này còn là lời cảm ơn đến nhóm phát triển dự án Sins đã mang đến một sản phẩm chất lượng và sâu sắc.

    Đối tượng hướng đến

    Bài viết dành riêng cho các lập trình viên đã có kinh nghiệm với Cocos2d-x và có tư tưởng lập trình tốt.

    Tham khảo: Giới Thiệu Về Component-base Development.

    Tư tưởng thành phần hoá

    Trong quá trình phát triển ứng dụng, việc phát sinh ra lỗi ở một thành phần nào đó trong ứng dụng là điều không thể tránh khỏi. Dự án càng lớn, việc phát hiện lỗi và chi phí cần sử dụng càng trở nên phức tạp hơn. Do đó, chúng ta nên quản lý dự án thành các thành phần riêng biệt.

    Trong thực tế, đối với Project Sins, chúng tôi phân chia Scene Gameplay thành các thành phần chính như sau:

    • Background: Hình ảnh nền của game. Background trong Sins bao gồm một bức ảnh tĩnh cùng với một số hiệu ứng đặc biệt.
    • Sidebar: Cột hiển thị thông tin bên trái của màn hình. Tại đây quản lý các thông số về Score, Highscore và một số button tuỳ chỉnh khác.
    • Gameboard:  Khu vực chơi chính của game, quản lý các Sin, các hiệu ứng của Sin và hiệu ứng khác.

    Ngoài ra còn có các component hỗ trợ như Popup, Notification, … với những chức năng riêng biệt mà tôi không đề cập đến trong bài viết này.

    Với cách hiện thực này, các chức năng sẽ được gom nhóm lại để phát triển riêng biệt. Các thành viên trong nhóm phát triển sẽ hiếm gặp tình trạng xung đột do nhiều người cùng thực hiện một công việc giống nhau. Mặt khác, khi cần bổ sung một chức năng nào đó, chẳng hạn như thêm một hiệu ứng vào background, ta sẽ dễ dàng nhận biết vị trí hiện thực của chức năng đó.

    Hiện thực trong Cocos2d-x

    Phần hiện thực tôi chỉ nêu ra một số điểm cần lưu ý khi sử dụng phương pháp này trong Cocos2d-x. Chi tiết các bạn vui lòng tham khảo project demo đính kèm bên dưới.

    Lớp SceneGamePlay của Project Sins được hiện thực như sau:

    class SceneGamePlay : public SceneBase
    {
    public:
           static cocos2d::Scene* createScene();
    
           virtual bool init();
           virtual void onExit();
    
           CREATE_FUNC(SceneGamePlay);
    protected:
    private:
           Sidebar*                     m_sidebar;
           Background*                  m_background;
           GameBoard*				    m_gameboard;
    };

    Scene này bao gồm ba component chính là Sidebar, Background và GameBoard. Mỗi component là một node riêng biệt kế thừa từ Node của Cocos2d-x. Hiện thực các component này như sau:

    class Background : public Node
    {
    public:
           virtual bool init();
           virtual void onExit();
    
           CREATE_FUNC(Background);
    protected:
           Sprite*                    m_background;
           NodeGrid*                  m_gridNodeTarget;
    
           Size                       m_visibleSize;
           Point                      m_origin;
    private:
    };
    class Sidebar : public Node
    {
    public:
           virtual bool init();
           virtual void onExit();
    
           CREATE_FUNC(Sidebar);
    protected:
           Sprite*                    m_title;
           Sprite*                    m_background;
    };
    class GameBoard : public Node
    {
    public:
    	virtual bool init();
    	virtual void onExit();
    
    	CREATE_FUNC(GameBoard);
    protected:
    	Sprite*			m_gameboard;
    };

    Không quá đi sâu vào phần hiện thực, việc sử dụng các component này rất đơn giản. Trong SceneGamePlay.cpp, tôi khởi tạo các component này bằng phương thức create() và addChild vào scene theo các lớp tương ứng:

    m_background = Background::create();
    this->addChild(m_background, Z_BACKGROUND);
    
    m_sidebar = Sidebar::create();
    this->addChild(m_sidebar, Z_SIDEBAR);
    
    m_gameboard = GameBoard::create();
    this->addChild(m_gameboard, Z_GAMEBOARD);
    

    Đối với các thành phần riêng trong game của bạn, thao tác thực hiện cũng tương tự theo các bước:

    • Khởi tạo component kế thừa từ Node.
    • Cài đặt các phương thức create(), init(), onExit() và các phương thức cần thiết khác.
    • Sử dụng như một đối tượng bình thường, sử dụng thao tác addChild vào đối tượng khác để hiển thị và xử lý cho đối tượng đó.

    Download Demo

    Project Demo dưới đây là các thư mục Classes và Resources trong một project Cocos2d-x. Bạn vui lòng khởi tạo project Cocos2d-x trên Windows trước và thay thế 2 folder tương ứng trong Demo. Tham khảo bài viết Cài Đặt Cocos2d-x Và Khởi Tạo Project Trên Windows của tác giả Nguyễn Minh Hiếu.

    ProjectDemo.zip.

    Thảo luận

    Đăng nhập

    Bài viết liên quan

    UI - Phần 2: Thiết Kế UI Trong Cocos2d-x 3.x.x

    UI - Phần 2: Thiết Kế UI Trong Cocos2d-x 3.x.x

    Ở bài viết UI Phần I: Khái Niệm Và Một Số Đối Tượng Để Thiết Kế UI Trong Cocos2d-x 3.x.x, tôi đã giới thiệu cho các bạn UI là gì? Các thành phần của UI,… và đối tượng ...

    Trương Xuân Đạt

    23/01/2015

    UI - Phần 1: Khái Niệm Và Một Số Đối Tượng Để Thiết Kế UI Trong Cocos2d-x 3.x.x

    UI - Phần 1: Khái Niệm Và Một Số Đối Tượng Để Thiết Kế UI Trong Cocos2d-x 3.x.x

    UI không chỉ có phục vụ trong ngành công nghiệp game mà còn phục vụ cho rất nhiều ngành công nghiệp khác. Một game có một UI và một ý tưởng tốt sẽ rất hấp dẫn người chơi. ...

    Trương Xuân Đạt

    23/01/2015

    Quản Lý Vị Trí Của Các Đối Tượng Trong Cocos2d-x

    Quản Lý Vị Trí Của Các Đối Tượng Trong Cocos2d-x

    Trong lập trình game, việc xử lý “cứng” các đối tượng là điều nên tránh. Khi đem sản phẩm lên một màn hình có tỉ lệ khác, vị trí các đối tượng có thể sẽ không còn được ...

    Rye Nguyen

    04/08/2015

    Giới Thiệu Audio Trong Cocos2d-x 3.x.x

    Giới Thiệu Audio Trong Cocos2d-x 3.x.x

    Giới thiệu về đối tượng Simple Audio Engine trong cocos2d-x 3.x.x. Các khái niệm cơ bản về audio trong game với cocos2d-x: back ground music, sound effect. Các thao tác ...

    Trương Xuân Đạt

    23/01/2015

    Socket.IO Với Cocos2d-x

    Socket.IO Với Cocos2d-x

    Trong các bài viết trước trong chương trình tự học lập trình games với Cocos2d-x của STDIO. Tôi và các tác giả khác đã giới thiệu các khái niệm, ví dụ về các thành phần ...

    Lê Viết Duy

    11/06/2017

    Giới Thiệu Về Sprite Trong Cocos2d-x 3.x.x

    Giới Thiệu Về Sprite Trong Cocos2d-x 3.x.x

    Giới thiệu tổng quan về khái niệm cơ bản, một số cách dùng để khởi tạo một sprite, các thuộc tính của sprite và cũng như các thao tác cơ bản với các thuộc tính của sprite ...

    Trương Xuân Đạt

    23/01/2015

    Quản Lý Vị Trí Các Đối Tượng Trong Game

    Quản Lý Vị Trí Các Đối Tượng Trong Game

    Thông thường khi khởi tạo một đối tượng trong game, các lập trình viên đều khởi tạo một vị trí nào đó cho chúng. Điều đó có nghĩa là các đối tượng luôn tồn tại trong game ...

    Ryan Lê

    30/03/2015

    Xử Lý Đa Ngôn Ngữ Trong Game Với Cocos2d-x

    Xử Lý Đa Ngôn Ngữ Trong Game Với Cocos2d-x

    Hầu hết các game hiện nay trên thế giới đều chọn tiếng Anh làm ngôn ngữ chính bởi tính phổ biến của nó. Tuy nhiên, điều gì sẽ xảy ra nếu đối tượng chơi game không hề biết ...

    Ryan Lê

    29/03/2015

    Tạo Tilemap Trong Cocos2d-x 3.x.x

    Tạo Tilemap Trong Cocos2d-x 3.x.x

    Bài viết nằm trong loạt bài viết chương trình Tự Học Cocos2d-x 3.x của Stdio.vn. Trong bài viết này sẽ giới thiệu khái niệm, các thành phần, cách tạo một bản đồ với phần ...

    Trương Xuân Đạt

    23/01/2015

    Trí Tuệ Nhân Tạo Trong Games - Phần 1: Thiết Kế AI Với FSM

    Trí Tuệ Nhân Tạo Trong Games - Phần 1: Thiết Kế AI Với FSM

    Giới thiệu về khái niệm, vai trò của trí tuệ nhân tạo trong games. Giới thiệu về FSM, sơ đồ, các thành phần cơ bản. Hiện thực một AI đơn giản được thiết kế với FSM. Ví dụ ...

    Trương Xuân Đạt

    23/01/2015

    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
    [email protected]

    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 - 2020