浮点数计算为零

时间:2012-09-06 01:38:50

标签: objective-c ios c

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

整个游戏中的几个功能都依赖于过渡(此时有两个),一个功能完美。虽然,在另一个例子中,这根本不起作用。

在负责控制我的游戏背景的班级中,什么时候进入" SeasonTransition"变量被引用它只是零。但是在另一个类中,变量以完全相同的方式引用,它提供了实际值。

这是在游戏更新几帧后调用断点后的图片: enter image description here

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

#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;
}

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:2)

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

静态做什么是隐藏链接器中的变量声明,因此链接器无法识别同名的所有不同声明应被视为同一个变量。

答案 2 :(得分:0)

#ifndef Season_h
#define Season_h

... your header stuff

#endif

另外,如果你不调用updateSeason,则seasonTransition将为零。