Поддержка кнопки "Назад" на 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
Другие вопросы по тегам