使用此模式之前,你可能有一个角色,它的碰撞检测方法(C#属性)如下:
Rectangle CollisionRect { get; } Rectangle CollisionRectHurt { get; }
这里定义了针对障碍物和敌人的不同碰撞范围,返回不同大小的碰撞检测矩形包围盒。
我们可以用策略模式重构这种设计,首先定义接口:
namespace StrategyPattern { interface IStrategy { Rectangle CollisionRect { get; } } }
实现这个接口的具体碰撞检测策略:
namespace StrategyPattern { class CollisionStrategy1:IStrategy { Rectangle CollisionRect { get; } } }
使用这个策略接口的角色类:
namespace StrategyPattern { class Man { private IStrategy strategy; public Rectangle CollisionRect { get { switch(){} return null; } } } }
当然,在你那里完全照搬代码可能会出现很多红色下划线代码错误,这是因为我使用了XNA4.0框架,加入了很多引用:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media;
不过最关键的是,在我的项目中,最终我并没有选择这种方法!这是因为我的项目的碰撞检测返回矩形包围盒的代码并不多,使用这种方法反而麻烦。