构建工程
游戏名称 game
发布路径 ./build
模板选择 default
宽高 1920*1080
构建选项按需设置
在 Cocos Creator
中点击构建即可生成编译工程
替换图标
将准备好的图标(game.ico)文件复制构建出来的工程里,替换掉Cocos Creator默认图标
路径:build/jsb-default/frameworks/runtime-src/proj.win32/res
修改编译出来的可执行文件信息
使用 Visual Studio 2017
打开 build/jsb-default/frameworks/runtime-src/proj.win32/game.sln
工程
如果无法打开请参考 Cocos Creator 文档 检查是否安装正确 文档地址
打开后找到解决方案中的 game/resource
展开
双击 game.rc
打开资源视图
修改 Icon/"GLFW_ICON"
的 Language
属性为 中文(简体, 中国)
修改 Version/VS_VERSION_INFO
的 Language
属性为 中文(简体, 中国)
双击 VS_VERSION_INFO
打开后按需修改里面的键值信息
修改窗口标题
回到解决方案修改 game/Classes/AppDelegate.cpp
文件
声明编码模式为 utf-8
#pragma execution_character_set("utf-8")
按需修改标题
示例:
#include "AppDelegate.h"
#include "cocos2d.h"
#include "cocos/scripting/js-bindings/manual/jsb_module_register.hpp"
#include "cocos/scripting/js-bindings/manual/jsb_global.h"
#include "cocos/scripting/js-bindings/jswrapper/SeApi.h"
#include "cocos/scripting/js-bindings/event/EventDispatcher.h"
#include "cocos/scripting/js-bindings/manual/jsb_classtype.hpp"
#pragma execution_character_set("utf-8")
USING_NS_CC;
AppDelegate::AppDelegate(int width, int height) : Application("你的标题", width, height)
{
}
AppDelegate::~AppDelegate()
{
}
游戏全屏
修改 libcocos2d/CCGLView-desktop.cpp
替换:
_mainWindow = glfwCreateWindow(screen_width, screen_height, name.c_str(), _monitor, nullptr);
为:
const GLFWvidmode* mode = glfwGetVideoMode(glfwGetPrimaryMonitor());
int screen_width = mode->width;
int screen_height = mode->height;
// _mainWindow = glfwCreateWindow(1920, 1080, name.c_str(), glfwGetPrimaryMonitor(), nullptr);
_mainWindow = glfwCreateWindow(screen_width, screen_height, name.c_str(), glfwGetPrimaryMonitor(), nullptr);
// _mainWindow = glfwCreateWindow(screen_width, screen_height, name.c_str(), _monitor, nullptr);
修改 game/win32/main.cpp
替换:
AppDelegate app(WINDOWS_WIN_SIZE_WIDTH, WINDOWS_WIN_SIZE_HEIGHT);
为:
//以下的cx,cy不通用,在设置了win10的屏幕缩放之后,下面2个参数是缩放之后的分辨率,不是原始的分辨率(物理宽度与高度)
//int cx = GetSystemMetrics(SM_CXSCREEN);
//int cy = GetSystemMetrics(SM_CYSCREEN);
HWND hWnd = GetDesktopWindow();
HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
// 获取监视器逻辑宽度与高度
MONITORINFOEX miex;
miex.cbSize = sizeof(miex);
GetMonitorInfo(hMonitor, &miex);
int cxLogical = (miex.rcMonitor.right - miex.rcMonitor.left);
int cyLogical = (miex.rcMonitor.bottom - miex.rcMonitor.top);
// 获取监视器物理宽度与高度
DEVMODE dm;
dm.dmSize = sizeof(dm);
dm.dmDriverExtra = 0;
EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &dm);
int cxPhysical = dm.dmPelsWidth;
int cyPhysical = dm.dmPelsHeight;
// 缩放比例计算 实际上使用任何一个即可
// double horzScale = ((double)cxPhysical / (double)cxLogical);
// double vertScale = ((double)cyPhysical / (double)cyLogical);
AppDelegate app(cxPhysical, cyPhysical);
// AppDelegate app(WINDOWS_WIN_SIZE_WIDTH, WINDOWS_WIN_SIZE_HEIGHT);
以防万一也修改下 game/Classes/NativeConfig.h
文件中的 MACOS_WIN_SIZE_WIDTH
和 MACOS_WIN_SIZE_HEIGHT
分别为 1920
和 1080
防止多开
在 game/win32/main.cpp
中的部分代码改为:
#include "main.h"
#include "AppDelegate.h"
#include "NativeConfig.h"
USING_NS_CC;
HANDLE g_hEvent;
// uncomment below line, open debug console
// #define USE_WIN32_CONSOLE
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
g_hEvent = CreateEventW(NULL, 0, 0, LPCWSTR("起个名字建议是游戏英文名"));
SetEvent(g_hEvent);
if (g_hEvent)
{
if (ERROR_ALREADY_EXISTS == GetLastError()) {
return 0;
}
}
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
集成Steamworks SDK
下载 Steamworks SDK
将下载好的 Steamworks SDK
解压到 build\jsb-default\frameworks\runtime-src
目录
文件夹名应该是
sdk
打开 build\cocos2d_headers.props
文件
在
$(MSBuildThisFileDirectory)..\
下面添加如下配置:
$(SolutionDir)..\sdk\public\steam
这里是添加一个
路径宏
我在Visual Studio
里没找到在哪配置 所以直接改的配置文件
右键解决方案中的 game
选择 属性
找到 配置属性 -> C/C++ -> 常规
点击 附加包含目录
的编辑 添加 Steamworks SDK
的 public\steam
文件夹中的文件到工程中
内容如下:
$(SteamPublicRoot)
如果
libcocos2d
中需要调用Steamworks API
的话也要添加下附加包含目录
配置
因为上面已经定义好了
路径宏
所以直接使用就可以了
然后找到 配置属性 -> 连接器 -> 输入
点击 附加依赖项
的编辑 添加 Steamworks SDK
的 steam_api.lib
到附加依赖项中
内容如下:
steam_api.lib
将 Steamworks SDK
的 redistributable_bin
文件夹中的 steam_api.dll
和 steam_api.lib
复制到 build\jsb-default\frameworks\runtime-src\proj.win32\Debug.win32
和 build\jsb-default\frameworks\runtime-src\proj.win32\Release.win32
文件夹中
附加依赖项 加载的就是这个
然后在 build\jsb-default\frameworks\runtime-src\proj.win32\Debug.win32
和 build\jsb-default\frameworks\runtime-src\proj.win32\Release.win32
文件夹中都创建一个名为 steam_appid.txt
的文件 里面填写自己游戏的 App ID
下面调试的时候会用到
发布的时候这个文件不需要 详见 文档
到这里 Steamworks SDK
就已经集成到工程中了 下面开始写代码
游戏是否通过 Steam 客户端启动
因为我们要对接 Steamworks API
,如果不是通过 Steam
客户端启动的话 Steamworks API
可能会初始化失败 所以这个是很有必要的
在解决方案中修改 game/win32/main.cpp
添加 Steamworks API
的引用
#include "steam_api.h"
Steamworks SDK
已经集成到工程中了 这里可以直接引用
在 AppDelegate app()
之前添加以下代码即可:
// 检查是否通过 Steam 启动 如果不是 则会自动启动 Steam 并打开游戏 这里需要先退出
if (SteamAPI_RestartAppIfNecessary(自己游戏的 App ID))
{
return 1;
}
Steamworks API 文档
初始化 Steamworks API
SteamAPI_RestartAppIfNecessary
函数调用完之后 调用 SteamAPI_Init
即可
两个函数的完整代码:
// 检查是否通过 Steam 启动 如果不是 则会自动启动 Steam 并打开游戏 这里需要先退出
if (SteamAPI_RestartAppIfNecessary(自己游戏的 App ID))
{
return 1;
}
// 检查 Steam Api是否初始化完成
if (!SteamAPI_Init())
{
return 1;
}
Steamworks API 文档
到这里可以点击 本地 Windows 调试器
运行一下游戏 看下右下角是否有 Steam
的弹窗 如果有 就说明成功了
这种方式运行需要先打开
Steam
客户端并登录 原因就是因为build\jsb-default\frameworks\runtime-src\proj.win32\Debug.win32
和build\jsb-default\frameworks\runtime-src\proj.win32\Release.win32
文件夹中存在steam_appid.txt
文件
如果删除
steam_appid.txt
文件 就会自动唤起Steam
客户端 并打开线上的游戏版本 如果游戏还未发布这里应该会无法启动
再贴下文档
游戏中调用 Steamworks API
Cocos Creator
是通过 JSB
来实现 JavaScript
与 Native
层面的沟通 我们只需要自己编写一些 JSB
的函数 并注册到虚拟机中就可以了
一个获取用户的 Steam ID
简单示例:
在 build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual
文件夹下创建两个文件 jsb_steam_apps.hpp
和 jsb_steam_apps.cpp
为了更好的分类 这个里面主要写的是
SteamApps
里面的API
调用 所以才这么命名的 文件名其实随意 自己知道就好
jsb_steam_apps.hpp
文件内容如下:
#pragma once
namespace se {
class Object;
}
bool register_all_SteamApps(se::Object* obj);
其实这个
.hpp
文件不写也没关系
jsb_steam_apps.cpp
文件内容如下:
#include "jsb_steam_apps.hpp"
#include "cocos/scripting/js-bindings/manual/jsb_conversions.hpp"
#include "steam_api.h"
static bool GetAppOwner(se::State &s)
{
s.rval().setInt32(SteamApps()->GetAppOwner().GetAccountID());
return true;
}
SE_BIND_FUNC(GetAppOwner)
bool register_all_SteamApps(se::Object *obj)
{
se::Value nsVal;
if (!obj->getProperty("SteamApps", &nsVal))
{
se::HandleObject jsobj(se::Object::createPlainObject());
nsVal.setObject(jsobj);
obj->setProperty("SteamApps", nsVal);
}
se::Object *ns = nsVal.toObject();
ns->defineFunction("getAppOwner", _SE(GetAppOwner));
return true;
}
上面两个文件编辑好后 在解决方案中右键 libcocos2d
选择 添加 -> 现有项
将这两个文件添加进去
然后打开解决方案中的 game/Classes/jsb_module_register.cpp
添加文件引用:
#include "cocos/scripting/js-bindings/manual/jsb_steam_apps.hpp"
并注册:
se->addRegisterCallback(register_all_SteamApps);
到这里就写完了 更详细的用法还是看官方文档吧
游戏中直接 SteamApps.getAppOwner()
调用就可以了 会直接返回用户的 Steam ID
如果编辑器中代码报错 直接忽略吧 或者自己写
types
吧
编译发布
修改好之后回到 Cocos Creator
点击 编译
即可生成可执行文件
编译好的文件位于 build/jsb-default/publish/win32