【问题标题】:How come my SFML game only works when ran in Terminal?为什么我的 SFML 游戏只能在终端中运行?
【发布时间】:2014-12-18 01:05:05
【问题描述】:

好的,这个问题需要更多解释。

我使用 SFML 用 C++ 编写了一个游戏。因此,当我完成游戏(我使用的是 xcode)时,我转到 Product > Archive 并将游戏的可执行文件保存在一个文件夹中。我将所有资源与可执行文件放在同一个文件夹中。当我双击可执行文件时,我收到如下错误:

Last login: Wed Dec 17 19:38:15 on ttys001 My-Macbook:~ My_Name$ /Users/My_Name/Dropbox/SFML/DodgeBall/Builds/DodgeBall\ Build\ 12-17/DodgeBall ; exit; Failed to load font "sansation.ttf" (failed to create the font face) Game Crashed: class 'ResourceLoader' was unable to load file logout

这部分:

Game Crashed: class 'ResourceLoader' was unable to load file

是我的游戏本身的输出。其他的我不明白。

但是当我进入终端并导航到我的游戏的可执行文件时,我可以这样做:

./DodgeBall

我的游戏运行良好。这是怎么回事?有没有办法让我可以双击可执行文件并运行它?

我使用的是 2010 年的 macbook、xcode 6、OSX Mavericks 和 SFML 2.1。

【问题讨论】:

  • 心理调试器说:“当前工作目录”。 sansation.ttf 在哪里?
  • sansation.ttf 与可执行文件位于同一目录中。

标签: c++ sfml


【解决方案1】:

当您双击一个可执行文件时,操作系统 GUI 将您的可执行文件作为一个新进程运行,并将该进程的“当前目录”设置为某个任意目录。在 Windows 中,它是 C:/Windows/System32/ 之类的。然后,您的代码告诉操作系统打开sansation.ttf,并检查当前目录和其他几个目录,然后找不到文件并放弃。

当您在控制台中“导航到我的游戏的可执行文件”并以这种方式启动程序时,控制台将您的应用程序作为一个新进程运行,并将其“当前目录”设置为与控制台相同,这是游戏可执行文件的目录。当您尝试打开ttf 文件时,操作系统会检查当前目录,找到该文件,然后愉快地继续。

最好的解决方案是添加一个函数,将进程的当前目录更改为应用程序所在的位置。我不熟悉 Mac OS,但我发现了这个:how to change the working directory to the location of the program。或者,您可以创建一个安装程序来创建某种系统变量来存储 tff 文件的位置。 (在 Windows 中,这可能是设置 PATH 或创建注册表项)

【讨论】:

  • 谢谢。我能够使用argv[0] 来获取可执行文件的路径。
  • @Dovahkiin: argv[0] 包含用于启动可执行文件的启动器。在 linux 中,它通常只包含文件名,而不是完整路径。
猜你喜欢
  • 1970-01-01
  • 2021-04-04
  • 2013-06-25
  • 2019-12-26
  • 2022-10-25
  • 1970-01-01
  • 2023-03-10
  • 2016-02-29
  • 1970-01-01
相关资源
最近更新 更多