使用 SpiritManager 类管理在 XNA 游戏中的精灵(十四)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛。在这里分享一下经验,仅为了和各位朋友交流经验。平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXNA 吧,最后请高手绕道而行吧,以免浪费时间。(为了突出重点和减少篇幅,有些示例代码可能不够严谨。)
SpiritManager<T>
SpiritManager<T> 包含了一些管理精灵的方法,我们还可以派生很多的管理类,比如:子弹管理类。下面是 SpiritManager<T> 的成员。
字段 Spirits 表示管理器所管理的精灵,字段 defaultOrder 表示精灵的绘制次序。字段 Scene 可以让我们访问场景中的内容。以后,我们还会将其替换为 IPlayScene。
方法 Append 用来将精灵添加到管理器,我们将会精灵设置 Destroyed 事件,在这个事件中,被摧毁的精灵将被从管理器移除。在 remove 方法中,我们将注销 Destroyed 事件。
internal abstract class SpiritManager<T>
: IDisposable
where T : Spirit
{ internal readonly List<T> Spirits = new List<T> ( );
private readonly int defaultOrder; //internal IPlayScene Scene;
internal IScene Scene; protected SpiritManager ( )
: this ( )
{ }
protected SpiritManager ( int defaultOrder )
{ this.defaultOrder = defaultOrder; } protected virtual void spiritDestroyed ( object sender, SpiritEventArgs e )
{ this.remove ( sender as T ); } internal void Append ( IList<T> spirits )
{ if ( null != spirits )
foreach ( T spirit in spirits )
this.Append ( spirit ); } internal void Append ( T spirit )
{ this.Append ( spirit, this.defaultOrder ); } internal virtual void Append ( T spirit, int order )
{ spirit.Destroyed += this.spiritDestroyed; if ( order != && spirit.DrawOrder == )
spirit.DrawOrder = order; this.Spirits.Add ( spirit );
this.Scene.World.Components.Add ( spirit );
} private void remove ( T spirit )
{ spirit.Destroyed -= this.spiritDestroyed;
this.Scene.World.Components.Remove ( spirit );
this.Spirits.Remove ( spirit ); spirit.Dispose ( );
} internal virtual void Update ( GameTime time )
{ } internal void RemoveAll ( )
{ T[] spirits = this.Spirits.ToArray ( ); foreach ( T spirit in spirits )
this.remove ( spirit ); } public virtual void Dispose ( )
{ this.RemoveAll ( ); } }
示例
场景 SceneT15 和之前的 SceneT14 是类似,我们同样有一个 Bird 类,但是我们增加了一个 BirdManager 类,这个类从 SpiritManager<T> 派生。
BirdManager 有两个方法,Go 方法将调用所有的 Bird 类的 Go 方法,Stop 方法将调用所有的 Bird 类的 Stop 方法。
internal class BirdManager
: SpiritManager<Bird>
{ internal BirdManager ( )
: base ( )
{ } internal void Go ( )
{ foreach ( Bird bird in this.Spirits )
bird.Go ( ); } internal void Stop ( )
{ foreach ( Bird bird in this.Spirits )
bird.Stop ( ); } }SceneT15 同样包含了两个按钮,当点击两个按钮时,将分别调用 BirdManager 的 Go 和 Stop 方法。在 SceneT15 构造函数中,我们创建 BirdManager 类,并需要设置字段 Scene。
在 LoadContent 方法中,我们将两个 Bird 类添加到 BirdManager 中。而在 UnloadContent 方法中,我们调用 BirdManager 的 RemoveAll 方法来删除所有的小鸟。
在 Dispose 方法中,我们将调用 BirdManager 的 Dispose 方法。
internal sealed class SceneT15
: CommandScene
{
private BirdManager birdManager;
private readonly Button goButton;
private readonly Button stopButton; internal SceneT15 ( )
: base ( Vector2.Zero, GestureType.None, "background1",
new Resource[] {
new Resource ( "bird2.image", ResourceType.Image, @"image\bird2" ),
new Resource ( "go.image", ResourceType.Image, @"image\button1" ),
new Resource ( "stop.image", ResourceType.Image, @"image\button2" ),
},
new Making[] {
new Movie ( "bird", "bird2.image", , , , "stop",
new MovieSequence ( "go", true, new Point ( , ), new Point ( , ) ),
new MovieSequence ( "stop", true, new Point ( , ) )
),
new Button ( "b.go", "go.image", "GO", new Vector2 ( , ), , , new Point ( , ) ),
new Button ( "b.play", "stop.image", "STOP", new Vector2 ( , ), , , new Point ( , ) )
}
)
{
this.birdManager = new BirdManager ( );
this.birdManager.Scene = this; this.goButton = this.makings[ "b.go" ] as Button;
this.stopButton = this.makings[ "b.play" ] as Button; this.goButton.Selected += this.goButtonSelected;
this.stopButton.Selected += this.stopButtonSelected;
} private void goButtonSelected ( object sender, ButtonEventArgs e )
{ this.birdManager.Go ( ); } private void stopButtonSelected ( object sender, ButtonEventArgs e )
{ this.birdManager.Stop ( ); } public override void LoadContent ( )
{
base.LoadContent ( ); this.birdManager.Append ( new Bird ( this, new Vector2 ( , ) ) );
this.birdManager.Append ( new Bird ( this, new Vector2 ( , ) ) );
} public override void UnloadContent ( )
{
this.birdManager.RemoveAll ( ); base.UnloadContent ( );
} public override void Dispose ( )
{
this.birdManager.Dispose ( ); base.Dispose ( );
} }
本期视频 http://v.youku.com/v_show/id_XNTgyMDUwMTg0.html
项目地址 http://wp-xna.googlecode.com/
更多内容 WPXNA
平方开发的游戏 http://zoyobar.lofter.com/
QQ 群 213685539
欢迎访问我在其他位置发布的同一文章:http://www.wpgame.info/post/decc4_76f27b
使用 SpiritManager 类管理在 XNA 游戏中的精灵(十四)的更多相关文章
- Java中的集合(十四) Map的实现类LinkedHashMap
Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...
- 《C++游戏开发》笔记十四 平滑过渡的战争迷雾(二) 实现:真正的迷雾来了
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9712321 作者:七十一雾央 新浪微博:http:/ ...
- 【转】cocos2d-x与ios内存管理分析(在游戏中减少内存压力)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=281 注:自己以前也写过coco ...
- cocos2d-x与ios内存管理分析(在游戏中减少内存压力)
转自:http://www.cocos2dev.com/?p=281 注:自己以前也写过cocos2d-x如何优化内存的使用,以及内存不足的情况下怎么处理游戏.今天在微博中看到有朋友介绍了下内存,挺详 ...
- Cocos2D:塔防游戏制作之旅(十四)
塔之战:炮塔的攻击 炮塔就位了?检查.敌人前进中?再次检查 - 它们看起来就是如此!看起来到了击溃这些家伙的时候了!这里我们将智能置入炮塔的代码中去. 每一个炮塔检查是否有敌人在其攻击范围.(炮塔一次 ...
- UE4蓝图与C++交互——射击游戏中多武器系统的实现
回顾 学习UE4已有近2周的时间,跟着数天学院"UE4游戏开发"课程的学习,已经完成了UE4蓝图方面比较基础性的学习.通过UE4蓝图的开发,我实现了类似CS的单人版射击游戏,效 ...
- 089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 使用包进行类管理(1)——创建包
089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
Unity 2D游戏开发教程之游戏中精灵的跳跃状态 精灵的跳跃状态 为了让游戏中的精灵有更大的活动范围,上一节为游戏场景添加了多个地面,于是精灵可以从高的地面移动到低的地面处,如图2-14所示.但是却 ...
- 使用 Spirit 类在 XNA 中创建游戏中的基本单位精灵(十三)
平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...
随机推荐
- Check Point R80 Security Management
平台: CentOS 类型: 虚拟机镜像 软件包: Security Management basic software security 服务优惠价: 按服务商许可协议 云服务器费用:查看费用 立即 ...
- Spring Boot : Swagger 2
每次修改完代码需要找原本的API时楼主的内心是痛苦的,因为一般情况下都找不到,需要重新写一份.如果使用Swagger的话,只要加几个注解就可以实时生成最新的在线API文档,而且不仅仅是文档,同时支持A ...
- 在数据绑定控件(如:Repeater)中使用if判断
方法: target="<%# DataBinder.Eval(Container.DataItem, "数据库字段").ToString() == "t ...
- cms-帖子管理
mapper: <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC & ...
- cms-帖子内容实现2
package com.open1111.controller.admin; import java.io.File;import java.util.Date;import java.util.Ha ...
- 初见微服务之RESTful API
1. REST名称由来 REST全称为Representational State Transfer,即表述性状态转移,最早由Roy Feilding博士在世纪之交(2000年)提出,喜欢追根溯源的朋 ...
- POJ 3187 Backward Digit Sums (递推,bruteforce)
第1行j列的一个1加到最后1行满足杨辉三角,可以先推出组合数来 然后next_permutation直接暴. #include<cstdio> #include<iostream&g ...
- hdu-1874 畅通工程续---模板题
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目大意: 求起点到终点的最短距离 解题思路: 注意重边,其他的就是模板 #include&l ...
- 2018.6.12 Oracle问题
ORA-01950: 对表空间 'USERS' 无权限 创建新的用户时,要指定default tablespace,否则它会把system表空间当成自己的缺省表空间.这样做是不提倡的.估计原来创建某个 ...
- 在mininet上基于ovs,ovx,pox搭建三点虚拟网络
本次试验基于mininet平台,在平台中利用ovs新建1个交换机,以pox为控制器,ovx作为中间层实现虚拟化. 基础请参照http://ovx.onlab.us/getting-started/tu ...