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

时间:2015-07-08 06:25:09

标签: objective-c macos sprite-kit keyboard-events

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

2 个答案:

答案 0 :(得分:2)

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

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

  1. 创建SKView的子类
  2. <强> CustomSKView.h

    @protocol KeyPressedDelegate;
    
    @interface CustomSKView : SKView
    
    @property (weak) id <KeyPressedDelegate> delegate;
    
    @end
    
    @protocol KeyPressedDelegate
    
    - (void) upArrowPressed;
    - (void) downArrowPressed;
    
    @end
    

    <强> CustomSKView.m

    所有按键处理逻辑都在此处。处理按键操作的细节隐藏在按键操作的代码中。

    @implementation CustomSKView:SKView {
        // Add instance variables here
    }
    
    // This is called when the view is created.
    - (id) initWithCoder:(NSCoder *)coder {
        self = [super initWithCoder:coder];
        if (self) {
            // Allocate and initialize your instance variables here
    
        }
        return self;
    }
    
    - (void) keyDown:(NSEvent *)theEvent {
        // Add code to handle a key down event here
        if (self.delegate) {
            switch (theEvent.keyCode) {
                case 126:
                    [self.delegate upArrowPressed];
                    break;
                case 125:
                    [self.delegate downArrowPressed];
                    break;
                default:
                    break;
            }
        }
    }
    
    @end
    
    1. 采用协议
    2. <强> GameScene.h

      #import "CustomSKView.h"
      
      @interface GameScene : SKScene <KeyPressedDelegate>
      
      @end
      
      1. 在需要按键信息的所有场景中实施委托方法
      2. <强> GameScene.m

        @implementation GameScene
        
        -(void)didMoveToView:(SKView *)view {
            ((CustomSKView *)view).delegate = self;
        }
        
        - (void) upArrowPressed {
            NSLog(@"Up Arrow Pressed");
        }
        - (void) downArrowPressed {
            NSLog(@"Down Arrow Pressed");
        }
        
        @end
        
        1. 在主.xib文件中,将SKView的类设置为自定义类:
        2. enter image description here

          enter image description here

答案 1 :(得分:0)

我建议使用Singleton模式来存储和获取密钥。因为您可以从SKScene到达,而不是随时创建或更新。

http://www.galloway.me.uk/tutorials/singleton-classes/这个单身介绍是快而短的。