1、编写一个简单的鼠标打飞碟(Hit UFO)游戏
- 游戏规则:
- 游戏至少有三个 round(其实到round3就很容易死了。)
- 每个round内难度一样,但是不同round难度递增。
- 每个round中飞碟出现的位置是随机的。
- 鼠标点中得分,紫飞碟1分,绿飞碟3分,红飞碟5分。
- 每次游戏有6条命,少点一个掉一条命,没有命游戏结束。
- 游戏的要求:
- 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!具体实现见参考资源 Singleton 模板类
- 近可能使用前面 MVC 结构实现人机交互与游戏模型分离
- 扩展:
- 用自定义组件定义几种飞碟,编辑并赋予飞碟一些属性,做成预制
UML类图:
因为我参考了前辈的代码,UML类图几乎一样,所以直接借用了(末尾有前辈的链接)。
其中SSAction、SequenceAction、ActionCallBack、ActionManager与上次的牧师与魔鬼几乎相同,所以这次不多加说明,主要关注新增的类。
UFOFlyAction
这个类是SSAction的实现,写了UFO做的动作,包括飞的速度、射出位置、射出角度的方法,以及动作结束的条件。当动作结束,飞碟会等待回收。
public static UFOFlyAction GetSSAction(Vector3 direction, float angle, float power){
//初始化物体将要运动的初速度向量
UFOFlyAction action = CreateInstance<UFOFlyAction>();
if (direction.x == -1) {
action.start_vector = Quaternion.Euler(new Vector3(0, 0, -angle)) * Vector3.left * power;
}else{
action.start_vector = Quaternion.Euler(new Vector3(0, 0, angle)) * Vector3.right * power;
}
return action;
}
public override void Update(){
//计算物体的向下的速度,v=at
time += Time.fixedDeltaTime;
gravity_vector.y = gravity * time;
//位移模拟
transform.position += (start_vector + gravity_vector) * Time.fixedDeltaTime;
current_angle.z = Mathf.Atan((start_vector.y + gravity_vector.y) / start_vector.x) * Mathf.Rad2Deg;
transform.eulerAngles = current_angle;
//如果物体y坐标小于-5,动作就做完了
if (this.transform.position.y < -5){
this.destroy = true;
this.whoToNotify.SSActionEvent(this);
}
}
FlyAtionManager
当场景控制器需要飞碟飞出来时,它会调用上面动作管理类的方法,来控制飞碟飞行。它们的关系可以理解为,飞碟能做的动作在动作管理类,但是飞碟要做什么是由这个控制器控制的,场景控制器决定飞碟在什么情况下动作。
public UFOFlyAction fly; //飞碟飞行的动作
public FirstController scene_controller; //场景管理类
protected void Start() {
scene_controller = (FirstController)SSDirector.GetInstance().CurrentScen