【问题标题】:Handling touch detection in iPhone with C++?使用 C++ 处理 iPhone 中的触摸检测?
【发布时间】:2010-12-22 17:15:01
【问题描述】:

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

我真的很想用 C++ 创建一个管理器,这样我就可以为这个管理器订阅一些类,这样它们就可以在我的游戏中处理触摸事件。我一直在考虑制作一个 C++ 接口来处理“touchesBegan:结束:并移动:”,我可以在我有兴趣响应触摸的类中实现它......

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

谢谢大家!

【问题讨论】:

  • 对于多类设计,给定的规范有点模糊,不是吗?

标签: c++ iphone cocoa-touch


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    所以管理器可以持有事件接收器的集合,然后 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
    
    /////////////////////////////////////////////////////////////////////
    

    【讨论】:

    • 回答你关于我需要对事件做什么的问题,例如我需要为管理器订阅一个按钮,所以当它被触摸时,一个方法“Fire”被调用......只是一个例子,但我认为你的回答很好。这个 Manager 必须是线程安全的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多