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

在本教程中,我们将学习如何为 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.mzph.cn/pingmian/25538.shtml

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

相关文章

简记:为Docker配置服务代理

简记 为Docker配置服务代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/art…

小冬瓜AIGC 手撕LLM 拼课

小冬瓜aigc手撕LLM学习 官方认证 手撕LLMRLHF速成班-(附赠LLM加速分布式训练超长文档) 帮助多名同学上岸LLM方向,包括高校副教授,北美PhD,大厂等 课程名称【手撕LLMRLHF】 授课形式:在线会议直播讲解课后录播 时间&…

RK3568笔记三十一:ekho 6.3 文本转语音移植

若该文为原创文章,转载请注明原文出处。 移植的目的是在在OCR识别基础上增加语音播放,把识别到的文字直接转TTS播报出来,形成类似点读机的功能。 1、下载文件 libsndfile-1.0.28.tar.gz ekho-6.3.tar.xz 2、解压 tar zxvf libsndfile-1.0…

LangChain基础知识入门

LangChain的介绍和入门 1 什么是LangChain LangChain由 Harrison Chase 创建于2022年10月,它是围绕LLMs(大语言模型)建立的一个框架,LLMs使用机器学习算法和海量数据来分析和理解自然语言,GPT3.5、GPT4是LLMs最先进的代…

【源码】Spring Data JPA原理解析之事务注册原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

Docker 基础使用 (4) 网络管理

文章目录 Docker 网络管理需求Docker 网络架构认识Docker 常见网络类型1. bridge 网络2. host 网络3. container 网络4. none 网络5. overlay 网络 Docker 网路基础指令Docker 网络管理实操 其他相关链接 Docker 基础使用(0)基础认识 Docker 基础使用(1)…

文件操作(Python和C++版)

一、C版 程序运行时产生的数据都属于临时数据&#xff0c;程序—旦运行结束都会被释放通过文件可以将数据持久化 C中对文件操作需要包含头文件< fstream > 文件类型分为两种: 1. 文本文件 - 文件以文本的ASCII码形式存储在计算机中 2. 二进制文件- 文件以文本的二进…

Spring运维之boo项目表现层测试匹配响应执行状态响应体JSON和响应头

匹配响应执行状态 我们创建了测试环境 而且发送了虚拟的请求 我们接下来要进行验证 验证请求和预期值是否匹配 MVC结果匹配器 匹配上了 匹配失败 package com.example.demo;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Auto…

Transformer动画讲解:Softmax函数

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

读AI未来进行式笔记07量子计算

1. AI审讯技术 1.1. 发明者最初的目的是发明一种能够替代精神药物&#xff0c;为人类带来终极快乐的技术 1.1.1. 遗憾的是&#xff0c;他找到的只是通往反方向的大门 1.2. 通过非侵入式的神经电磁干扰大脑边缘系统&#xff0c;诱发受审者最…

VRRP基础配置(华为)

#交换设备 VRRP基础配置 VRRP (Virtual Router Redundancy Protocol) 全称是虚拟路由规元余协议&#xff0c;它是一种容错协议。该协议通过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;该虚拟路由器在本地局域网拥有唯一的一个虚拟 ID 和虚拟 IP 地址。实际上&…

UV胶的均匀性对产品质量有什么影响吗?

UV胶的均匀性对产品质量有什么影响吗? UV胶的均匀性对产品质量具有显著的影响&#xff0c;主要体现在以下几个方面&#xff1a; 粘合强度&#xff1a;UV胶的均匀性直接影响其粘合强度。如果UV胶分布不均匀&#xff0c;可能导致部分区域粘接力不足&#xff0c;从而影响产品的…

报错:CMake Error OpenCVConfig.cmake opencv-config.cmake

1、编译过程中&#xff0c;出现OpenCV 报错问题 报错&#xff1a;CMake Error OpenCVConfig.cmake opencv-config.cmake 解决思路&#xff1a;参考此链接

LangChain + ChatGLM 实现本地知识库问答

基于LangChain ChatGLM 搭建融合本地知识的问答机器人 1 背景介绍 近半年以来&#xff0c;随着ChatGPT的火爆&#xff0c;使得LLM成为研究和应用的热点&#xff0c;但是市面上大部分LLM都存在一个共同的问题&#xff1a;模型都是基于过去的经验数据进行训练完成&#xff0c;无…

Python进阶-部署Flask项目(以TensorFlow图像识别项目WSGI方式启动为例)

本文详细介绍了如何通过WSGI方式部署一个基于TensorFlow图像识别的Flask项目。首先简要介绍了Flask框架的基本概念及其特点&#xff0c;其次详细阐述了Flask项目的部署流程&#xff0c;涵盖了服务器环境配置、Flask应用的创建与测试、WSGI服务器的安装与配置等内容。本文旨在帮…

JAVA-LeetCode 热题 100 第56.合并区间

思路&#xff1a; class Solution {public int[][] merge(int[][] intervals) {if(intervals.length < 1) return intervals;List<int[]> res new ArrayList<>();Arrays.sort(intervals, (o1,o2) -> o1[0] - o2[0]);for(int[] interval : intervals){if(res…

【嵌入式】波特率9600,发送8个字节需要多少时间,如何计算?

问题&#xff1a; 波特率9600&#xff0c;发送 01 03 00 00 00 04 44 09 (8字节) 需要多少时间&#xff0c;如何计算&#xff1f; 在计算发送数据的时间时&#xff0c;首先要考虑波特率以及每个字符的数据格式。对于波特率9600和标准的UART数据格式&#xff08;1个起始位&…

AIRNet模型使用与代码分析(All-In-One Image Restoration Network)

AIRNet提出了一种较为简易的pipeline&#xff0c;以单一网络结构应对多种任务需求&#xff08;不同类型&#xff0c;不同程度&#xff09;。但在效果上看&#xff0c;ALL-In-One是不如One-By-One的&#xff0c;且本文方法的亮点是batch内选择patch进行对比学习。在与sota对比上…

JAVA-学习-2

一、类 1、类的定义 把相似的对象划分了一个类。 类指的就是一种模板&#xff0c;定义了一种特定类型的所有对象的属性和行为 在一个.java的问题件中&#xff0c;可以有多个class&#xff0c;但是智能有一个class是用public的class。被声明的public的class&#xff0c;必须和文…

Pytorch 实现目标检测一(Pytorch 23)

一 目标检测和边界框 在图像分类任务中&#xff0c;我们假设图像中只有一个主要物体对象&#xff0c;我们只关注如何识别其类别。然而&#xff0c;很多时候图像里有多个我们感兴趣的目标&#xff0c;我们不仅想知 道它们的类别&#xff0c;还想得到它们在图像中的具体位置。在…