细谈c#游戏编程实例---菜鸟日记

 

 

所谓工欲善其事必先利其器,没有好的工具也没有办法做事,我以前曾经想学习C++以外的程序语言,当时有java和C#来选择,当时考虑java比较受推崇,可能会比较好一些,但却在工具面前犯了难,当时的编译器还处于命令行的阶段,即便是有图形IDE,却大多都是英文,只有靠汉化 ,后来退其选择学习C#,VS的工具比较具有通用性,所以很顺利成章的用上进而学会了C#,从我这个小经历上可以看出,开发工具是一个非常重要的部分,所以,在游戏开发之前,我们先建立一个好的开发环境,那么废话不必多说,从现在开始。

我们需要:开发工具、Silverlight SDK、Silverlight Tools

工具选择:

      可以肯定的是,Silverlight的开发环境目前有Visual Studio,可惜我们买起不起Visual Studio的开发套件,那么好在微软很照顾我们这些穷苦开发者,有一套速成版本的的VS,全称是Visual Studio Express,大家可已在下面的地址找到:

      http://www.microsoft.com/express/download/

24005959_FBkR.jpg

      这个Visual Studio Express可以说是Visual Studio的简化版本,没有企业版本功能和一些辅助工具,但是作为个人开发完全足够,只需要安装后注册一下即可,咱们要求不高,就用这个作为工具。

      Microsoft Visual Studio 2008 Express SP1

      http://www.microsoft.com/downloads/details.aspx?familyid=3254C868-BCB9-412C-95C6-D100C872EC60&displaylang=zh-cn

     

      关于其他工具

      如果你觉得这玩意还不够免费,可以考虑用Eclipse,为什么呢,伟大强悍的开源开发者们已经开发出Eclipse Tools for Microsoft Silverlight,你可以在下面的地址找到它:

      http://www.eclipse4sl.org/

 

24005959_BFnX.jpg

     这个工具我没用过,所以后面的代码以及使用还是用Visual Studio Express,作为Silverlight开发环境来说,只需要Web Developer即可,其他的请自行安装。

     那么工具已经选择好,可以下载安装了,具体怎么下载和安装用省略号略过,这不是重点。

     下一步我们要下载Silverlight SDK,这个比较好找,可以到http://www.silverlight.net/上找到。

     如果你的E文实在不怎么样,那么可以直接通过下面的地址找到,但是并不推荐,因为这只是3.0版本的地址,有朝一日更新之后,还是到官方网站上找比较好。

     Silverlight 3.0 SDK:http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=1ea49236-0de7-41b1-81c8-a126ff39975b

     Silverlight 3.0 Tools for Visual Studio 2008 SP1:http://www.microsoft.com/downloads/details.aspx?FamilyID=9442b0f2-7465-417a-88f3-5e7b5409e9dd&DisplayLang=zh-cn

     Silverlight 3.0 离线文档:http://www.microsoft.com/downloads/details.aspx?FamilyID=0a9773a7-c854-41fa-b73d-535abfb73baf&DisplayLang=zh-cn

     特别说明:如果选用的是Web Developer的话,只需要安装Silverlight 3.0 Tools for Visual Studio即可,离线文档强烈建议下载,这是开启Silverlight开发的大门。

     安装顺序是Web Developer ->Silverlight Tools,体验不好的是必须有网络才能完成安装,否则将不能安装完成。

24005959_KfhN.gif

     各位一定要非常注意,如果你安装了VS2008 SP1,安装时一定只安装TOOLS就行,如果安装了微软XAML视图开发工具BLEND,则要将SDK卸载后安装,否则将造成安装不成功的回馈。

     好了,至此所需环境已经搭建,现在可以开启Web Developer新建silverlight项目。

24005959_txGf.gif

     Silverlight Hello World :)其实silverlight可以代替flash

c#开发疯狂炸弹幽灵之路游戏

 

动画的原理就是连续绘制/播放图片,当每秒绘制/播放不同表情、动作图片一定幅数的时候就是造成视觉错觉,就会看到很流畅的动画效果!有了动画,物体才有了灵魂和生命。

     游戏对象分析:

     游戏中只有一部分对象是有生命的,主要包括主角和幽灵等。下面先看下游戏的结构图:

 

     可以看到游戏主要分为2个部分,静止的对象和活动的对象,大家都继承一个基类,基类有一个抽象方法,就是绘制,所有的对象必须重写绘制方法以呈现自己的画面。

BaseEntity

[c-sharp]  
view plain
copy print ?
  1. public abstract class BaseEntity  
  2. {  
  3.     /// <summary>   
  4.     /// 对象坐标   
  5.     /// </summary>   
  6.     public Point Poi;  
  7.   
  8.     /// <summary>   
  9.     ///  绘制对象   
  10.     /// </summary>   
  11.     public abstract void Draw(Graphics g);  
  12. }  

     以游戏中炸弹的绘制为例,代码如下:

Bomb

[c-sharp]  
view plain
copy print ?
  1. /// <summary>   
  2.   /// 炸弹   
  3.   /// </summary>   
  4.   public class Bomb : BaseEntity  
  5.   {  
  6.       //爆炸延迟时间   
  7.       public int ExplodeDelay = 50;  
  8.       Bitmap[] bmps = new Bitmap[Utility.BombFrames];  
  9.   
  10.       /// <summary>   
  11.       /// 默认从资源初始化数据   
  12.       /// </summary>   
  13.       public Bomb()  
  14.       {  
  15.           bmps = InitResources.Instance.InitStaticObjects(  
  16.               Utility.BombValue,  
  17.               Utility.BombFrames,  
  18.               new Size(Utility.BombSizeWidth, Utility.BombSizeHeight),  
  19.               InitMode.FromResource);  
  20.       }  
  21.   
  22.       private int i = 0;  
  23.       public override void Draw(Graphics g)  
  24.       {  
  25.           i = i + 1 < Utility.BombFrames ? i + 1 : 0;  
  26.           g.DrawImage(bmps[i], Poi.X, Poi.Y, Utility.GridSize,Utility.GridSize);  
  27.       }  
  28.   }  

     首先初始化炸弹素材,然后重写绘制方法,逐帧绘制,这样一个简单的动画效果就出现了!

     区别于静止的对象,活动的对象自然会有自己运动的方法,比如移动、跳跃等动作,这也很简单,只是改变对象x,y坐标即可。游戏中的主角和怪物都是有生命的活动体,基本属性成员一致,所以定义一个ActivityEntity类,以便更好重用代码。

ActivityEntity

[c-sharp]  
view plain
copy print ?
  1. /// <summary>   
  2.     /// 方向枚举   
  3.     /// </summary>   
  4.     public enum Direction  
  5.     {  
  6.         Left,   //向左   
  7.         Up,     //向上   
  8.         Right,  //向右   
  9.         Down,   //向下   
  10.         Static  //原地不动   
  11.     }  
  12.   
  13.     /// <summary>   
  14.     /// 有生命的对象   
  15.     /// </summary>   
  16.     public class ActivityEntity:BaseEntity  
  17.     {  
  18.         //角色(包括主角和敌人)   
  19.         public string Role;  
  20.         //生命   
  21.         public int Life;  
  22.         //速度   
  23.         public int Speed=1;  
  24.         //方向   
  25.         public Direction Direction;  
  26.         //记录帧   
  27.         private int Frame=0;  
  28.   
  29.         //存放角色行走图   
  30.         protected Bitmap[][] bmps = new Bitmap[Utility.RoleDirections][]  
  31.             {  
  32.                 new Bitmap[Utility.RoleSteps], //下
      
  33.                 new Bitmap[Utility.RoleSteps], //左
      
  34.                 new Bitmap[Utility.RoleSteps], //右
      
  35.                 new Bitmap[Utility.RoleSteps]  //上
      
  36.             };  
  37.   
  38.         //默认从资源访问   
  39.         public ActivityEntity(string role)  
  40.         {  
  41.             if (!string.IsNullOrEmpty(role))  
  42.             {  
  43.                 this.Role = role;  
  44.                 InitActivityEntity(Role, InitMode.FromResource);  
  45.             }  
  46.         }  
  47.   
  48.         public ActivityEntity(string role, InitMode mode)  
  49.         {  
  50.             if (!string.IsNullOrEmpty(role))  
  51.             {  
  52.                 this.Role = role;  
  53.                 InitActivityEntity(Role, mode);  
  54.             }  
  55.         }  
  56.   
  57.         /// <summary>   
  58.         /// 初始化游戏角色   
  59.         /// </summary> 
      
  60.         /// <param name="role">角色名称</param>
      
  61.         /// <param name="mode"></param>
      
  62.         private void InitActivityEntity(string role, InitMode mode)  
  63.         {  
  64.             switch (mode)  
  65.             {  
  66.                 case InitMode.FromResource:  
  67.                     bmps = InitResources.Instance.InitActivityObjects(role, InitMode.FromResource);  
  68.                     break;  
  69.                 case InitMode.FromFilePath:  
  70.                     if (System.IO.File.Exists(role))  
  71.                         bmps = InitResources.Instance.InitActivityObjects(role, InitMode.FromFilePath);  
  72.                     break;  
  73.             }  
  74.         }  
  75.   
  76.         /// <summary>   
  77.         /// 角色移动   
  78.         /// </summary>   
  79.         public virtual void Move()  
  80.         {  
  81.             switch (Direction)  
  82.             {  
  83.                 case Direction.Left:  
  84.                     Poi.X -= Speed;  
  85.                     break;  
  86.                 case Direction.Up:  
  87.                     Poi.Y -= Speed;  
  88.                     break;  
  89.                 case Direction.Right:  
  90.                     Poi.X += Speed;  
  91.                     break;  
  92.                 case Direction.Down:  
  93.                     Poi.Y += Speed;  
  94.                     break;  
  95.                 case Direction.Static:  
  96.                     break;  
  97.             }  
  98.         }  
  99.   
  100.         /// <summary>   
  101.         /// 记录帧   
  102.         /// </summary>   
  103.         public void RecordFrame()  
  104.         {  
  105.             switch (Direction)  
  106.             {  
  107.                 case Direction.Left:  
  108.                     Frame = 1;  
  109.                     break;  
  110.                 case Direction.Up:  
  111.                     Frame = 3;  
  112.                     break;  
  113.                 case Direction.Right:  
  114.                     Frame = 2;  
  115.                     break;  
  116.                 case Direction.Down:  
  117.                     Frame = 0;  
  118.                     break;  
  119.                 case Direction.Static:  
  120.                     break;  
  121.             }  
  122.         }  
  123.   
  124.         /// <summary>   
  125.         /// 重写绘制对象方法   
  126.         /// </summary>   
  127.         private int i = 0;  
  128.         public override void Draw(Graphics g)  
  129.         {  
  130.             switch (Direction)  
  131.             {  
  132.                 case Direction.Down:   
  133.                 case Direction.Left:  
  134.                 case Direction.Right:  
  135.                 case Direction.Up:  
  136.                     i = i + 1 < Utility.RoleSteps ? i + 1 : 0;  
  137.                     break;  
  138.                 case Direction.Static:  
  139.                     i = 0;  
  140.                     break;  
  141.             }  
  142.             g.DrawImage(bmps[Frame][i], Poi.X, Poi.Y, Utility.GridSize, Utility.GridSize);  
  143.         }  
  144.     }  

    可以看到Move()方法就是根据不同方向改变对象的x,y,这样简单的几句我们的主角就可以移动了。以主角为例:

Actor

[c-sharp]  
view plain
copy print ?
  1. /// <summary>   
  2. /// 游戏主角   
  3. /// </summary>   
  4. public class Actor : ActivityEntity  
  5. {  
  6.     //财富   
  7.     public int Money;  
  8.   
  9.     public Actor()  
  10.         : base(Utility.ActorValue)  
  11.     {  
  12.     }  
  13.   
  14.     public Actor(string role, InitMode mode)  
  15.         : base(role, mode)  
  16.     { }  
  17.   
  18.     public void Move(bool passable)  
  19.     {  
  20.         if (passable)  
  21.         {  
  22.             base.Move();  
  23.             base.RecordFrame();  
  24.         }  
  25.         else  
  26.         {  
  27.             base.RecordFrame();  
  28.         }  
  29.     }  
  30. }  

    继承活动体,并重载了Move()方法,这个方法主要是实现如果没有障碍物,则移动并实现主角动画;反之只记录帧。

效果图:(看不到效果保存到本地浏览)

/*_______________________________________________________________

 

     动画的原理就是连续绘制/播放图片,当每秒绘制/播放不同表情、动作图片一定幅数的时候就是造成视觉错觉,就会看到很流畅的动画效果!有了动画,物体才有了灵魂和生命。

     游戏对象分析:

     游戏中只有一部分对象是有生命的,主要包括主角和幽灵等。下面先看下游戏的结构图:

 

     可以看到游戏主要分为2个部分,静止的对象和活动的对象,大家都继承一个基类,基类有一个抽象方法,就是绘制,所有的对象必须重写绘制方法以呈现自己的画面。

BaseEntity

[c-sharp]  
view plain
copy print ?
  1. public abstract class BaseEntity  
  2. {  
  3.     /// <summary>   
  4.     /// 对象坐标   
  5.     /// </summary>   
  6.     public Point Poi;  
  7.   
  8.     /// <summary>   
  9.     ///  绘制对象   
  10.     /// </summary>   
  11.     public abstract void Draw(Graphics g);  
  12. }  

     以游戏中炸弹的绘制为例,代码如下:

Bomb

[c-sharp]  
view plain
copy print ?
  1. /// <summary>   
  2.   /// 炸弹   
  3.   /// </summary>   
  4.   public class Bomb : BaseEntity  
  5.   {  
  6.       //爆炸延迟时间   
  7.       public int ExplodeDelay = 50;  
  8.       Bitmap[] bmps = new Bitmap[Utility.BombFrames];  
  9.   
  10.       /// <summary>   
  11.       /// 默认从资源初始化数据   
  12.       /// </summary>   
  13.       public Bomb()  
  14.       {  
  15.           bmps = InitResources.Instance.InitStaticObjects(  
  16.               Utility.BombValue,  
  17.               Utility.BombFrames,  
  18.               new Size(Utility.BombSizeWidth, Utility.BombSizeHeight),  
  19.               InitMode.FromResource);  
  20.       }  
  21.   
  22.       private int i = 0;  
  23.       public override void Draw(Graphics g)  
  24.       {  
  25.           i = i + 1 < Utility.BombFrames ? i + 1 : 0;  
  26.           g.DrawImage(bmps[i], Poi.X, Poi.Y, Utility.GridSize,Utility.GridSize);  
  27.       }  
  28.   }  

     首先初始化炸弹素材,然后重写绘制方法,逐帧绘制,这样一个简单的动画效果就出现了!

     区别于静止的对象,活动的对象自然会有自己运动的方法,比如移动、跳跃等动作,这也很简单,只是改变对象x,y坐标即可。游戏中的主角和怪物都是有生命的活动体,基本属性成员一致,所以定义一个ActivityEntity类,以便更好重用代码。

ActivityEntity

[c-sharp]  
view plain
copy print ?
  1. /// <summary>   
  2.     /// 方向枚举   
  3.     /// </summary>   
  4.     public enum Direction  
  5.     {  
  6.         Left,   //向左   
  7.         Up,     //向上   
  8.         Right,  //向右   
  9.         Down,   //向下   
  10.         Static  //原地不动   
  11.     }  
  12.   
  13.     /// <summary>   
  14.     /// 有生命的对象   
  15.     /// </summary>   
  16.     public class ActivityEntity:BaseEntity  
  17.     {  
  18.         //角色(包括主角和敌人)   
  19.         public string Role;  
  20.         //生命   
  21.         public int Life;  
  22.         //速度   
  23.         public int Speed=1;  
  24.         //方向   
  25.         public Direction Direction;  
  26.         //记录帧   
  27.         private int Frame=0;  
  28.   
  29.         //存放角色行走图   
  30.         protected Bitmap[][] bmps = new Bitmap[Utility.RoleDirections][]  
  31.             {  
  32.                 new Bitmap[Utility.RoleSteps], //下
      
  33.                 new Bitmap[Utility.RoleSteps], //左
      
  34.                 new Bitmap[Utility.RoleSteps], //右
      
  35.                 new Bitmap[Utility.RoleSteps]  //上
      
  36.             };  
  37.   
  38.         //默认从资源访问   
  39.         public ActivityEntity(string role)  
  40.         {  
  41.             if (!string.IsNullOrEmpty(role))  
  42.             {  
  43.                 this.Role = role;  
  44.                 InitActivityEntity(Role, InitMode.FromResource);  
  45.             }  
  46.         }  
  47.   
  48.         public ActivityEntity(string role, InitMode mode)  
  49.         {  
  50.             if (!string.IsNullOrEmpty(role))  
  51.             {  
  52.                 this.Role = role;  
  53.                 InitActivityEntity(Role, mode);  
  54.             }  
  55.         }  
  56.   
  57.         /// <summary>   
  58.         /// 初始化游戏角色   
  59.         /// </summary> 
      
  60.         /// <param name="role">角色名称</param>
      
  61.         /// <param name="mode"></param>
      
  62.         private void InitActivityEntity(string role, InitMode mode)  
  63.         {  
  64.             switch (mode)  
  65.             {  
  66.                 case InitMode.FromResource:  
  67.                     bmps = InitResources.Instance.InitActivityObjects(role, InitMode.FromResource);  
  68.                     break;  
  69.                 case InitMode.FromFilePath:  
  70.                     if (System.IO.File.Exists(role))  
  71.                         bmps = InitResources.Instance.InitActivityObjects(role, InitMode.FromFilePath);  
  72.                     break;  
  73.             }  
  74.         }  
  75.   
  76.         /// <summary>   
  77.         /// 角色移动   
  78.         /// </summary>   
  79.         public virtual void Move()  
  80.         {  
  81.             switch (Direction)  
  82.             {  
  83.                 case Direction.Left:  
  84.                     Poi.X -= Speed;  
  85.                     break;  
  86.                 case Direction.Up:  
  87.                     Poi.Y -= Speed;  
  88.                     break;  
  89.                 case Direction.Right:  
  90.                     Poi.X += Speed;  
  91.                     break;  
  92.                 case Direction.Down:  
  93.                     Poi.Y += Speed;  
  94.                     break;  
  95.                 case Direction.Static:  
  96.                     break;  
  97.             }  
  98.         }  
  99.   
  100.         /// <summary>   
  101.         /// 记录帧   
  102.         /// </summary>   
  103.         public void RecordFrame()  
  104.         {  
  105.             switch (Direction)  
  106.             {  
  107.                 case Direction.Left:  
  108.                     Frame = 1;  
  109.                     break;  
  110.                 case Direction.Up:  
  111.                     Frame = 3;  
  112.                     break;  
  113.                 case Direction.Right:  
  114.                     Frame = 2;  
  115.                     break;  
  116.                 case Direction.Down:  
  117.                     Frame = 0;  
  118.                     break;  
  119.                 case Direction.Static:  
  120.                     break;  
  121.             }  
  122.         }  
  123.   
  124.         /// <summary>   
  125.         /// 重写绘制对象方法   
  126.         /// </summary>   
  127.         private int i = 0;  
  128.         public override void Draw(Graphics g)  
  129.         {  
  130.             switch (Direction)  
  131.             {  
  132.                 case Direction.Down:   
  133.                 case Direction.Left:  
  134.                 case Direction.Right:  
  135.                 case Direction.Up:  
  136.                     i = i + 1 < Utility.RoleSteps ? i + 1 : 0;  
  137.                     break;  
  138.                 case Direction.Static:  
  139.                     i = 0;  
  140.                     break;  
  141.             }  
  142.             g.DrawImage(bmps[Frame][i], Poi.X, Poi.Y, Utility.GridSize, Utility.GridSize);  
  143.         }  
  144.     }  

    可以看到Move()方法就是根据不同方向改变对象的x,y,这样简单的几句我们的主角就可以移动了。以主角为例:

Actor

[c-sharp]  
view plain
copy print ?
  1. /// <summary>   
  2. /// 游戏主角   
  3. /// </summary>   
  4. public class Actor : ActivityEntity  
  5. {  
  6.     //财富   
  7.    
  8.  当然使用c#也可以开发藏宝图,付费游戏and so on。。。。。。。。
  9. end

转载于:https://my.oschina.net/bigfool007139/blog/646345

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Course Technology PTR, 2010 Even experienced game developers sometimes have a hard time making their vision for a great game a reality. The number of available programming languages, libraries, and production methods can make the development process overwhelming and result in complicated, unreliable game code. C# Game Programming: For Serious Game Creation shows programmers how to write simple, clean, and reliable code step-by-step through the creation of a basic game. The game is built using C#, a high-level programming langua ge, and OpenGL, an industry favorite for graphics display. You'll get an overview of the methods and libraries used to build good games, learn how to use those libraries and create your own, and finally build your own scrolling shooter game. You'll even find tips and information on how to develop your own game ideas and you'll have an excellent code base to work with. C# Game Programming: For Serious Game Creation provides you with all the information you need to take your game ideas from concept to completion. Aboit author Daniel Schuller is a British-born computer game developer who has worked and lived in the United States, Singapore, Japan, and is currently working in the United Kingdom. He has released games on the PC as well as the Xbox 360 and PlayStation 3. Schuller has developed games for Sony, Ubisoft, Naughty Dog, RedBull, and Wizards of the Coast, and maintains a game development website at http://www.godpatterns.com. In addition to developing computer games, Schuller also studies Japanese and is interested in Artificial Intelligence, cognition, and the use of games in education. amazon link:http://www.amazon.com/exec/obidos/ASIN/1435455568/buythisbooks-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值