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