-2

ゲームでボールが速くなることを望んでいます。posでは、ボールの速度を選択できます。しかし、私はボールが5秒ごとに速くなることを望んでいます。pos = CGPointMake(5.0,4.0); 5秒後、5.0は6.0に、4.0は5.0に変わります。

MainIntという名前のタイマーがあります。MainIntはカウンターであり、失うことなくプレイしている時間をカウントします。

タイマーを表示するラベルもあります。(IBOutlet UILabel * seconds; .h)

.m


-(void)viewDidLoad {

[lastTime setHidden:YES];


[super viewDidLoad];
// X Speed Y Speed
pos = CGPointMake(5.0,4.0); // <- these numbers (add 1 each every 5 sec.)
Speedy = [NSTimer scheduledTimerWithTimeInterval:5.0  target:self selector:@selector(doThis) userInfo:nil repeats:YES];

}

/*




-(void)doThis {



if(MainInt % 5 == MainInt)     //True every 5th second
{

    pos = CGPointMake();
}

}
*/
4

1 に答える 1

1

1 つには、 5 秒後にMainInt % 5 == MainIntは永遠にfalseになります。1-4 は、MainIntそれを真にする唯一の値です。モジュロ演算子の仕組みを確認することを検討してください。これを に変更したとしてもMainInt % 5 == 0、これは正しいことですが、なぜ外部の非同期時間値に関して何かをチェックしているのかを自問する必要があります。これが行うことは、タイマーが同期していない場合、呼び出し間の遅延を5秒に設定しているため、呼び出されるたびに何もしないようにすることだけです。すべてをうまく同期させたい場合は、フレームごとにゲームの状態を更新する必要があるメソッドを呼び出すことができるゲーム ループを担当するメインの NSTimer または CADisplayLink を 1 つ用意する必要があります。

このように、すべてのタイマーを個別に使用して、それらをメインの時間値と同期させたい場合は、ここで行います。

//replace timer line with this one
Speedy = [NSTimer scheduledTimerWithTimeInterval: 0.1  target:self selector:@selector(doThis) userInfo:nil repeats:YES];

//replace body of "doThis" with the following
if(MainInt % 5 == 0) //True every 5th second
{
    pos = CGPointMake(pos.x + 1, pos.y + 1);
}

また、ある種の命名規則に従い、より明確な名前を付けるようにしてください。がボールの速度なら、位置ではなくpos名前を付けるべきではありませんvelocityか? Speedy、インスタンス変数とは何ですか? もしそうなら、なぜそれは大文字ですか?さらに、Speedy は私が今まで聞いた中で最も不明確な名前の 1 つです。それはペットではなく、変数です。についても同じですMainInt。一般に、クラス名には大文字の名前を予約し、インスタンス変数、メソッド、および関数にはキャメル ケースを使用します。それはあなたのコードをより明確にします。:)

于 2013-01-13T17:59:18.913 に答える