将一个bool设置为true两秒钟然后再改回false

时间:2014-05-01 05:15:16

标签: ios objective-c sprite-kit

正如问题所述,在spritekit中我试图找到一种方法来改变我的bool值来自false,对于x秒数也是如此,然后将其更改回false。 逻辑是我有这个var,isStunned,当我的玩家与x精灵接触时我调用它并且我的操纵杆被禁用,因为玩家被“震惊”

 if (controlButtonDown) { // If i pressed joystick
    if (!isStunned) { // IF i am not stunned
  //move player

当我的玩家触摸胶水时,我设置isStunned为是并且操纵杆被禁用,但是我想知道一种方法只能禁用我的操纵杆或不移动我的精灵x秒。我知道SKAction和等待序列,但这些都是行动,我不认为它们会在这里适用。任何帮助表示赞赏。

谢谢

3 个答案:

答案 0 :(得分:3)

因为你特意使用spritekit标签。

请勿使用NSTimer或操作在游戏中使用时间。而是使用更新功能。如果你以60fps运行,这意味着更新功能将被调用120次,持续两秒钟。使用帧而不是秒来保持游戏更新将避免游戏玩法因滞后而改变。想象一下,例如玩家游戏稍微滞后,换句话说运行速度较慢。不管比赛滞后,2秒仍然是2秒,所以现在他受胶水的影响要小于没有滞后的人。所以......

首先,你应该有一个变量跟踪游戏时间:int _time;

在每个更新周期中,您都会添加一个时间:_time++;

你应该有一个变量来跟踪用户何时触摸胶水:int _glueTouchedAtTime;

当用户点击胶水时,您设置:_glueTouchedAtTime = time;

您应该有一个常量来定义胶水的活动时间:#define GLUE_TIME 120;

当您启动游戏时将_glueTouchedAtTime设置为:_glueTouchedAtTime = -GLUE_TIME;以防止在(_time == 0)

时打开胶水

测试用户是否接触过胶水现在的工作原理如下:

if(_glueTouchedAtTime+GLUE_TIME>time) {
    // Glue is active
} else {
    // Glue is not active
}

不同精灵的不同胶水

要为不同的精灵使用不同的胶水,我建议首先根据您的需要将一般游戏对象(GameObject)作为SKNode或SKSpriteNode的子类。然后创建一个名为GameObjectGluable的GameObject子类。这应该有一个名为的属性:@property int gluedAtTime;

通过以下方式粘合可粘合游戏对象:aGameObjectGluable.gluedAtTime = time;

现在你可以测试:

if(aGameObjectGluable.gluedAtTime +GLUE_TIME>time) {
  // Game Object is glued
} else {
  // Game object is not glued
}

答案 1 :(得分:0)

将您感兴趣的值设置为true,然后在两秒后触发NSTimer将其设置为false。

有关如何使用NSTimer的说明,请参阅此SO主题:How do I use NSTimer?

答案 2 :(得分:0)

您也可以使用SKAction。 runBlock方法允许您执行代码块作为操作。

SKAction *wait = [SKAction waitForDuration:2.0];
SKAction *reenableJoystick = [SKAction runBlock:^{
    joystick.userInteractionEnabled = TRUE;
}];
SKAction *sequence = [SKAction sequence:@[wait, reenableJoystick]];
[self runAction:sequence];