繁体   English   中英

基于Obj-C组件的游戏架构和消息转发

[英]Obj-C component-based game architecture and message forwarding

我一直在尝试使用Objective-C实现一个简单的基于组件的游戏对象架构,这与Mick West的文章“Evolve Your Hierarchy”非常相似。 为此,我成功地使用了Mike Ash的文章“Objective-C Message Forwarding”中概述的一些想法,也就是说使用-(id)forwardingTargetForSelector:方法。

基本设置是我有一个容器GameObject类,它包含三个组件类实例作为实例变量:GCPositioning,GCRigidBody和GCRendering。 -(id)forwardingTargetForSelector:方法返回响应相关选择器的任何组件,使用-(BOOL)respondsToSelector:方法确定。

所有这些在某种程度上都像魅力一样:我可以在GameObject实例上调用一个方法,在其中一个组件中找到实现,并且它可以工作。 当然,问题是编译器为每个调用提供“可能不响应...”警告。 现在,我的问题是,我该如何避免这种情况? 特别是关于这样一个事实,即GameObject的每个实例都有一组不同的组件? 也许是一种在每个对象的对象基础上用容器对象注册方法的方法? 比如,我可以创建某种-(void)registerMethodWithGameObject:方法,我该怎么做?

现在,我可能或者可能不是很明显,我对Cocoa和Objective-C来说相当新,而且基本上只是在四处逛逛,而这整件事情在这里可能非常陌生。 当然,虽然我非常想知道我的具体问题的解决方案,但是任何想要解释更优雅的方式的人都会非常受欢迎。

非常感谢,-Bastiaan

我不认为发送容器对象的所有组件的消息是Mick West所建议的 - 这无助于消除“单片游戏实体对象”的想法。

最终的目标是让组件彼此直接通信,根本没有容器对象。 在此之前,容器对象充当旧代码之间的粘合剂,旧代码期望每个游戏实体的单个对象和新的组件到组件系统。

也就是说,你不应该在最终产品中根本不需要使用消息转发,所以忽略警告,或者现在将变量声明为id来安静它们,并不是那么难看。 (该文章规定的计划是最终删除导致警告的代码!)

让这些警告消失的一种简单方法是声明类型为id的实例变量

这样,编译器会假设您知道您正在做什么关于对象的类型,并且对象将响应您发送给它的任何消息,或者如果它不是您不关心。

覆盖GameObject的-respondsToSelector:方法。 您的实现应该依次向每个实例发送一个respondsToSelector:消息,如果其中任何一个返回YES则返回YES

您可以使用id类型 - 或者您可以使用performSelector方法调用方法,或者如果参数很复杂,则创建NSInvocation。 然而,这只是一种绕过编译器警告的方法。 如果您的对象响应了多种方法,那么可能会声明协议可能有所帮助,尽管同样的警告也适用。

如果我正确理解问题,另一个选择是实现协议。 这是链接java中的接口,变量可以这样声明:

id anObjectRef

这样编译器就会理解anObjectRef引用的对象符合协议。

在转换或分配特定对象之前,还有一些方法可以告诉您特定对象是否符合特定协议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM