Обработка обнаружения касания в iPhone с C ++? - PullRequest
0 голосов
/ 03 декабря 2009

Я работаю над игрой для iPhone, по нескольким причинам большая часть кода написана на C ++. Мне нужно написать TouchesManager для моей игры, я знаю о методах touchesBegan: touchesEnded: и touchesMoved:

Мне бы очень хотелось создать менеджера в C ++, чтобы я мог подписать некоторые классы на этот менеджер, чтобы они могли обрабатывать сенсорные события в моей игре. Я думал о создании интерфейса C ++ для обработки «touchesBegan: end: and move:», который я мог бы реализовать в классах, которые мне интересны, чтобы реагировать на прикосновения ...

Мне бы очень хотелось узнать хороший простой способ, которым это может быть достигнуто, мне действительно нужно держать C ++ по многим причинам (я люблю Obj-C / Cocoa-touch, не поймите меня неправильно, пожалуйста)

Спасибо всем!

Ответы [ 2 ]

2 голосов
/ 03 декабря 2009

На более высоком уровне я бы создал базовый класс C ++ с точными аргументами / именами (возможно, даже self и _cmd). Где-то вам нужно будет создать их и установить соединения от менеджера к запрашиваемым объектам.

Объекты objc могут содержать указатель на их реализацию / приемник C ++, или вы можете использовать индекс, или вы можете использовать self и подход хеш / карта.

Таким образом, менеджер может удерживать коллекцию получателей событий, а затем UIView реализует метод, который будет перенаправлять сообщение менеджеру для анализа команды (что вы делаете с командами / событиями ??).

В качестве альтернативы, если вам нужна только реализация, просто используйте ObjectiveC ++ и добавьте приемник / процессор событий в качестве ивара в UIResponder.

Добавление: добавлен быстрый пример псевдокода для «затем просто используйте ObjectiveC ++ и добавьте приемник / процессор событий в качестве ивара для UIResponder».

// Mr.Gando:
// To answer your question about what do I need to do with events,
// for example I need to subscribe a button to the manager, so when
// it get's touched, a method "Fire" is called... just an example,
// but I think your answer is good. Does this Manager have to be
// thread safe ?

/////////////////////////////////////////////////////////////////////

/* not declared in event_manager_t's scope, so that objc only files may declare members without error - if all your code is objc++, then relocate */
class mon_event_manager_event_handler_t {
/* ... */

    void touchesBegan(id sender, NSSet * touches, UIEvent * event) {
        assert(sender && touches && event);
        assert(this->getResponder() && this->getResponder() == sender);

        if (this->getResponder() && this->getResponder() == sender && this->isSubscribed() && this->isInterestedInTouchesBeganEvents()) {
            SharedEventManager().touchesBegan(this, sender, touches, event);
        }
    }

private:
    UIResponder * responder_;
    UInt32 flags_EventsOrActionsOfInterest_;
    bool isSubscribed_;
};

/** implement as singleton */
class event_manager_t {
/* ... */

    void touchesBegan(handler_t* const handler, id sender, NSSet * touches, UIEvent * event) {
        this->fire();
    }

    void fire() {
        NSLog(@"Fire()");
        /* you can message anything here, just realize that events may not occur on the recipient's work thread */
    }

    static mon_event_manager_event_handler_t* CreateNextHandler(UIResponder * responder) {
    /* SharedEventManager() must guard its data here */
        mon_event_manager_event_handler_t* result(SharedEventManager().createOrReuseHandler());
        result->setResponder(responder);
        SharedEventManager().registerNewHandler(handler);
        return result;
    }

    static void RemoveHandler(mon_event_manager_event_handler_t* handler) {
    /* SharedEventManager() must guard its data here */
        SharedEventManager().removeHandler(handler);
    }

};

/** @return the event_manager_t singleton object */
event_manager_t& SharedEventManager();

/////////////////////////////////////////////////////////////////////

struct mon_event_manager_event_handler_t;

@interface MonResponder
{
    mon_event_manager_event_handler_t* handler_;
}

@end

/////////////////////////////////////////////////////////////////////

@implementation MonResponder

/* ... */

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    assert(handler_ && "TODO: create the handler");
    handler_->touchesBegan(self, touches, event);
    /* ... */
}

@end

/////////////////////////////////////////////////////////////////////
0 голосов
/ 03 декабря 2009

Насколько я знаю, вы не можете обрабатывать сенсорные события напрямую с C ++, они вызываются только как события Obj-C. Однако вы можете написать очень тонкую абстракцию в Obj-C ++, которая получает сенсорные события и затем вызывает соответствующие сенсорные команды на вашем C ++ TouchManager. Имейте в виду, что TouchManager должен быть поточно-ориентированным:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...