c#GDI+游戏编程:《疯狂的炸弹之幽灵之战v1.0》逻辑实现

本文介绍了一款游戏中火焰实现及炸弹定时爆炸的逻辑,通过火焰蔓延、土石墙交互以及时间计数等机制,展示了游戏开发中趣味逻辑的实现过程。文章附带游戏截图和代码片段,帮助读者理解核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文章  http://blog.youkuaiyun.com/hwenycocodq520/article/details/6358389

 

在这里介绍游戏中比较有意思的逻辑的实现:

     1.火焰的实现

      我们都玩过炸弹超人,当炸弹爆炸的时候火焰向上下左右四个方向蔓延,那么,是怎么实现的呢?有图有真相,看图比较容易理解:

      可以看到,火焰根据当前位置(炸弹位置)不同方向递增或者递减蔓延。当遇到土墙,土墙被烧毁并结束该方向火焰的蔓延;当遇到石墙,直接结束该方向火焰的蔓延。具体实现的代码为:

[c-sharp] view plain copy print ?
  1. /// <summary>   
  2. /// 爆炸   
  3. /// </summary>   
  4. /// <param name="bomb"></param>   
  5. public void Explode(Bomb bomb)  
  6. {  
  7.     int col = bomb.Poi.X / Utility.GridSize;  
  8.     int row = bomb.Poi.Y / Utility.GridSize;  
  9.   
  10.     fires.Clear();  
  11.     //中心点   
  12.     Fire fire = new Fire();  
  13.     MakeFires(col, row);  
  14.     //上火焰   
  15.     int trow = row - 1;  
  16.     for (int i = 0; i < FirePower; i++, trow--)  
  17.     {  
  18.         fire = new Fire();  
  19.         if (trow < 0)  
  20.         {  
  21.             break;  
  22.         }  
  23.         if (map.Grids[col, trow] == GridType.Stone)  
  24.         {  
  25.             break;  
  26.         }  
  27.         else if (map.Grids[col, trow] == GridType.Soil)  
  28.         {  
  29.             MakeFires(col, trow);  
  30.             break;  
  31.         }  
  32.         else  
  33.         {  
  34.             MakeFires(col, trow);  
  35.         }  
  36.     }  
  37.     //下火焰   
  38.     trow = row + 1;  
  39.     for (int i = 0; i < FirePower; i++, trow++)  
  40.     {  
  41.         fire = new Fire();  
  42.         if (trow > map.Rows - 1)  
  43.         {  
  44.             break;  
  45.         }  
  46.         if (map.Grids[col, trow] == GridType.Stone)  
  47.         {  
  48.             break;  
  49.         }  
  50.         else if (map.Grids[col, trow] == GridType.Soil)  
  51.         {  
  52.             MakeFires(col, trow);  
  53.             break;  
  54.         }  
  55.         else  
  56.         {  
  57.             MakeFires(col, trow);  
  58.         }  
  59.     }  
  60.     //左火焰   
  61.     int tcol = col - 1;  
  62.     for (int i = 0; i < FirePower; i++, tcol--)  
  63.     {  
  64.         fire = new Fire();  
  65.         if (tcol < 0)  
  66.         {  
  67.             break;  
  68.         }  
  69.         if (map.Grids[tcol, row] == GridType.Stone)  
  70.         {  
  71.             break;  
  72.         }  
  73.         else if (map.Grids[tcol, row] == GridType.Soil)  
  74.         {  
  75.             MakeFires(tcol, row);  
  76.             break;  
  77.         }  
  78.         else  
  79.         {  
  80.             MakeFires(tcol, row);  
  81.         }  
  82.     }  
  83.     //右火焰   
  84.     tcol = col + 1;  
  85.     for (int i = 0; i < FirePower; i++, tcol++)  
  86.     {  
  87.         fire = new Fire();  
  88.         if (tcol > map.Cols - 1)  
  89.         {  
  90.             break;  
  91.         }  
  92.         if (map.Grids[tcol, row] == GridType.Stone)  
  93.         {  
  94.             break;  
  95.         }  
  96.         else if (map.Grids[tcol, row] == GridType.Soil)  
  97.         {  
  98.             MakeFires(tcol, row);  
  99.             break;  
  100.         }  
  101.         else  
  102.         {  
  103.             MakeFires(tcol, row);  
  104.         }  
  105.     }  
  106. }  
  107.   
  108. /// <summary>   
  109. /// 制造火焰   
  110. /// </summary>   
  111. /// <param name="col"></param>   
  112. /// <param name="row"></param>   
  113. public void MakeFires(int col,int row)  
  114. {  
  115.     Fire fire = new Fire();  
  116.     fire.Poi.X = col * Utility.GridSize;  
  117.     fire.Poi.Y = row * Utility.GridSize;  
  118.     fires.Add(fire);  
  119. }  

     2.炸弹定时爆炸

     当主角放置炸弹后,到达一定的时间炸弹便会自爆,前面炸弹类中有一个int ExplodeDelay的变量,用来存放炸弹延迟爆炸时间,用List<Bomb>存放已放置炸弹,遍历每一个炸弹,并更新它们爆炸时间:

[c-sharp] view plain copy print ?
  1. #region 更新炸弹   
  2.  for (int i = 0; i < bombs.Count; i++)  
  3.  {  
  4.      bombs[i].ExplodeDelay--;  
  5.      if (bombs[i].ExplodeDelay == 0)  
  6.      {  
  7.         int col = bombs[i].Poi.X / Utility.GridSize;  
  8.         int row = bombs[i].Poi.Y / Utility.GridSize;  
  9.         Explode(bombs[i]);  
  10.         map.Grids[col, row] = GridType.Empty;  
  11.         BombCounts++;  
  12.         bombs.Remove(bombs[i]);  
  13.      }  
  14. }  
  15. #endregion  

     爆炸时间一到,火焰便创建了......看个图看下效果吧:

     至于控制角色的移动,放置炸弹的实现,还有拾取奖品这里我就不多说了,无非就是键盘事件和前面所说的简单碰撞检测,联系上面的做法应该能自己写出来了,如果想看我怎么实现那就去下载我的源代码吧,里面包括了全部实现和素材,应有尽有!

     最后,发几张截图,以表示《疯狂的炸弹之幽灵之战v1.0》讲解已到尾声,请期待第2版本《疯狂的炸弹之幽灵反攻v2.0》。主角的命运如何,怪物又如何反攻?且看v2.0版本详细分解。

【游戏开始界面】

【游戏关卡切换】

【游戏ing】

【游戏介绍】

Over!

编译环境:Microsoft Visual Studio 2008

图象处理:Macromedia Fireworks 8

源码下载:http://hwenycocodq520.download.youkuaiyun.com/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值