Objective c SpriteKit游戏的全局密钥处理程序

Objective c SpriteKit游戏的全局密钥处理程序,objective-c,macos,sprite-kit,keyboard-events,Objective C,Macos,Sprite Kit,Keyboard Events,我目前在我的各种SKScene类中有我所有的按键代码。我只希望每次按键时都有事情发生。需要重新触发该键才能再次执行该操作。我用一个布尔数组来跟踪它。这可能不是最好的,但这是我当时的想法。我想创建一个类来管理所有这些,但是关键事件方法keyUp和keyDown是在SKScene类中创建的。是否有一种全局方法来处理按键操作,这样我就不必在游戏中的每个场景中重新创建此代码?我建议使用单例模式来存储和获取您的按键。因为您可以从场景中访问,然后随时创建或更新 此单例介绍快速而简短。您可以将SKView子类

我目前在我的各种SKScene类中有我所有的按键代码。我只希望每次按键时都有事情发生。需要重新触发该键才能再次执行该操作。我用一个布尔数组来跟踪它。这可能不是最好的,但这是我当时的想法。我想创建一个类来管理所有这些,但是关键事件方法keyUp和keyDown是在SKScene类中创建的。是否有一种全局方法来处理按键操作,这样我就不必在游戏中的每个场景中重新创建此代码?

我建议使用单例模式来存储和获取您的按键。因为您可以从场景中访问,然后随时创建或更新


此单例介绍快速而简短。

您可以将
SKView
子类化,并在集中位置执行所有按键操作。这种方法有几个好处:1。由于所有按键逻辑都在一个类中,因此对该类而不是所有场景中的逻辑进行更改;2)它从多个场景中删除特定于设备的输入逻辑。例如,如果您决定将应用程序移植到iOS,您只需将界面从键盘/鼠标更改为单个文件中的触摸

以下是
SKView
的自定义子类中按键处理程序的实现。它使用协议/委托设计模式向各种场景发送按键消息。委托是对象(在本例中是类)与其他类通信的一种方便方式,协议定义了这种通信将如何进行

  • 创建SKView的子类
  • CustomSKView.h

    @protocol KeyPressedDelegate;
    
    @interface CustomSKView : SKView
    
    @property (weak) id <KeyPressedDelegate> delegate;
    
    @end
    
    @protocol KeyPressedDelegate
    
    - (void) upArrowPressed;
    - (void) downArrowPressed;
    
    @end
    
    #import "CustomSKView.h"
    
    @interface GameScene : SKScene <KeyPressedDelegate>
    
    @end
    
  • 通过议定书
  • 游戏场景.h

    @protocol KeyPressedDelegate;
    
    @interface CustomSKView : SKView
    
    @property (weak) id <KeyPressedDelegate> delegate;
    
    @end
    
    @protocol KeyPressedDelegate
    
    - (void) upArrowPressed;
    - (void) downArrowPressed;
    
    @end
    
    #import "CustomSKView.h"
    
    @interface GameScene : SKScene <KeyPressedDelegate>
    
    @end
    
  • 在main.xib文件中,将
    SKView
    的类设置为自定义类:

  • 带有NSNotifications的Singleton。当按下一个键时,您希望发生什么?您希望在当前场景(例如游戏场景)中调用一个方法,还是只希望从每个场景访问该布尔数组?目前,这主要用于菜单项选择。例如,当用户按下时,指示器应该移动到下一个菜单项。我现在有几个关于游戏数据等的单例类。我对协议/委托部分有点困惑。我用作子类的类是单例类吗?是的,
    CustomSKView
    类是单例类。您可以在该类中添加所有按键处理逻辑,并根据按下的按键调用相应的委托方法(请参阅我刚才添加的
    upArrowPressed
    downArrowPressed
    方法)。由于
    GameSecene.m
    必须创建并实现这些方法,只使用我以前使用的
    keyUp
    keyDown
    方法有什么区别?正如我之前所说,我不太清楚代表/协议的全部要点,我想我遗漏了你解释的一大部分。我在回答中添加了代表和协议的描述。谢谢,这非常有帮助!我已经把它作为一个测试项目来运行,现在我正在将我实际项目所需的特性结合起来。对于您所说的“在此处添加实例变量”部分,我从未见过类的
    @实现
    部分这样使用。我通常在
    @interface
    部分或.h文件中声明它们。如何初始化它们?