我正在开发一个OpenGL ES应用程序,我有一个装有6支枪的宇宙飞船。每支枪使用关键帧动画在开始和结束位置的两组顶点之间进行插值。
我有一个方法rotateGun:
我将gunNumber变量传递给它指的是哪个枪应该开火。当rotateGun:
发射时,它会产生激光爆炸,当我调用该方法时,我会从船上移开一个向下指向枪管的位置。这一切都很好,但我想为每支枪添加随机时间间隔,因为它们现在似乎同时发射。
我尝试使用performSelector:afterDelay:
创建时间延迟并触发我的rotateGun:方法,但这不起作用。然后,我尝试在延迟后使用方法mainGunFire:
,然后在主线程上调用rotateGun:
...这也不起作用。通过“没有工作”我的意思是我在rotateGun:
方法中的绘图调用之前插入的NSLog会打印,但枪支和爆炸从未被绘制。
如果我只是执行一个performSelectorOnMainThread来调用rotateGun:
,那么就像以前一样绘制枪支和爆炸,并且爆炸似乎同时发射。我显然不理解某事。有人可以帮我理解如何略微随机化我的激光爆炸,这样他们不会同时发射吗?谢谢!
// Randomly Fire Gun
- (void)mainGunFire:(NSNumber *)gunNumber {
// Perform the Gun animation and fire on main thread
[self performSelectorOnMainThread:@selector(rotateGun:) withObject:gunNumber waitUntilDone:YES];
}
// Draw and Rotate the Guns
- (void)drawRotateGuns {
// Only shoot if this is not a ship life
if ( self.isLife == NO ) {
// Gun 1
// Set the pass variable to 1 and call the method
// after a variable amount of time
int randomTime = 0;
//[self performSelector:@selector(mainGunFire:) withObject:[NSNumber numberWithInt:1] afterDelay:randomTime];
[self performSelectorOnMainThread:@selector(rotateGun:) withObject:[NSNumber numberWithInt:1] waitUntilDone:YES];
// Gun 2 ...
// Gun 3 ...
}
}
答案 0 :(得分:0)
最简单的解决方案是使用!(rand()%some_number)
而不是1.试用some_number
值(每支枪必须不同)。但它应该不是很大。
例如,如果您使用2,则!(rand()%2) == 1
的概率约为0.5。因此,如果你每秒渲染60帧,你每秒将获得大约30次射击。对于!(rand()%20)你应该每秒大约3次火力。希望你明白。一些伪代码:
if( !(rand()%2) ) {
[gun1 fire];
}
if( !(rand()%3) ) {
[gun2 fire];
}