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

news2024/12/23 22:44:39

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

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

文章目录

  • 1. 设置项目图标(默认为cocos logo 可跳过)
    • 1.1 编译前:在 Visual Studio 中设置 .exe 文件的图标
    • 1.2 编译后:使用第三方工具替换 .exe 文件的图标
  • 2. 创建安装包
    • 2.1 Inno Setup 脚本说明
    • 2.2 完整脚本实现
    • 2.3 构建运行
  • 3. 阶段性小结
  • 4. 进一步泛化尝试
    • 4.1 主方法:使用 Visual C++ Redistributable Package
    • 4.2 次方法1:使用 Dependency Walker 分析依赖项 (待验证)
    • 4.3 次方法2:静态链接运行时库 (待验证)
  • 5. 结论


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

1.1 编译前:在 Visual Studio 中设置 .exe 文件的图标

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

  2. 添加图标资源
    我们切换到资源视图之后,右键项目名–添加–资源:
    在这里插入图片描述

在添加资源中选择 Icon,导入。
在这里插入图片描述
切换文件类型后,我们选择项目Resource内的favicon.ico文件即可。

在这里插入图片描述

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

在这里插入图片描述

  1. 启动编译,确认ico

重新清理解决方案,启动编译之后,我们确认下编译文件夹下的exe文件是否不再是原cocos的logo。

在这里插入图片描述

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

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

比如: Resource Hacker 官网 等可以直接替换图标,这里给出一个思路。(未尝试)

2. 创建安装包

使用 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文件):

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#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

此时页面如下:

在这里插入图片描述

2.3 构建运行

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

在这里插入图片描述

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

在这里插入图片描述
点击后效果如下:
在这里插入图片描述
最终生成的页面图标如下:

在这里插入图片描述


3. 阶段性小结

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

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

4. 进一步泛化尝试

但是,如果发给没有配置 Visual Studio 环境(缺失Microsoft Visual C++ Redistributable packages)的电脑,依旧运行不起来:

在这里插入图片描述

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

在这里插入图片描述

显然,Microsoft Visual C++ Redistributable packages不仅仅包含这些,最关键的是,即便是手动找全了所有的dll,也不一定能成功。

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

4.1 主方法:使用 Visual C++ Redistributable Package

为了简化这个过程,将 Visual C++ Redistributable Package 安装程序包含在安装包中,并在安装过程中自动安装。这样可以确保目标机器上安装了所有必要的运行时库。

下载 Visual C++ Redistributable Package

  1. 前往 Microsoft Visual C++ Redistributable Packages 页面。
  2. 下载适用于cocos2dx应用程序的所有必要的 Visual C++ Redistributable Packages。例如,如果你使用了 Visual Studio 2013,下载相应的 redistributable 安装程序。

在这里插入图片描述

更新 Inno Setup 脚本以包含 Redistributable 安装程序

如上图所示,下载完成后,我们新建目录scripts存储Inno Setup脚本以及vc安装包。重新编写脚本如下,即可同步安装。

#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 VcRedist "vcredist_x64.exe"

[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
; 添加 Visual C++ Redistributable 安装程序
Source: "{#VcRedist}"; DestDir: "{tmp}"; Flags: ignoreversion

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

[Run]
; 安装 Visual C++ Redistributable
Filename: "{tmp}\{#VcRedist}"; Parameters: "/quiet /norestart"; StatusMsg: "Installing Visual C++ Redistributable..."; Flags: waituntilterminated
; 安装完成后自动运行游戏
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent

4.2 次方法1:使用 Dependency Walker 分析依赖项 (待验证)

使用 Dependency Walker 分析依赖项,你可以提前知道所有需要包含的 DLL 文件。

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

4.3 次方法2:静态链接运行时库 (待验证)

很久之前尝试过,静态链接运行时库可以减少对外部 DLL 的依赖,但会增加可执行文件的大小。(似乎会从30M=>300M)
但是遗忘了具体流程。编译后得同样使用第三方工具对exe文件做打包。

在 Visual Studio 中配置静态链接运行时库

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

5. 结论

为了确保目标机器上运行你的应用程序时不会因为缺少运行时库而报错,推荐的方法是包含 Visual C++ Redistributable Package 并在安装时自动安装。这是一种简便且可靠的方式来处理所有必要的依赖项。你也可以使用 Dependency Walker 来识别所有依赖项并手动添加,但这可能会更繁琐。静态链接运行时库也是一种减少依赖的方法,但需要在项目配置中进行调整。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

王学岗鸿蒙开发(北向)——————(七、八)ArkUi的各种装饰器

arts包含如下:1,装饰器 ;2,组件的描述(build函数);3,自定义组件(Component修饰的),是可复用的单元;4,系统的组件(鸿蒙官方提供);等 装饰器的作用:装饰类、变量、方法、结…

汇编语言LDS指令

在8086架构的实模式下,LDS指令(Load Pointer Using DS)用于从内存中加载一个32位的指针到指定寄存器和DS寄存器。我们来详细解释一下这条指令为什么会修改DS段寄存器。 LDS指令的功能 LDS指令格式如下: LDS destination, sourc…

SNAT与DNAT

一、SNAT策略概述 1、SNAT 策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet(私有IP不能在Internet中正常路由) 局域共享上网 2、 SNAT 策略的原理 修改数据包的源地址 把从内网 --> 外网的数据的源内网地址转换成公网源地址 3、SN…

多目标检测模型加权框集成

优秀项目推荐:https://gitcode.com/ZFTurbo/Weighted-Boxes-Fusion/overview 参考链接: 目标检测加权框融合 WBF原理讲解 https://blog.csdn.net/YXD0514/article/details/132574588 目标检测加权框融合 WBF原理讲解(Weighted Boxes Fusion&…

java中集合List,Set,Queue,Map

Java SE中的集合框架是一组用于存储和操作对象的类和接口。它提供了丰富的数据结构,可以用于解决各种问题。Java SE中的集合框架包含以下主要类和接口: 一. Collection接口: 是集合框架的根接口,它定义了一些通用的集合操作方法…

微服务之远程调用

常见的远程调用方式 RPC:Remote Produce Call远程过程调用,类似的还有 。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo (12不再维护、17年维护权交给apac…

【设计模式】行为型设计模式之 迭代器模式

介绍 迭代器模式(Iterator Pattern) 是行为设计模式之一,它提供了一种访问集合对象(如列表、数组或其他集合结构)中元素的方式,而不需要暴露集合的内部结构。迭代器模式定义了一个迭代器接口,该…

专业学习|南开大学《随机过程》学习笔记(一)

(1)有哪些经典的关于基本随机过程的书籍推荐? 对于想要系统学习基本随机过程的学生来说,可以参考Sheldon M.Rose编著的经典著作《随机过程》。该书涉及的内容也比较宽泛。但并不局限于单个细节论证。 此外,萨缪尔科林(…

Vulnhub靶机之reven 1

一、信息收集 nmap扫描网段,靶机地址为192.168.145.129。 nmap -sP 192.168.145.* 扫一下端口,开放了22、80、111、50967。 nmap -sT -T4 -p1-65535 192.168.145.129 再看一下目录情况,发现一个疑似后台登录的地址。 dirsearch -u http://…

DeepSeek-7B-chat 4bits量化 Qlora 微调

在本文中我们将学习DeepSeek量化微调的方法,并且从微调结果体会大模型微调的重要性。 引言 在当前快速发展的自然语言处理领域,模型的精度和效率是关键。量化和微调技术可以有效提高模型性能。本文将探讨如何对DeepSeek-7B-chat模型进行4bits量化&…

Linux | buildrootfs 添加mkfs.ext3/mkfs.ext4 支持

因个人需要,mkfs.ext3 但是项目中还没有这个命令 所以琢磨了半天 这里将其小记一下 在buildrootfsz中,需要将e2fsprogs 勾选上然后重新编译就好了 make menuconfig Target packages-> Filesystem and flash utilities-> e2fsprogs

stm32编写Modbus步骤

1. modbus协议简介: modbus协议基于rs485总线,采取一主多从的形式,主设备轮询各从设备信息,从设备不主动上报。 日常使用都是RTU模式,协议帧格式如下所示: 地址 功能码 寄存器地址 读取寄存器…

springCloudAlibaba之分布式事务组件---seata

Seata Sea学习分布式事务Seata二阶段提交协议AT模式 Sea学习 事务:事务是访问数据库并更新数据库中各项数据的一个程序执行单元。在关系数据库中,一个事务由一组或多组SQL语句组成。事务应该具有4个属性:原子性、一致性、隔离性、持久性。例如…

数据交换平台_10_activatemq 中间件容错性测试

目录概要 3. 容错测试: - 模拟ActiveMQ在异常情况下的表现,如网络中断、节点故障等。 - 观察ActiveMQ的容错机制是否能够正确处理异常情况,保证消息的可靠传输。 - 根据容错测试结果,优化ActiveMQ的容错机制,确保系统在面对异常情况时能够正确处理并恢复。 设计: 容错测…

WPF-UI布局

WPF布局元素有如下几个: Grid:网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。StackPanel:栈式面板。可将包含的元素在竖直或水平方向上排成一条直线,当移除一个元素后,后面的元素会自动向前移…

鸿蒙HarmonyOS中的ohpm相关知识点总结

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 OHPM是什么?一、OpenHarmony三方库中心仓网站(website):用于检索、查看所需 OpenHarmony 三方库信息,也可…

二维鱼游CFD代码

最近学了会Julia,参考了原作者的shark,做一下基于airfoils 2D的鱼游,暂时没想好有什么需要深入研究的,代码公开如下: 鱼身是naca0016,然后一些参数可以参考我以前发的论文。 using WaterLily, StaticArra…

如何解决网络问题?

组织和 IT 管理员尽其所能完善他们的网络,但是,不同程度的网络问题仍然可能出现,这些网络问题需要立即响应和解决,如果这些问题在不合理的时间内得不到解决,网络和组织的损害可能会付出高昂的代价。这就是为什么 IT 管…

【C#线程设计】3:threadpool

实现: (1).控件:group Box,text Box,check Box,label,botton,richtextbox 控件拉取见:https://blog.csdn.net/m0_74749240/article/details/139409510?spm1…

IDEA配置mybatis-config.xml模板文件

IDEA配置mybatis-config.xml模板文件 File>>Settings>>File and Code Templates 创建mybatis-config.xml模板 模板内容取自mybatis官网 mybatis官网 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC &qu…