使用 Region,RegionManager 在 XNA 中创建特殊区域(十八)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛。在这里分享一下经验,仅为了和各位朋友交流经验。平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXNA 吧,最后请高手绕道而行吧,以免浪费时间。(为了突出重点和减少篇幅,有些示例代码可能不够严谨。)
区域
如果一些单位进入区域,那么他们将被添加特殊的效果,比如:减速或者受到持续的伤害。因此,我们定义了 Region 类来表示区域。
在 Region 中,我们定义了字段 targets 用来表示进入区域的目标。方法 Append 用来为区域增加新的 Spirit,如果该 Spirit 已经包含在区域中,则不能再次被添加。
派生类可以修改 appending 和 appended 方法。方法 appending 可以用来查看 Spirit 的信息,然后根据这些信息来决定是否添加精灵。方法 appended 可以为已经增加的精灵添加各种效果。
internal abstract class Region
: Spirit
{
private readonly List<Spirit> targets = new List<Spirit> ( ); protected Region ( IPlayScene scene, int type, Vector2 location, string movieName, float speed, int angle, HitArea hitArea, int width, int height, double destroySecond )
: base ( scene, type, location, movieName,
null,
speed, angle, hitArea, width, height, destroySecond,
true,
false,
false, )
{ } protected virtual bool appending ( Spirit spirit )
{ return true; }
protected virtual void appended ( Spirit spirit )
{ } internal void Append ( IList<Spirit> spirits )
{ if ( null == spirits )
return; foreach ( Spirit spirit in spirits )
this.Append ( spirit ); }
internal void Append ( Spirit spirit )
{ if ( this.targets.Contains ( spirit ) || !this.appending ( spirit ) )
return; this.targets.Add ( spirit ); this.appended ( spirit );
} protected override void move ( )
{
this.Location.X += this.xSpeed;
this.Location.Y += this.ySpeed;
} protected override Vector2 getMovieLocation ( )
{ return this.Location - this.halfSize; } protected override void Dispose ( bool disposing )
{ try
{ if ( disposing )
{
this.targets.Clear ( );
} }
catch { } base.Dispose ( disposing );
} }其他成员可以参照其他 Spirit 类的解释。
区域管理器
RegionManager 类派生自类 SpiritManager<T>,默认的绘制顺序是 3000。
internal sealed class RegionManager
: SpiritManager<Region>
{
internal event EventHandler<RegionHitAreaEventArgs> HitTesting; internal RegionManager ( )
: base ( )
{ } internal override void Update ( GameTime time )
{ if ( null == this.HitTesting )
return; foreach ( Region region in this.Spirits.ToArray ( ) )
{
RegionHitAreaEventArgs hitAreaArg = new RegionHitAreaEventArgs ( region );
this.HitTesting ( region, hitAreaArg ); region.Append ( hitAreaArg.Targets ); hitAreaArg.Dispose ( );
} } }事件 HitTesting 可以让外界判断精灵和区域的碰撞,并通过参数 RegionHitAreaEventArgs 返回和区域碰撞的目标。这里你不需要将 RegionHitAreaEventArgs 的 IsHit 属性设置为 true。
示例
场景 SceneT19 是 SceneT18 的扩展,除了有 SceneT18 的功能,还将创建一个区域。
我们定义了类 MyRegion,他是一个区域,可以持续 10 秒的时间。当有精灵进入区域时,他将被销毁。
internal class MyRegion
: Region
{ internal MyRegion ( IPlayScene scene, Vector2 location )
: base ( scene, , location, "myr", , ,
new SingleRectangleHitArea ( new Rectangle ( -, -, , ) ),
, , )
{ } protected override bool appending ( Spirit spirit )
{
spirit.Destroy ( ); return false;
} }我们还要定义一个 RegionManager。
private RegionManager regionManager; internal SceneT19 ( )
: base ( Vector2.Zero, GestureType.None, "background1",
new Resource[] {
new Resource ( "bird2.image", ResourceType.Image, @"image\bird2" ),
new Resource ( "bullet.image", ResourceType.Image, @"image\bullet" ),
new Resource ( "item.image", ResourceType.Image, @"image\item" ),
new Resource ( "pinup.image", ResourceType.Image, @"image\pinup1" ),
new Resource ( "r.image", ResourceType.Image, @"image\r1" ),
new Resource ( "go.image", ResourceType.Image, @"image\button1" ),
},
new Making[] {
new Movie ( "bird", "bird2.image", , , , "live",
new MovieSequence ( "live", true, new Point ( , ), new Point ( , ) )
),
new Movie ( "mybutton", "bullet.image", , , , "b",
new MovieSequence ( "b", new Point ( , ) )
),
new Movie ( "myitem", "item.image", , , , "i",
new MovieSequence ( "i", new Point ( , ) )
),
new Movie ( "mypinup", "pinup.image", , , , "p",
new MovieSequence ( "p", new Point ( , ) )
),
new Movie ( "myr", "r.image", , , , "r",
new MovieSequence ( "r", new Point ( , ) )
),
new Button ( "b.go", "go.image", "GO", new Vector2 ( , ), , , new Point ( , ) ),
}
)
{
// ... this.regionManager = new RegionManager ( );
this.regionManager.Scene = this;
this.regionManager.HitTesting += this.regionHitTesting; // ...
}在方法 regionHitTesting 中,我们将判断哪些子弹进入了区域中,而区域将试图添加这些子弹。
private void regionHitTesting ( object sender, RegionHitAreaEventArgs e )
{
List<Spirit> targets = new List<Spirit> ( ); foreach ( Bullet bullet in this.bulletManager.Spirits )
if ( e.HitArea.HitTest ( bullet.HitArea ) )
targets.Add ( bullet ); e.Targets = targets;
}最后,我们需要在小鸟被子弹击中后,创建一个区域。
private void bulletHitTesting ( object sender, BulletHitAreaEventArgs e )
{ if ( !this.bird.IsDied && e.HitArea.HitTest ( this.bird.HitArea ) )
{
e.IsHit = true;
e.Targets = new IAssailable[] { this.bird }; if ( !this.is1Hit )
{
this.is1Hit = true;
this.pinupManager.Append ( new MyHit ( this, new Vector2 ( , ) ) );
} this.regionManager.Append ( new MyRegion ( this, new Vector2 ( , ) ) );
} }
本期视频 http://v.youku.com/v_show/id_XNTkwMzIyMTYw.html
项目地址 http://wp-xna.googlecode.com/
更多内容 WPXNA
平方开发的游戏 http://zoyobar.lofter.com/
QQ 群 213685539
欢迎访问我在其他位置发布的同一文章:http://www.wpgame.info/post/decc4_7c22b3
使用 Region,RegionManager 在 XNA 中创建特殊区域(十八)的更多相关文章
- 使用 NPC,NPCManager 在 XNA 中创建 NPC(十九)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
- 使用 NPC,NPCManager 在 XNA 中创建 NPC
使用 NPC,NPCManager 在 XNA 中创建 NPC 平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐 ...
- 使用 Pinup,PinupManager 在 XNA 中创建贴图(十七)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
- 使用 Item,ItemManager 在 XNA 中创建物品和道具(十六)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
- 使用 Bullet,BulletManager 在 XNA 中创建子弹攻击目标(十五)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
- 使用 Spirit 类在 XNA 中创建游戏中的基本单位精灵(十三)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
- 使用 Button 类在 XNA 中创建图形按钮(九)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
- 使用 Scene 类在 XNA 中创建不同的场景(八)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
- 使用 CommandScene 类在 XNA 中创建命令场景(十二)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
随机推荐
- fancyBox高级进阶用法
最近给客户做的一个项目中,客户要求弹窗的边界与页面某个区块边界平齐,但平齐之后,弹出的窗口就不是居中的情况了,研究之后,认为需要改写fancyBox的fancybox-wrap类中的top属性才能达到 ...
- linux 命令——53 route(转)
Linux系统的route 命令用于显示和操作IP路由表(show / manipulate the IP routing table).要实现两个不同的子网之间的通信,需 要一台连接两个网络的路由器 ...
- cesium 加载shp格式的白模建筑
ceisum加载shp格式的建筑.有两种思路,目前推荐第二种. 方法一:将shp格式转换为geojson格式,然后采用cesium提供的接口加载到ceisum中. 严重缺陷:在面对大场景问题,即数据量 ...
- [转载]AngularJS入门教程00:引导程序
我们现在开始准备编写AngularJS应用——phonecat.这一步骤(步骤0),您将会熟悉重要的源代码文件,学习启动包含AngularJS种子项目的开发环境,并在浏览器端运行应用. 进入angul ...
- ActiveX插件的Z-Index属性无效问题解决
在Web开发中我们经常通过z-index设置多个元素之间的层叠关系,这种方式在多数情况下很有效,但是如果遇到有窗体元素时这种方式常常显得无能为力,今天我们就一块看一下如何有效的解决这个问题. 在Web ...
- numpy.random.shuffle(x)的用法
numpy.random.shuffle(x) Modify a sequence in-place by shuffling its contents. Parameters: x : array_ ...
- cf540D. Bad Luck Island(概率dp)
题意 岛上有三个物种:剪刀$s$.石头$r$.布$p$ 其中剪刀能干掉布,布能干掉石头,石头能干掉剪刀 每天会从这三个物种中发生一场战争(也就是说其中的一个会被干掉) 问最后仅有$s/r/p$物种生存 ...
- 认识mysql(3)
认识mysql第三篇,发出的内容适合初学者,如果能持续关注我的博客,可以全面的掌握mysql的常用知识,后续我也会陆续发出python相关的知识,关注我,和我一共进步吧! 1.SQL查询 1.执行顺序 ...
- Mysql--7种Join查询
0.sql的执行顺序 手写顺序 机读顺序 总结 ①From:对from左边的表和右边的表计算笛卡尔积,产生虚拟表c1 ②On:对c1中的数据进行on过滤,只有符合过滤条件的数据记录才会记录在虚拟表c2 ...
- 十二、MySQL 查询数据
MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据. 语法 以下为在MyS ...