|
Июн
11
|
При работе с синглетоном Director на Cocos2d программа не реагирует на события касания при наличии в окне объекта “Scene“. Соответственно, реализация “UIApplicationDelegate” не получает уведомления “touchesBegan“.
Исправить эту особенность можно следующим образом:
1) внедрив протокол “TouchEventsDelegate” со следующей спецификацией:
1 2 3 4 5 6 7 8 9 10 11 | /**Touch event delegate * return YES if the event was handled * return NO if the event was not handled */ @protocol TouchEventsDelegate @optional - (BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (BOOL)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; - (BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; - (BOOL)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; @end |
2) связав с синглетоном обработчик событий:
1 | [[Director sharedDirector] addEventHandler:(id)touchEventDelegateHandler]; |
Пример
Так, например, файл ExampleAppDelegate.h можно откорректировать следующим образом:
1 2 3 4 5 | #import "cocos2d.h" @interface ExampleAppDelegate : NSObject { UIWindow *window; Scene* mScene1; } |
А в ExampleAppDelegate.m вызывать
1 | [[Director sharedDirector] addEventHandler:self]; |
например, так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | - (void)applicationDidFinishLaunching:(UIApplication *)application { // Инициализация окна window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // cocos2d будет наследовать эти значения [window setUserInteractionEnabled:YES]; [window setMultipleTouchEnabled:NO]; [[Director sharedDirector] attachInView:window]; [[Director sharedDirector] addEventHandler:self]; // Еще одна инициализация mScene1=[Scene node]; [[Director sharedDirector] runWithScene: mScene1]; [window makeKeyAndVisible]; } |
И реализовав “ccTouchesBegan“:
1 2 3 4 5 | -(BOOL)ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { // здесь какое-либо действие return YES; } |
Для обработки других событий касания (”ccTouchesMoved“, “ccTouchesEnded” и пр.) их реализуют по тому же принципу. Как вариант, перенаправьте событие другому классу, реализующему “TouchEventsDelegate“.
Разрыв связей “TouchEventsDelegate” выполняется следующим образом:
1 | [[Director sharedDirector] removeEventHandler:(id)touchEventDelegateHandler]; |


Июнь 11th, 2009 at 12:25
[...] касания. Больше информации по делегированию читаем здесь. Импортируйте два изображения, которые будут [...]
Июнь 12th, 2009 at 05:43
[...] Home Уроки iPhone SDK: Cocos2d: обработчик для событий касания [...]