Ở đây chỉ có 2 loại ngôn ngữ: 1 là người phàn nàn và 1 là người không ai sử dụng. Edsger W. Dijkstra
STDIO Tiếp tục chuỗi bài viết về hướng dẫn làm game, trong bài viết này tôi sẽ hướng dẫn cách tạo kích thước màn hình trong game, hiện thực lại position manager để quản lý các đối tượng trong game, tạo file lưu trữ các definition, constant.
Nội dung bài viết

Giới thiệu

Bạn đã đọc qua các bài viết về cocos2d-x của STDIO, bạn muốn thử viết một game hoàn chỉnh nhưng chưa biết nên bắt đầu từ đâu? Thông qua chuỗi bài viết về hướng dẫn làm game, tôi sẽ hướng dẫn các bạn hiện thực lại game ZERO một cách đơn giản. Hy vọng rằng, qua đó sẽ giúp bạn làm quen cách để hoàn thành một game, cũng như cách tổ chức project trong game.

Tiếp tục chuỗi bài viết về hướng dẫn làm game, trong bài viết này tôi sẽ hướng dẫn cách tạo kích thước màn hình trong game, hiện thực lại position manager để quản lý các đối tượng trong game.

Tiền đề bài viết

Sau khi hoàn thành khoá học phát triển games tại STDIO, được sự cho phép của anh La Kiến Vinh, tôi quyết định chia sẻ lại các kiến thức, cũng như kinh nghiệm tôi học được cho cộng đồng.

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

Bài viết hướng đến các đối tượng đã nắm qua một số kiến thức cơ bản của cocos2d-x.

Hiện thực

Trước khi hiện thực, ta tạo thêm một file config.h. Đây sẽ là nơi để lưu trữ toàn bộ các definition cũng như các constants trong game của bạn. Dưới đây là một số constants cần thiết trong bài viết này.

#ifndef __CONFIG_H__
#define __CONFIG_H__

static const float      SCREEN_DESIGN_WIDTH     = 1080.0f;
static const float      SCREEN_DESIGN_HEIGHT    = 1920.0f;

static const char *PATH_CONF_POS = "conf_objects_pos.plist";
#endif // __CONFIG_H__

Ở đây tôi chọn kích thước màn hình là 1080x1920 là vì toàn bộ resource tôi được STDIO PLAY cung cấp cho tôi hoàn thành chuỗi bài viết này đều được thiết kế với kích thước trên. Tuy nhiên bạn cũng không cần lo lắng rằng khi phải build qua một nền tảng khác nó sẽ ảnh hưởng đến game của bạn. Điều này tôi sẽ giải thích bên dưới.

Thiết kế lại kích thước màn hình

Để thiết kế lại kích thước màn hình cho game. Vào AppDelegate.cpp, trong hàm applicationDidFinishLaunching ta thêm một ít đoạn code như sau:

bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLViewImpl::create("ZERO");
        director->setOpenGLView(glview);
		glview->setFrameSize(SCREEN_DESIGN_WIDTH * 0.3, SCREEN_DESIGN_HEIGHT * 0.3);
    }

	glview->setDesignResolutionSize(SCREEN_DESIGN_WIDTH, SCREEN_DESIGN_HEIGHT, ResolutionPolicy::NO_BORDER);

    // turn on display FPS
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object
    auto scene = LoadScene::createScene();

    // run
    director->runWithScene(scene);

    return true;
}

Ở đoạn code trên có 2 dòng code mà tôi thêm vào đó là dòng 8 và dòng 11.

Dòng 8: Đây chính là kích thước màn hình trong game.

Dòng 11: Set lại kích thước resource trong game theo kích thước màn hình mà bạn truyền vào, ở đây là 1080x1920. Khi thay đổi lại kích thước màn hình thì cocos2d-x sẽ hỗ trợ resource tự canh theo. Làm cho hình ảnh không bị nhỏ lại khi build qua màn hình lớn hơn và ngược lại.

Position manager

Để biết thêm chi tiết về position manager cũng như lý do vì sao tôi lại dùng nó bạn vui lòng đọc bài viết Quản Lý Vị Trí Của Các Đối Tượng Trong Cocos2d-x ::  www.stdio.vn/articles/read/213-quan-ly-vi-tri-cua-cac-doi-tuong-trong-cocos2d-x.

File PositionManager.h

#ifndef __POSITION_MANAGER_H__
#define __POSITION_MANAGER_H__

#include "cocos2d.h"
USING_NS_CC;

class PositionManager
{
public:
	PositionManager();
	~PositionManager();

	static PositionManager* getInstance();

	void		loadObjectsPosition(const char* pListPath);
	Vec2		getObjectPosition(const String* object_position);

	Vec2		_title;
	Vec2		_play_btn;
	Vec2		_board;

private:
	static PositionManager* _instance;
};


#endif // __POSITION_MANAGER_H__

File PositionManager.cpp

#include "cocos2d.h"
#include <vector>

#include "Config.h"
#include "PositionManager.h"
USING_NS_CC;

PositionManager::PositionManager()
{

}

PositionManager::~PositionManager()
{

}

PositionManager* PositionManager::_instance = 0;
PositionManager* PositionManager::getInstance()
{
	if (!_instance)
		_instance = new PositionManager();

	return _instance;
}

void PositionManager::loadObjectsPosition(const char* pListPath)
{
	Dictionary* object_list_position = Dictionary::createWithContentsOfFile(pListPath);

	// get board position
	const String* board_pos_str = object_list_position->valueForKey("board");
	PositionManager::getInstance()->_board = getObjectPosition(board_pos_str);
	// get play button position
	const String* play_btn_pos_str = object_list_position->valueForKey("play_button");
	PositionManager::getInstance()->_play_btn = getObjectPosition(play_btn_pos_str);
	// get title position
	const String* title_pos_str = object_list_position->valueForKey("title");
	PositionManager::getInstance()->_title = getObjectPosition(title_pos_str);
}

Vec2 PositionManager::getObjectPosition(const String* object_position)
{
	Vec2 position;

	int value = 0;
	for (size_t i = 0; i < object_position->_string.length(); i++)
	{
		if (object_position->_string[i] != ',')
		{
			value *= 10;
			value += object_position->_string[i] - '0';
		}
		else
		{
			position.x = value;
			value = 0;
		}
	}

	position.y = value;
	return position;
}

Lưu ý: Trong PositionManager trên tôi chỉ mới hiện thực 3 đối tượng. Khi cần làm sẽ thêm vào các đối tượng khác nữa.

Vào file LoadScene.cpp, trong hàm update thêm vào đoạn code mới để được như sau:

void LoadScene::update(float dt)
{
	switch (m_loadingStep)
	{
		// Load sprite
	case 0:
		SpriteFrameCache::getInstance()->addSpriteFramesWithFile("spr_sheet_zero.plist",
																 "spr_sheet_zero.png");
		break;
		// Load position
	case 1:
		PositionManager::getInstance()->loadObjectsPosition(PATH_CONF_POS);
		break;
		// Load sounds
	case 2:
		break;
	case 3:
		Director::getInstance()->replaceScene(MainMenuScene::createScene());
		break;
	}
	m_loadingStep++;
}

Download

CLASSES.ZIP

RESOURCES.ZIP

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG