2009-12-03 38 views
0

我正在为iPhone开发一款游戏,因为大部分代码都是用C++编写的。我需要为我的游戏编写一个TouchesManager,我知道touchesBegan的方法:touchesEnded:和touchesMoved:用C++处理iPhone中的触摸检测?

我真的很想在C++中创建一个管理器,所以我可以订阅一些类到这个管理器,以便他们能够处理触摸我的游戏中的事件。我一直在考虑制作一个C++接口来处理“touchesBegan:ending:and moving:”,我可以在类中实现我感兴趣的反应触摸...

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

谢谢大家!

+0

对于多级设计,给定的规范有点模糊,不是吗? – justin 2009-12-03 06:23:27

回答

2

在更高层次上,我将创建一个具有确切的参数/名称(甚至可能是自我和_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 

///////////////////////////////////////////////////////////////////// 
+0

要回答你关于我需要怎样处理事件的问题,例如我需要向经理订阅一个按钮,所以当它触及时,会调用一个“Fire”方法......只是一个例子,但我认为你的答案很好。这个经理是否必须是线程安全的? – Goles 2009-12-03 13:12:04

0

就我所知,你不能直接用C++处理触摸事件,它们只会被提升为Obj-C事件。然而,您可以在Obj-C++中编写非常简单的抽象接收触摸事件,然后在C++ TouchManager上调用相应的触摸命令。请注意,TouchManager将不得不然后线程安全:)