Поддержка кнопки "Назад" на Android для Cocos2d v3.x через Apportable
Как описано в Apportable Doc, я создал подкласс UIResponder
названный AndroidButtonManager
чтобы в моем текущем проекте cocos2d-iPhone v3.1 была поддержка событий касания аппаратных кнопок (назад, нажатие кнопки "Домой"). Вот коды интерфейса и файлы реализации
AndroidButtonManager.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface AndroidButtonManager :UIResponder<UIApplicationDelegate>{
}
+(instancetype) sharedManager;
@end
а также AndroidButtonManager.m
#import "AndroidButtonManager.h"
@implementation AndroidButtonManager
+(instancetype)sharedManager
{
static AndroidButtonManager* sharedManager;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedManager = [[self alloc]init];
});
return sharedManager;
}
-(instancetype)init{
if (self = [super init]) {
[self canBecomeFirstResponder];
}
return self;
}
#ifdef ANDROID
// ----------------------------------------------------------------
// OVER RIDING PARENT CLASS METHOD
// ----------------------------------------------------------------
-(BOOL)canBecomeFirstResponder
{
[[AlertManager sharedManager] showAlertWithHeading:@"canBecomeFirstResponder" andMessage:@"AndroidButtonManager"];
return YES;
}
- (void)buttonUpWithEvent:(UIEvent *)event
{
[[AlertManager sharedManager] showAlertWithHeading:@"buttonUpWithEvent" andMessage:@""];
switch (event.buttonCode)
{
case UIEventButtonCodeBack:
[[AlertManager sharedManager] showAlertWithHeading:@"Back Button" andMessage:@"Home Button touched , going to transit to Menu Layer"];
break;
case UIEventButtonCodeMenu:{
[[AlertManager sharedManager] showAlertWithHeading:@"Home Button" andMessage:@"Home Button touched , going to transit to Menu Layer"];
break;
}
default:
break;
}
}
#endif
@end
И я создаю общий менеджер в AppDelegate -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
от
#ifdef ANDROID
[AndroidButtonManager sharedManager];
#endif
Я получаю предупреждение от [[AlertManager sharedManager] showAlertWithHeading:@"canBecomeFirstResponder" andMessage:@"AndroidButtonManager"];
, но предупреждение от [[AlertManager sharedManager] showAlertWithHeading:@"buttonUpWithEvent" andMessage:@""];
никогда не появляется как - (void)buttonUpWithEvent:(UIEvent *)event
никогда не называется.
Я пытался реализовать это в AppDelegate.m
как указано в Google группы Apportable. Оба не работают. Есть ли пример проекта, реализующего поддержку кнопки "Назад" в Android в Cocos2d-v3.x?
Заранее спасибо.
1 ответ
О, наконец, понял. Просто нужно сделать категорию CCDirector
в котором будет выполнен код обработки кнопки. Вот код моего CCDirector
название категории CCDirector+ButtonManager
,
Интерфейсный файл CCDirector+ButtonManager.h
#import "CCDirector.h"
@interface CCDirector (ButtonManager)
- (BOOL)canBecomeFirstResponder;
@end
Файл реализации CCDirector+ButtonManager.m
#import "CCDirector+ButtonManager.h"
@implementation CCDirector (ButtonManager)
#ifdef APPORTABLE
- (void)buttonUpWithEvent:(UIEvent *)event {
switch (event.buttonCode)
{
case UIEventButtonCodeBack:
// handle back button here
[self showAlertWithHeading:@"buttonUpWithEvent" andMessage:@"BACK BUTTON"];
break;
case UIEventButtonCodeMenu:
// show menu if possible.
[self showAlertWithHeading:@"buttonUpWithEvent" andMessage:@"MENU BUTTON"];
break;
default:
break;
}
}
- (BOOL)canBecomeFirstResponder {
[[AlertManager sharedManager] showAlertWithHeading:@"canBecomeFirstResponder" andMessage:@"CCDirector"];
return YES;
}
#endif
-(void)showAlertWithHeading:(NSString*)alertHeading andMessage:(NSString*)alertMessage
{
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:alertHeading
message:alertMessage
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[alertView show];
}
@end
И инициализировать его в AppDelegate
"s -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
от
#ifdef APPORTABLE
[[CCDirector sharedDirector] becomeFirstResponder];
#endif