-1

在我的游戏中,我有一个头文件,其中包含游戏中季节的属性和函数。这些属性都是静态的,包括一个表示当前季节的浮点数和另一个表示季节之间转换的当前点的浮点数,如果不转换则为零。

在我的游戏中,有几个功能依赖于过渡(此时有两个),其中一个运行良好。虽然,在另一种情况下,这根本不起作用。

在负责控制我的游戏背景的类中,每当引用“SeasonTransition”变量时,它就为零。但是在另一个类中,变量以完全相同的方式引用,它得到了真正的值。

这是游戏可以更新几帧后调用断点后的图片: 在此处输入图像描述

这些变量再次在 ac 头文件中声明:

#import "somestuff.h"

static float SeasonTransition
etc...

这不应该这样做吗?我该如何解决这个问题?

编辑:

Season.h 文件如下:

//GL.h contains different functions and global variables to be used anywhere in the project.
//This file, like Season.h is a singular header file with static declarations, and is setup
//the same way. I have been developing this from the start of the project and havent had any
//problems with it.
#import "GL.h"

static float currentSeason;

static float SeasonTransition;

static void UpdateSeason(){
    currentSeason += 0.0002f;

    float TransitionLength = 0.15f;
    float SeasonDepth = Clamp(currentSeason - floorf(currentSeason), 0, TransitionLength);
    float bigTL = TransitionLength / 4;
    float endTL = TransitionLength;
    float Speed2 = 0;
    float Speed1 = 1;
    float bRatio = SeasonDepth / bigTL;
    float eRatio = SeasonDepth / endTL;

    SeasonTransition = (SeasonDepth < TransitionLength) ?
    ((SeasonDepth < bigTL) ?
     (Speed1 * bRatio) + (Speed2 * (1.0f - bRatio)) :
     (Speed1 * (1.0f - eRatio)) + (Speed2 * eRatio))

    :

    Speed2;
}
4

3 回答 3

4

如果您放入static float SeasonTransition;两个单独的 C 文件(或两个单独的 C 文件包含的一个头文件),每个 C 文件将拥有自己独立的变量副本。

如果这些 C 文件之一随后修改了变量,它将修改其副本。它不会触及另一个 C 文件中的那个。这听起来像你所处的情况。

执行此操作的正常方法是在一个中定义变量并在另一个中将其声明为外部,例如:

file1.c:
    int myVar;           // it exists here.

file2.c:
    extern int myVar;    // it exists, but elsewhere.

你不想static在第一个标记它,因为这实际上使它对第二个不可见。并且您在第二个中标记它extern,以便它知道变量存在于其他地方(在第一个中)。

如果它不是静态的,您实际上会看到效果。当链接器将这两个文件链接在一起时,它会抱怨有两个同名的变量。

如何做到这一点有很多变化,我展示了最简单的。最好有类似的东西:

file1.h:
    extern int myVar;   // so everyone knows about the variable
                        //   just by including this.
file1.c:
    #include "file1.h"  // or import for ObjC.
    int myVar;          // the actual variable.

file2.c:
    #include "file1.h"  // now we know about it, in the OTHER C file.
于 2012-09-06T01:44:28.300 回答
2

我可能是错的,但我认为问题可能是你不明白包含/导入是如何工作的。这些不是退出语言功能,而是预处理器功能。当您在文件中包含某个位置时,您可以说在开始编译之前获取该文件的全部内容并将其粘贴到此处。因此,如果您在多个不同的其他文件中包含相同的头文件,您最终会得到该静态变量的多个版本,如果没有静态变量,您将收到编译器错误,因为您已经多次重新定义了相同的变量。import 的工作方式几乎相同,除非预处理器确定包含的文件已经包含到目标文件中(可以通过另一个包含间接包含),那么它将不再包含该文件。如果您理解这一点,您就会发现在您的标头中声明静态变量很奇怪,因为您最终会在包含该标头的任何地方得到该变量的多个版本。通常,您希望使变量成为全局变量,在这种情况下,您在 .c 或 .m 文件中定义它,然后在标头中将其声明为 extern ,或者您希望该变量是私有的,然后在 .c 或 .m 中将其声明为静态文件。

static 所做的就是对链接器隐藏变量声明,因此链接器无法识别所有同名的不同声明都应该被视为同一个变量。

于 2012-09-06T03:46:32.340 回答
0
#ifndef Season_h
#define Season_h

... your header stuff

#endif

此外,如果您不调用 updateSeason seasonTransition 将为零。

于 2012-09-06T08:54:34.470 回答