关于游戏结构的一点疑问,父子关系问题

tangcat123 2014-07-17 10:30:20
比如你scene中有layer,然后你的scene得包含这个layer吧。。
然后你的layer里面需要访问到scene中的一些公共的数据,这种需求是不可能总是避免的啊。
这样一来layer中又需要包含scene了。
这样的话头文件会互相包含,当然头文件互相包含的问题可以解决,但是这样的结构是不是本来就应该不合理呢。
同理,游戏中有很多地方都有父子节点的的这种互相访问的关系,我该如何去做呢···
希望大家解决下我的疑惑~
...全文
256 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨木头 2014-07-18
  • 打赏
  • 举报
回复
太多这种互相访问的话,可能是你的逻辑写得不太好了,你可以说说你具体是实现什么样的功能,这样大家可能比较容易讨论~
zilaishuichina 2014-07-18
  • 打赏
  • 举报
回复
一般一个 1对多的关系 “1”中包含n个“多” “多”中引用这个“1”
tangcat123 2014-07-17
  • 打赏
  • 举报
回复
引用 2 楼 jiangcaiyang123 的回复:
对,管理类是一种有效的方法。一般来说管理类都由单例模式来实现。进行场景的切换也很方便。如果是C++,可以使用前向声明的方法来减少include依赖。 还有一个技巧,就是使用友元。将layer设为scene的友元,那么layer就可以顺利地根据其父控件scene访问scene的属性了。
用管理类确实很不错。还要几个问题仍然不解。 1.对场景这样专门搞个管理类讲的过去,对于父子节点这样相互调用的关系,甚至需要访问爷爷节点的内容,就不好再搞管理类了,如你说的,这种情况用友元解决。 2.不管用友元还是前向声明,你不也得去include么,如何能够减少include依赖,你只写一个class A而不去包含一个A.h这样是会报只有声明没有定义的错误的。
彩阳 2014-07-17
  • 打赏
  • 举报
回复
对,管理类是一种有效的方法。一般来说管理类都由单例模式来实现。进行场景的切换也很方便。如果是C++,可以使用前向声明的方法来减少include依赖。 还有一个技巧,就是使用友元。将layer设为scene的友元,那么layer就可以顺利地根据其父控件scene访问scene的属性了。
我要戒烟了 2014-07-17
  • 打赏
  • 举报
回复
一般我设计时会做一个scene的管理类(此类为单件模式),然后编写接口,传入scene的id或名子,获取此scene的实例 然后不论在什么地方,都可以使用此scene的管理类找到需要scene实例
daniel-du 2014-07-17
  • 打赏
  • 举报
回复
在继承了CCScene的类A里,记一个static A *Current,以后访问的话通过A::Current就行了,而且头文件相互包含的问题,用#program once就可以了,想麻烦一点,也可以#ifndef A #define A #endif
daniel-du 2014-07-17
  • 打赏
  • 举报
回复
这有什么不合理的,写多了自然就感觉合理了。 而且我从不用管理类什么的,一切都遵循kiis原则
彩阳 2014-07-17
  • 打赏
  • 举报
回复
引用 3 楼 tangcat123 的回复:
[quote=引用 2 楼 jiangcaiyang123 的回复:] 对,管理类是一种有效的方法。一般来说管理类都由单例模式来实现。进行场景的切换也很方便。如果是C++,可以使用前向声明的方法来减少include依赖。 还有一个技巧,就是使用友元。将layer设为scene的友元,那么layer就可以顺利地根据其父控件scene访问scene的属性了。
用管理类确实很不错。还要几个问题仍然不解。 1.对场景这样专门搞个管理类讲的过去,对于父子节点这样相互调用的关系,甚至需要访问爷爷节点的内容,就不好再搞管理类了,如你说的,这种情况用友元解决。 2.不管用友元还是前向声明,你不也得去include么,如何能够减少include依赖,你只写一个class A而不去包含一个A.h这样是会报只有声明没有定义的错误的。[/quote] 有一个办法,但是需要花很大的功夫。即想办法开发出一套名为“动态属性”的功能。 动态属性通过variant类型将所有基本类型和结构包含进来,通过setDynamicProperty( variableName, value )来设置,通过reinterpret_cast<SomeType>( dynamicProperty( variableName ) )来获取属性。目前Qt就可以做到这一点,它是建立在Core模块的QVariant类和QObject类上的。另外Boost的Variant库也可以。

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧