|
|
发表于 2009-1-5 17:04:00
|
显示全部楼层
Re: 现在的很多游戏开发,完全反过来了
- class Bullet
- : public FiniteStateMachine
- {
- private:
- float speed, distance;
- public:
- enum _ValFlg
- {
- fSpeed,
- fDistance
- };
- enum _ActFlg
- {
- actQueryState,
- actRun,
- actDie
- };
- enum _StateFlg
- {
- stateStand,
- stateDie
- };
- Bullet()
- : speed(), distance()
- {}
- float SetFloatValue(uint flag, float val)
- {
- switch (flag)
- {
- case fSpeed:
- return _SetVal(speed, val);
- case fDistance:
- return _SetVal(distance, val);
- }
- return FiniteStateMachine::SetFloatValue(flag, val);
- }
- float GetFloatValue(uint flag)
- {
- switch (flag)
- {
- case fSpeed:
- return _GetVal(speed);
- case fDistance:
- return _GetVal(distance);
- }
- return FiniteStateMachine::GetFloatValue(flag);
- }
- int Action(uint flag)
- {
- Object3D& refBullet = *object;
- if (flag == actQueryState)
- {
- if (refBullet.GetCatalogue() == Object3D::catNone)
- return stateDie;
- return stateStand;
- }
- if (flag == actRun)
- {
- refBullet.Move(Vector3(0, 0, speed));
- if (distance + speed > 1000.0f)
- refBullet.SetCatalogue(Object3D::catNone);
- else distance += speed;
- }
- if (flag == actDie)
- refBullet.SetCatalogue(Object3D::catNone);
- return FiniteStateMachine::Action(flag);
- }
- };
- ...
- Object3D& refBullet = scene.mapDynamicObject[iBullet << 16 | catBullet];
- refBullet.AttachModel(mod2);
- refBullet.AttachFiniteStateMachine(new Bullet);
- refBullet.SetPosition(plane.GetPosition());
- refBullet.SetAxis(plane.GetAxis());
- refBullet.SetFloatValue(Bullet::fSpeed, 20.0f);
- refBullet.SetFloatValue(Bullet::fDistance, 0);
- refBullet.SetCatalogue(catBullet);
复制代码
希望对你有帮助 |
|