小游戏开发中:类间数据如果互相访问?谢啦
小游戏的功能:地图类
地图类:class CMap //地图由二维数组画出
主角类:class CHero //主角由键盘控制行走,按空格发子弹
小怪类:class CEnemySmall //产生多个小怪,小怪随机移动的下一位置如果是主角,主角受到伤害
大怪类:class CBoss //随机移动,并随机发子弹,子弹位置是主角,主角受到伤害
商店类:class CShop //主角可以到商店买药品道具
其中:主角类,小怪类,大怪类由class CRole类派生
游戏我已经做完了,可还有些不太明白的地方。
游戏中,主角,怪物行走时,以及子弹的运动,都会改变地图类中二维数组中该点的数值;主角发射的子弹,会改变怪物的HP;怪物攻击,也会改变主角的血量;购买物品时,也会改变主角的数据……
也就是说,类的成员函数之间会相互访问和修改成员变量,怎样才能实现呢?我先是用友元函数友元类,后来我做的采用的全是公开的静态变量,和静态成员函数实现的。程序做完了,可是这样做,封装性是不是被破坏了?
象这样类之间数据互相访问的问题,一般是采用什么方法最好?要采用类组合吗?那又该如何组合?
我学C++不久,希望大哥们多指点呀??
[解决办法]
是不是需要增加一个中间者,用来进行协调控制?
而且成员变量的修改,一般类会提供get,set方法来给外部使用,而不是直接修改。
不知道怪物攻击、主角HP减,这个过程是怎样的。
猜想(没做过游戏相关):
1.怪物攻击
2.判断是否攻击到主角
3.攻击到主角
4.主角HP减
其中2,3,4需要主角类的参与。而2为怪物类传入攻击位置参数的地方,其他主角类可以自己完成。
问题就转化为怪物类如何将攻击位置参数传递给主角类的问题。
可以设置一个poss类,怪物类将参数给这个类,主角类也是从这个类中取参数。这个类是所有类的友元,或者也可以不是友元,而只是提供get,set方法。
或者也直接是怪物类提供一个get方法,主角类通过调用这个方法知道攻击位置。
随便想想,因为实际情况可能比较复杂,现在也想不出来。
设计模式还是可以看看的。不过那东西太枯燥了,而且有些很难用到C++中,倒是java和C#中比较好用。
[解决办法]
我觉得用LS的get set方法比较好,以前也做过跟传奇类似的游戏
原理就跟LZ这个差不多,其实我觉得只要把实体类分好就可以了,至于HP这些会随实体之间的作用
而变化的东西还是交给set这些接口来完成吧, 不要破坏封装性了
你可以直接写个如果改变HP的函数,这个函数写成全局的好了,不要进行封装也可以
顶
[解决办法]
//所有有生物体基类(包括主角和怪物)
class LivedObject
{
public:
//攻击时候调用的函数
virtual Hit(const LivedObject& object) {object.ReduceHp(this._damge);}
//受到伤害时候调用的函数
virtual ReduceHp(int damage) {this._hp -= damage};
private:
//自身生命值
int _hp;
//自身伤害力
int _damage;
};
//主角
class Leader : public LivedObject
{
};
//怪物基类
class Monster: public LivedObject
{
};
void Main()
{
Leader leader;
Monster monster;
//主角攻击怪物
leader.Hit(monster);
//怪物攻击主角
monster.Hit(leader);
return;
}
不需要什么友元、公开成员变量之类的吧。
所谓“类的成员函数之间会相互访问和修改成员变量”,还是通过函数接口来实现比较好,公开成员变量是最不可取的。
至于提到什么设计模式,在这个问题上用不到吧,很基本的函数调用而已。
当然主角类可以用Singleton模式,怪物之类的可以用factory吧~