使用C ++处理iPhone中的触摸检测?

时间:2009-12-03 06:09:05

标签: c++ iphone cocoa-touch

我正在开发一款针对iPhone的游戏,原因有很多,大部分代码都是用C ++编写的。我需要为我的游戏编写一个TouchesManager,我知道touchesBegan的方法:touchesEnded:和touchesMoved:

我真的想用C ++创建一个管理器,所以我可以为这个管理器订阅一些类,这样他们就可以在我的游戏中处理触摸事件。我一直在考虑制作一个C ++接口来处理“touchesBegan:ends:and moved:”,我可以在我有兴趣回应触摸的类中实现...

我真的很想知道一个简单的方法可以实现,我真的需要保留C ++有很多原因(我喜欢Obj-C / Cocoa-touch,请不要误解我的意思)

谢谢大家!

2 个答案:

答案 0 :(得分:2)

在更高级别,我将使用确切的参数/名称(甚至可能是self和_cmd)创建一个C ++基类。在某个地方,您需要创建这些,并建立从管理器到查询对象的连接。

objc对象可以保存指向其C ++实现/接收器的指针,也可以使用索引,或者可以使用self和hash / map方法。

因此管理器可以保留一组事件接收器,然后UIView将实现该方法,该方法将消息转发给管理器以解析命令(您如何处理命令/事件?)。

或者,如果你想要的只是实现,那么只需使用ObjectiveC ++并将事件接收器/处理器作为ivar添加到UIResponder。

增加:添加了一个快速的伪代码插图'然后只使用ObjectiveC ++并将事件接收器/处理器作为ivar添加到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

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

答案 1 :(得分:0)

据我所知,你不能直接用C ++处理触摸事件,它们只是作为Obj-C事件引发的。但是,您可以在Obj-C ++中编写一个非常精简的抽象,它接收触摸事件,然后在C ++ TouchManager上调用相应的触摸命令。请注意,TouchManager必须是线程安全的:)