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 文件

<EngineRoot>$(MSBuildThisFileDirectory)..\</EngineRoot>

下面添加如下配置:

<SteamPublicRoot>$(SolutionDir)..\sdk\public\steam</SteamPublicRoot>

这里是添加一个 路径宏 我在 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容