随机延迟后OpenGL ES执行选择器

时间:2012-02-01 02:04:32

标签: objective-c ios cocoa opengl-es performselector

我正在开发一个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 ...

    }
}

1 个答案:

答案 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];
}