1

時間間隔を追跡し、間隔が経過するたびに関数を呼び出す必要があります。に関する SDL のドキュメントを参照しましたSDL_AddTimerが、gcc は私のやり方が間違っていると不平を言っています。

では、どのように定期的な間隔を作ることができますか、またはどのように使用しAddTimerますか?

SDL ドキュメントの例はAddTimer、私には明確ではありませんでした。gcc は、コールバック関数に引数がなく、タイマーがスコープに存在しないことを教えてくれました (ただし、何を宣言すればよいかわかりません)。これが私がひどく試したことです:

SDL_AddTimer(3000,changeMusic,NULL);
Uint32 changeMusic(Uint32 interval, void *param){...

経過時間が 3 秒で割り切れる場合は関数が実行されるのではないかと思ったのですが、これは不規則な頻度でアクティブ化されました。

if(interval.getTicks()%3000==0){
    changeMusic();
}

または、カウントダウンがゼロになった場合は、リセットして関数を呼び出しますが、カウントダウンするタイマーを作成する方法がわかりません。

//something like this
cdTimer=(3000 to 0)
if(cdTimer==0){
    cdTimer=(3000 to 0);
    changeMusic();
}
4

1 に答える 1

3

あなたのスニペットから、SDL_AddTimer() を呼び出す前に関数を宣言しなかったことは確かです。したがって、コンパイラはそれが間違った関数パラメータであると考えています。

次の 2 つの解決策があります。

  1. コールバック関数をSDL_AddTimer()からタイマー呼び出しの前のどこかに移動します.
  2. 関数を上に移動するには、前方宣言を使用します。

クラスでメンバー関数を使用しようとしている可能性もあります。その場合、静的メンバー関数である必要があります。このようなもの:

class Mylene
{
 public:
    ... // other stuff goes here ... 
    static Uint32 ChangeMusic(Uint32 x, void *p)
    {
         Mylene *self = reinterpret_cast<Mylene *>(p);
         self->doChangeMusic();
         return 0;
    }

    ... more stuff here, perhaps ... 
};


Mylene mylene(...);  // Note, must not go out of scope before the ChangeMusic is called. 
// ... stuff ... 
timer_id = SDL_AddTimer(3000, &Mylene::ChangeMusic, &mylene);   // Passing the mylene object... 

... Do other things here for some time ... 
于 2013-01-05T00:07:35.553 に答える