Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将bool设置为true持续两秒钟,然后更改回false_Ios_Objective C_Sprite Kit - Fatal编程技术网

Ios 将bool设置为true持续两秒钟,然后更改回false

Ios 将bool设置为true持续两秒钟,然后更改回false,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,如问题所述,在spritekit中,我试图找到一种方法,将布尔值从false改为true,在x秒的时间内太true,然后将其改回false。 逻辑是我有这个变量,isStunned,当我的玩家与x精灵接触时,我称之为,我的操纵杆被禁用,因为玩家“晕眩” 当我的玩家接触胶水时,我将isStunned设置为yes,操纵杆被禁用,但是我想知道一种方法,可以只禁用我的操纵杆,或者在x秒内不移动我的精灵。我知道SKAction和等待序列,但这些都是操作,我认为它们在这里不适用。感谢您的帮助 谢谢将您感兴趣

如问题所述,在spritekit中,我试图找到一种方法,将布尔值从false改为true,在x秒的时间内太true,然后将其改回false。 逻辑是我有这个变量,isStunned,当我的玩家与x精灵接触时,我称之为,我的操纵杆被禁用,因为玩家“晕眩”

当我的玩家接触胶水时,我将isStunned设置为yes,操纵杆被禁用,但是我想知道一种方法,可以只禁用我的操纵杆,或者在x秒内不移动我的精灵。我知道SKAction和等待序列,但这些都是操作,我认为它们在这里不适用。感谢您的帮助


谢谢

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


有关如何使用
NSTimer
的说明,请参阅此SO线程:

,因为您特别使用spritekit标记进行询问

不要在游戏中使用NSTimer或actions来处理时间。而是使用update函数。如果以60fps的速度运行,则意味着更新函数将被调用120次,持续两秒钟。使用帧而不是秒来保持游戏更新将避免游戏玩法因延迟而改变。例如,想象一下,玩家的游戏有点滞后,换句话说,运行较慢。2秒仍然是2秒,不考虑游戏延迟,所以现在他受胶水的影响比没有延迟的人小。所以

首先,你应该有一个变量来跟踪游戏时间:
int\u time

在每个更新周期中,您都会向time添加一个:
\u time++

您应该有一个变量来跟踪用户何时触摸胶水:
int\u glueTouchedAtTime

当用户单击您设置的胶水时:
\u glueTouchedAtTime=time

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

启动游戏时,将
\u glueTouchedAtTime
设置为:
\u glueTouchedAtTime=-GLUE\u时间
防止胶水在
(\u time==0)

测试用户是否接触过胶水,其工作原理如下:

if(_glueTouchedAtTime+GLUE_TIME>time) {
    // Glue is active
} else {
    // Glue is not active
}
不同雪碧的不同胶水

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

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

现在您可以测试:

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

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

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

检查NSTimer功能。。。也许这适合你的情况谢谢大家给我指出了正确的方向使用一个SKAction运行块,waitforduration操作包装在repeatforever中。“不要使用NSTimer,因为计时器在暂停视图、场景或节点或运行过渡时不会自动暂停。@LearnCos2D我正在考虑,但我不想在精灵上运行操作…”“照此说”。精灵的移动或不移动是由一个变量决定的。效果非常好,除了我在这一行有一个问题,如果((_glueTouchedAtTime+GLUE_TIME)>_TIME)如果我删除“GLUE_TIME并放置120”它就起作用。但就像这样,它说“如果身体是空的”,也就是说我想要不同的“胶水”来粘我的雪碧不同的时间。明智的做法是超越更新功能,说这样的话-(void)update:(NSTimeInterval)currentTime timestuck:(float)timestuck{GLUE_TIME是一个已定义的常量,因此在使用它之前需要先定义它。如果您愿意,可以在此处使用硬编码的int,但我建议使用一个包含以下常量的文件。我已编辑了我的答案,以反映您对多个GLUE的评论。
SKAction *wait = [SKAction waitForDuration:2.0];
SKAction *reenableJoystick = [SKAction runBlock:^{
    joystick.userInteractionEnabled = TRUE;
}];
SKAction *sequence = [SKAction sequence:@[wait, reenableJoystick]];
[self runAction:sequence];