正如问题所述,在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和等待序列,但这些都是行动,我不认为它们会在这里适用。任何帮助表示赞赏。
谢谢
答案 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];