UI问题
- 最近几个月也做了有几款小游戏,有了一些问题。
- 我一开始没有搞什么UI框架,可是各个UI界面之间需要打开,比如
开始界面
的开始按钮
点击之后打开选择关卡
界面。 - 选择界面的关卡按钮点击之后需要打开游戏界面。
- 在我没有写框架的情况下,每个UI界面内部都需要有一个
Open()
和Close
方法,而且为了调用这些方法,我需要他们之间相互引用,即 StartPanel
保存了SelectPanel
的引用,SelectPanel
保存了GamePanel
的界面【我没有设置一个UICenter
的总控制类】- 而且每个UI本身都需要一个初始化的过程,
Init()
,UI界面需要在这个初始化里面进行按钮绑定
的功能,通常来说按钮绑定只需要一次
- 还有,UI界面的
回调
- 回调有三种形式,
- 将回调函数以
参数
的形式放置进去,
void DoSomeThing(int param, Action callback)
{
callback.Invoke();
}
- 订阅者模式
public Event OnValueChanged;
publiv void ChangeGravity(int val){
OnValueChanged.Invoke(val)
}
-
上面这两种的区别在于,订阅者模式是面向更多的人的,而回调那种形式只面对一个,
-
我也产生了这么一个困惑。
//我在写代码的时候已经知道这个函数执行完要打开游戏界面
//所以我有下面两种应对方式
void DoSomething(){
...
UICenter.Inst.OpenGamePanel();
}
Action callback = ()=>{
UICenter.Inst.OpenGamePanel();
}
void DoSomething(callback){
...
callback.Invoke();
}
- 传递函数那种形式更多是用在一个封装性完好的类里面,给别人使用的时候暴露出来的接口。也就是说你不知道别人要干嘛,但是留着这么一个接口给别人使用。
- 如果自己写代码,知道下一步要干嘛,直接写在函数里面就是了。这样还可以避免
GC
接口方面的困惑
- 接口本身是一个给别人的约定,是给别人来使用的。
- 他和虚函数重写是同样的作用
interface IPoolContext
{
void OnSpawn();
void OnCreate();
}
abstract class Pool{
virtual OnSpawn(){ }
void Spawn(IPoolContext context)
{
OnSpawn();
context.OnSpawn();
}
}
- 可以在上面看到,
OnSpawn
函数本身一个是用在Pool
自身的,即他生成对象的时刻
,一个是用在生成对象的被生成的时刻
,这是两个事件。