Cocos2dx 编译游戏安装包制作教程

在 Visual Studio 项目中配置图标并使用 Inno Setup 创建安装包

在本教程中,我们将学习如何为 Visual Studio 编译项目配置图标,并使用 Inno Setup 创建安装包。教程包括以下部分:

  1. 设置项目图标:在 Visual Studio 中配置 .exe 文件的图标,或者使用第三方工具替换编译后的图标。
  2. 创建安装包:使用 Inno Setup 编写脚本,创建安装包。

除了Inno Setup之外,还可以使用NSIS、Enigma Virtual Box。

文章目录

  • 在 Visual Studio 项目中配置图标并使用 Inno Setup 创建安装包
    • 1. 设置项目图标(默认为 Cocos Logo 可跳过)
      • 1.1 方法1:在 Visual Studio 中设置 .exe 文件的图标(编译前)
      • 1.2 方法2:使用第三方工具替换 .exe 文件的图标(编译后)
    • 2. 创建安装包
      • 2.1 Inno Setup 脚本说明
      • 2.2 完整脚本实现
      • 2.3 构建运行
    • 3. 阶段性小结
    • 4. 进一步兼容尝试
      • 4.1 缺啥补啥
      • 4.2 辅助方法:使用 Dependency Walker 分析依赖项
      • 4.3 其他方法(理论上可行,若前文依旧无法解决可考虑)
    • 5. 总结


1. 设置项目图标(默认为 Cocos Logo 可跳过)

1.1 方法1:在 Visual Studio 中设置 .exe 文件的图标(编译前)

  1. 准备图标文件
    确保你有一个 .ico 格式的图标文件。如果你的图标是 .png 格式,可以使用在线工具或图像编辑软件将其转换为 .ico 格式。

  2. 添加图标资源
    切换到资源视图之后,右键项目名 -> 添加 -> 资源:

    添加资源

    在添加资源中选择 Icon,导入:

    选择 Icon

    切换文件类型后,选择项目 Resource 内的 favicon.ico 文件即可:

    选择文件类型

    双击导入的 icon,页面如下:

    导入 icon
  3. 启动编译,确认 ico
    重新清理解决方案,启动编译之后,确认编译文件夹下的 exe 文件是否不再是原 Cocos 的 logo:

    确认 ico

1.2 方法2:使用第三方工具替换 .exe 文件的图标(编译后)

如果你已经编译好 .exe 文件并希望在编译后设置执行程序的 logo,可以使用第三方工具替换图标。

例如,可以使用 Resource Hacker 替换图标,这里给出一个思路(未尝试)。


2. 创建安装包

使用 Inno Setup 创建安装包,包含自定义安装包的图标、应用名称和安装路径。

下载地址:Inno Setup 官方网站

进入官方网站后点击下载即可:点击下载

下载 Inno Setup

下载安装后新建一个空脚本(.iss 文件),进行如下操作。

2.1 Inno Setup 脚本说明

我们基于以下内容作为示例:

  • 游戏编译文件夹路径为 E:\cocos\IceHockey\proj.win32\Release.win32
  • 图标路径为 E:\cocos\IceHockey\proj.win32\Release.win32\Resources\favicon.ico
  • 游戏名称是“冰球大作战”
  • 编译后的可执行文件名是 IceHockey.exe

首先,在脚本顶部定义参数:

#define MyAppName "冰球大作战"
#define MyAppVersion "1.0"
#define MyAppSource "E:\cocos\IceHockey\proj.win32\Release.win32"
#define MyAppExeName "IceHockey.exe"
#define MyAppIcon "E:\cocos\IceHockey\proj.win32\Release.win32\Resources\favicon.ico"
  • MyAppName:应用程序的名称,将显示在安装向导和快捷方式中。
  • MyAppVersion:应用程序的版本号。
  • MyAppSource:游戏编译后的输出目录路径,包含可执行文件和资源文件。
  • MyAppExeName:应用程序的可执行文件名称。
  • MyAppIcon:应用程序的图标文件路径,将用于安装包和快捷方式图标。

在脚本部分相关配置如下:

  • [Setup] 部分:

    • AppName:安装程序显示的应用名称。
    • AppVersion:安装程序显示的应用版本。
    • DefaultDirName:应用程序的默认安装目录。
    • DefaultGroupName:开始菜单中的程序组名称。
    • OutputBaseFilename:生成的安装包文件名。
    • CompressionSolidCompression:安装包的压缩选项。
    • SetupIconFile:安装程序的图标文件。
  • [Files] 部分:

    • SourceDestDir:定义要打包的文件及其目标目录。
    • Flags: ignoreversion:忽略文件版本检查。
    • recursesubdirs:递归包含子目录中的所有文件。
  • [Icons] 部分:

    • Name:快捷方式名称和位置。
    • Filename:快捷方式指向的可执行文件。
    • IconFilename:快捷方式使用的图标文件。

2.2 完整脚本实现

根据模板生成完整的 Inno Setup 脚本(.iss 文件):

#define MyAppName "冰球大作战"
#define MyAppVersion "1.0"
#define MyAppSource "E:\cocos\IceHockey\proj.win32\Release.win32"
#define MyAppExeName "IceHockey.exe"
#define MyAppIcon "E:\cocos\IceHockey\proj.win32\Release.win32\Resources\favicon.ico"

[Setup]
; 安装程序信息
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename={#MyAppName}Setup
Compression=lzma
SolidCompression=yes
SetupIconFile={#MyAppIcon}

[Files]
; 将所有游戏文件添加到安装包
Source: "{#MyAppSource}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppSource}\*.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppSource}\Resources\*"; DestDir: "{app}\Resources"; Flags: ignoreversion recursesubdirs

[Icons]
; 创建桌面快捷方式
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

; [Run]
; 安装完成后自动运行游戏
; Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent

此时页面如下:

Inno Setup 页面

2.3 构建运行

随后点击构建中的编译或运行(Run),进行安装后测试游戏是否可以直接打开运行:

构建运行

在我们安装 Inno Setup 6 的 output 目录中,即可看到我们的安装包:

安装包

点击后效果如下:

效果

最终生成的页面图标如下:

页面图标

3. 阶段性小结

通过上述步骤,即可在 Visual Studio 项目中设置 .exe 文件的图标,并使用 Inno Setup 创建包含自定义图标和安装路径的安装包。

至此即实现了 Cocos2d-x 游戏打包,我们可以发给其他游戏开发课程的同学了。

(blog over)


4. 进一步兼容尝试

4.1 缺啥补啥

如果发给没有配置 Visual Studio 环境的电脑,如缺失 Microsoft Visual C++ Redistributable packages、Windows SDK 10.0.17763.0 的机房电脑,依旧运行不起来:

缺失 DLL

经尝试,找到电脑中此 DLL 文件后放入打包目录中一起打包,则会出现下一个 DLL 文件缺失:

下一个缺失 DLL

递归两三轮的实践后,发现一共缺失如下:

  • MSVCP140.DLL
  • MSVCR120.dll
  • MSVCR110.dll
  • VCRUNTIME140.DLL
  • VCRUNTIME140D.dll
  • ucrtbased.dll

推荐下载 Everything(速度快)搜索,一般在如下地址也能找到:

  • C:\Windows\System32
  • xx\Microsoft Visual Studio\2022(版本)\Community\VC\Redist\...
  • C:\Program Files (x86)\Windows Kits\10\bin\10.xxx(SDK 版本)
搜索 DLL

更新后的脚本如下(或者不更新脚本,将其移入MyAppSource文件夹内即可):

#define MyAppName "冰球大作战"
#define MyAppVersion "1.0"
#define MyAppSource "E:\cocos\IceHockey\proj.win32\Release.win32"
#define MyAppExeName "IceHockey.exe"
#define MyAppIcon "E:\cocos\IceHockey\proj.win32\Release.win32\Resources\favicon.ico"
; 缺啥补啥
#define VcRunTime "C:\windows\system32\VCRUNTIME140.DLL"
#define MSVCP140 "C:\windows\system32\MSVCP140.DLL"
#define MSVCR120 "C:\windows\system32\MSVCR120.DLL"
#define MSVCR110 "C:\windows\system32\MSVCR110.DLL"
#define WindowsKitsDir "C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0"
#define System32Dir "C:\Windows\System32"
#define UCRTDir "C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\ucrt"

[Setup]
; 安装程序信息
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename={#MyAppName}-only-Denpendency
Compression=lzma
SolidCompression=yes
SetupIconFile={#MyAppIcon}

[Files]
; 将所有游戏文件添加到安装包
Source: "{#MyAppSource}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppSource}\*.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppSource}\Resources\*"; DestDir: "{app}\Resources"; Flags: ignoreversion recursesubdirs
; 添加缺失的依赖文件
Source: "{#VcRunTime}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MSVCP140}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MSVCR120}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MSVCR110}"; DestDir: "{app}"; Flags: ignoreversion
; 添加 Windows Kits 目录下的所有 DLL 文件
; Source: "{#WindowsKitsDir}\*.dll"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
; 添加 System32 目录下的所有 DLL 文件
; Source: "{#System32Dir}\*.dll"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs
; 添加 ucrtbased.dll 文件
Source: "{#UCRTDir}\ucrtbased.dll"; DestDir: "{app}"; Flags: ignoreversion
; 添加 vcruntime140d.dll 文件
Source: "{#System32Dir}\vcruntime140d.dll"; DestDir: "{app}"; Flags: ignoreversion

[Icons]
; 创建桌面快捷方式并使用自定义图标
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{#MyAppIcon}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{#MyAppIcon}"

[Run]
; 安装完成后自动运行游戏
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent

经实践,此时打包安装后可成功运行!

(blog over again)


4.2 辅助方法:使用 Dependency Walker 分析依赖项

根据 bug 搜集对应的 dll 文件多少有点被动。

理论上,使用 Dependency Walker 分析依赖项,可以提前知道所有需要包含的 DLL 文件以及对应的文件。

  1. 下载并安装 Dependency Walker。
  2. 打开你的可执行文件(例如 FinalGame.exe)。
  3. Dependency Walker 会显示所有依赖的 DLL 文件。右键 show full path,记录所有需要的文件,然后将它们添加到 Inno Setup 脚本中。
Dependency Walker

(PS:这个软件使用分析依赖项的时候特别卡,体验极差。)

4.3 其他方法(理论上可行,若前文依旧无法解决可考虑)

手动逐一添加 DLL 文件虽然可以最轻量地解决问题,但或许并不是最优雅和高效的方法。

显然,Microsoft Visual C++ Redistributable packages 不仅仅包含这些,最关键的是,如果手动找全了所有的 dll,是否会出现其他的无法运行问题。

  • 下载 Visual C++ Redistributable Package,将 Visual C++ Redistributable Package 安装程序包含在安装包中,并在安装过程中自动安装。这样可以确保目标机器上安装了所有必要的运行时库,一同放入安装包内。

    1. 前往 Microsoft Visual C++ Redistributable Packages 页面。
    2. 下载适用于 Cocos2d-x 应用程序的所有必要的 Visual C++ Redistributable Packages。例如,Visual Studio 2013、2015 - 2022,下载相应的 redistributable 安装程序,还有 Windows SDK。
    3. 设置 Inno 安装脚本时同时运行这个安装包。
    #define VcRedist "vcredist_x64.exe"
    [Run]
    ; 安装 Visual C++ Redistributable
    Filename: "{tmp}\{#VcRedist}"; Parameters: "/quiet /norestart"; StatusMsg: "Installing Visual C++ Redistributable..."; Flags: waituntilterminated
    
  • 在 Visual Studio 中配置静态链接运行时库,编译后重新打包(会增加可执行文件大小,Maybe 从 30M => 300M)。

    1. 打开项目属性。
    2. 导航到 C/C++ -> 代码生成
    3. 运行时库 下,选择 多线程 (/MT)多线程调试 (/MTd)
    4. 重新编译项目。

5. 总结

本篇博客希望你不仅掌握了如何在 Visual Studio 项目中设置 .exe 文件的图标,还学会了使用 Inno Setup 创建包含自定义图标和安装路径的安装包。

我们还探讨了如何解决在目标机器上运行游戏时可能遇到的 DLL 缺失问题。希望这篇教程能帮助你更顺利地发布和分享你的游戏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/697894.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

英语国际音标 - DJ 音标 - KK 音标

英语国际音标 - DJ 音标 - KK 音标 1. 国际音标 (International Phonetic Alphabet,IPA)1.1. 记音类型1.2. 48 个国际音标发音表1.2.1. 元音 (vowel)1.2.1.1. 单元音 (monophthong)1.2.1.2. 双元音 (diphthong) 1.2.2. 辅音 (consonant)1.2.2.1. 清音 (voiceless so…

用人工智能写2024年高考作文

目录 用人工智能写2024年高考作文 引用 一、2024年 新课标I卷 作文真题 AI写作范文 二、2024年 全国甲卷 作文真题 AI写作范文 三、2024年 新课标II卷 作文真题 AI写作范文 四、2024年 北京卷 作文真题一 AI写作范文 作文真题二 AI写作范文 作文真题三 AI写作…

Nginx中location规则与rewrite重写

一、概念介绍 1、location与rewrite的常用正则表达式 符号作用^ 匹配输入字符串的起始位置$ 匹配输入字符串的结束位置* 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” 匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”&#xff0…

keda-P0460. 潜水员

可达信奥 - 登录 - 可达信奥https://kedaoi.cn/p/P0460 代码思路: 01背包DP。 思路也是比较经典的,就是看用这个水缸的最小值小,还是不用这个水缸的最小值小。但是这里涉及到一个初始化的问题,因为要求最小所以初始化理应…

1992-2012年美国西海岸的海面高度异常数据集

Gridded Altimeter Fields with Enhanced Coastal Coverage 具有增强海岸覆盖范围的网格化测高场 简介 具有增强的海岸覆盖范围的网格化高度计场数据产品包含美国西海岸的海面高度异常(SSHA 或 SLA)以及北纬 35.25 度-48.5 度和东经 227.75 度-248.5 …

【docker】日志

ocker 日志相关的操作主要涉及查看、管理和理解容器的日志输出。以下是一些常用的 Docker 日志命令和选项: 查看日志 docker logs container_id_or_name:获取指定容器的日志。docker logs -f container_id_or_name:跟随(实时输出…

ARM32开发--串口库封装(初级)

知不足而奋进望远山而前行 目录 文章目录 前言 目标 内容 开发流程 文件目录创建 分组创建 接口定义 完整代码 总结 前言 在嵌入式软件开发中,封装抽取流程和抽取封装策略是非常重要的技术,能够提高代码的复用性和可维护性。本文将介绍如何在文…

Python 多进程

单例模式 面试中,就被问到了这个问题,你知道用python怎么创建一个单例模式吗? 单例模式是什么? 就是这个对象只能被创建一次。 每次实例化,都是同一个对象。 单例模式是一种常用的软件设计模式。在它的核心结构中只包…

UE5.2打包安卓

目录 简介: 一. 根据官网配置 二. 手动定位SDK路径 三: 设置Android基本信息 四: 设置KeyStore 五: 开始打包 六:其他 七. 总结 简介: UE5.2 打包安卓是指将使用 Unreal Engine 5.2 开发的项目编译为可在安卓设备上运行的安装包。 以下是一般的打包步骤: 安装…

交易中的群体行为特征和决策模型

本文基于人的行为和心理特征,归纳出交易中群体的行为决策模型,并基于这个模型,分析股价波浪运行背后的逻辑,以及投机情绪的周期变化规律,以此指导交易,分析潜在的风险和机会,寻找并等待高性价比…

Java:九九乘法表,打印三角形

文章目录 九九乘法表打印三角形改进:控制行数的三角形有空格的三角形 九九乘法表 package com.zhang; /* 打印九九乘法表*/ public class Test8 {public static void main(String[] args) {//i是竖着的 j是横着的for (int i 1; i < 9; i) {for(int j 1; j < 9; j) {i…

流批一体计算引擎-10-[Flink]中的常用算子和DataStream转换

pyflink 处理 kafka数据 1 DataStream API 示例代码 从非空集合中读取数据&#xff0c;并将结果写入本地文件系统。 from pyflink.common.serialization import Encoder from pyflink.common.typeinfo import Types from pyflink.datastream import StreamExecutionEnviron…

【Vue】图形验证码功能

说明&#xff1a; 图形验证码&#xff0c;本质就是一个请求回来的图片用户将来输入图形验证码&#xff0c;用于强制人机交互&#xff0c;可以抵御机器自动化攻击 (例如&#xff1a;避免批量请求获取短信) 需求&#xff1a; 动态将请求回来的 base64 图片&#xff0c;解析渲染…

【面试干货】聚集索引和非聚集索引区别?

【面试干货】聚集索引和非聚集索引区别? 1、聚集索引&#xff08;Clustered Index&#xff09;1.1 特点1.2 例子 2、非聚集索引&#xff08;Nonclustered Index&#xff09;2.1 特点2.2 例子 3、根本区别 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&…

秋招突击——6/10——复习{(树形DP)树的最长路径、}——新作{电话号码的字母组合}

文章目录 引言复习树形DP——树的最长路径思路分析参考思路求图的最长的直径的通用方法证明 树形DP分析方法问题 参考代码使用一维数组模拟邻接表存储树形结构或者稀疏图 新作电话号码的组合思路分析参考实现 总结 引言 中间面试了两天&#xff0c;去上海呆了一天&#xff0c;…

小熊家务帮day19-day21 订单模块2(取消订单,退款功能等)

目录 1 订单退款功能1.1 需求分析1.2 接口分析1.3 退款流程分析1.4 表结构设计1.5 取消未支付订单实现1.5.1 接口开发Controller层开发Service层开发 1.5.2 接口测试 1.5 取消已支付订单实现 1 订单退款功能 1.1 需求分析 用户下单成功可以取消订单&#xff0c;在订单的不同状…

机器视觉系统-同轴光源大小选择技巧

同轴光源多用于检测光滑平面产品上的缺陷&#xff0c;同样利用上述的方法计算得出光源尺寸。 实际上&#xff0c;同轴光源可理解为没有孔的开孔面光&#xff0c;因此可等效为发光面相等的面光源&#xff0c;如下图&#xff1a; 如图所示&#xff0c;同轴光源的效果与开孔面光的…

【Labview】通过串口通信从上位机读取和写入数据

最近博主需要通过Labview的上位机控制一个温控仪表&#xff0c;主要实现在上位机读取实时温度和设定的目标温度&#xff0c;以及通过上位机设定目标温度。这里将其中遇到的问题和心得分享给大家&#xff0c;博主自己也做一个记录。 由于温控仪表采用的485通讯&#xff0c;modb…

王学岗鸿蒙开发(北向)——————(十)子组件修改父组件的内容与 动画

子组件修改父组件的内容 使用类似Android的回调&#xff0c;父组件传递给子组件一个函数 import { MyComment } from ./component/MyComment import { MyContent } from ./component/MyComtent import { MyTitleComponent } from ./component/MyTitleComponentEntry Componen…

现代x86汇编-环境安装

今天端午节&#xff0c;独自在家&#xff0c;翻阅了张银奎老师编写的《现代x86汇编语言程序设计》一书&#xff0c;前言部分说明书中示例代码都是用微软visual C工具编写并使用微软宏汇编&#xff08;著名的MASM&#xff09;编译的&#xff0c;好久没有用微软vc了&#xff0c;假…