我目前在各种SKScene课程中都有我的所有按键代码。我只想在每次按下按键时发生一些事情。需要重新触发密钥才能再次执行操作。我正在使用布尔数组来跟踪这一点。这可能不是最佳的,但这是我当时的想法。我想创建一个类来管理所有这些,但是关键事件方法keyUp和keyDown是在SKScene类中创建的。是否有全局方式来处理按键操作,这样我就不必在游戏中的每个场景中重新创建此代码?
答案 0 :(得分:2)
您可以继承SKView
并在集中位置执行所有按键操作。这种方法有几个好处:1。由于所有按键逻辑都在一个类中,因此对该类进行逻辑更改而不是在所有场景中进行更改; 2)它从多个场景中删除特定于设备的输入逻辑。例如,如果您决定将应用程序移植到iOS,则只需将键盘/鼠标界面更改为单个文件中的触摸即可。
以下是SKView
的自定义子类中的按键处理程序的实现。它使用协议/委托设计模式将按键消息发送到各种场景。委托是对象(在本例中是一个类)与其他类进行通信的便捷方式,协议定义了这种通信的发生方式。
<强> 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
<强> GameScene.h 强>
#import "CustomSKView.h"
@interface GameScene : SKScene <KeyPressedDelegate>
@end
<强> 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
SKView
的类设置为自定义类:
答案 1 :(得分:0)
我建议使用Singleton模式来存储和获取密钥。因为您可以从SKScene到达,而不是随时创建或更新。
http://www.galloway.me.uk/tutorials/singleton-classes/这个单身介绍是快而短的。