Cocos Creator 2.4.9 打包Steam Winows平台 修改工程记录

构建工程

游戏名称 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_INFOLanguage 属性为 中文(简体, 中国)

双击 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_WIDTHMACOS_WIN_SIZE_HEIGHT 分别为 19201080

防止多开

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 SDKpublic\steam 文件夹中的文件到工程中
内容如下:

$(SteamPublicRoot)

如果 libcocos2d 中需要调用 Steamworks API 的话也要添加下 附加包含目录 配置

因为上面已经定义好了 路径宏 所以直接使用就可以了

然后找到 配置属性 -> 连接器 -> 输入
点击 附加依赖项 的编辑 添加 Steamworks SDKsteam_api.lib 到附加依赖项中
内容如下:

steam_api.lib

Steamworks SDKredistributable_bin 文件夹中的 steam_api.dllsteam_api.lib 复制到 build\jsb-default\frameworks\runtime-src\proj.win32\Debug.win32build\jsb-default\frameworks\runtime-src\proj.win32\Release.win32 文件夹中

附加依赖项 加载的就是这个

然后在 build\jsb-default\frameworks\runtime-src\proj.win32\Debug.win32build\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.win32build\jsb-default\frameworks\runtime-src\proj.win32\Release.win32 文件夹中存在 steam_appid.txt 文件

如果删除 steam_appid.txt 文件 就会自动唤起 Steam 客户端 并打开线上的游戏版本 如果游戏还未发布这里应该会无法启动

再贴下文档

游戏中调用 Steamworks API

Cocos Creator 是通过 JSB 来实现 JavaScriptNative 层面的沟通 我们只需要自己编写一些 JSB 的函数 并注册到虚拟机中就可以了

一个获取用户的 Steam ID 简单示例:

build\jsb-default\frameworks\cocos2d-x\cocos\scripting\js-bindings\manual 文件夹下创建两个文件 jsb_steam_apps.hppjsb_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

你可能感兴趣的:(Cocos Creator 2.4.9 打包Steam Winows平台 修改工程记录)