-1

私のゲームには、ゲームのシーズンのプロパティと関数を含むヘッダー ファイルがあります。これらのプロパティはすべて静的で、現在の季節を表す float と、季節間の移行の現在のポイントを表す別の float が含まれています。移行中でない場合はゼロになります。

私のゲーム全体のいくつかの機能はトランジションに依存しており (この時点で 2 つ)、そのうちの 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

2 つの別個の C ファイル (または 2 つの別個の C ファイルに含まstatic float SeasonTransition;れる1 つのヘッダー ファイル)に入れる場合、各 C ファイルには変数の独自の独立したコピーがあります。

これらの C ファイルの 1 つが変数を変更すると、そのコピーが変更されます。他の C ファイル内のものには触れません。それはあなたが置かれている状況のように聞こえます。

これを行う通常の方法は、一方に変数を定義し、もう一方に外部宣言することです。次のようになります。

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

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

最初にマークする必要はありませんstatic。これにより、効果的に2番目に見えなくなるためです。externそして、変数が他の場所 (最初の) に存在することを認識できるように、2 番目にマークします。

静的でなければ、実際に効果が見られます。リンカーがこれらの 2 つのファイルをリンクするようになると、同じ名前の2 つの変数があると文句を言います。

その方法には多くのバリエーションがありますが、最も簡単なものを示しました。おそらく次のようなものがある方が良いでしょう:

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 に答える