原文章 http://blog.youkuaiyun.com/hwenycocodq520/article/details/6358389
在这里介绍游戏中比较有意思的逻辑的实现:
1.火焰的实现
我们都玩过炸弹超人,当炸弹爆炸的时候火焰向上下左右四个方向蔓延,那么,是怎么实现的呢?有图有真相,看图比较容易理解:
可以看到,火焰根据当前位置(炸弹位置)不同方向递增或者递减蔓延。当遇到土墙,土墙被烧毁并结束该方向火焰的蔓延;当遇到石墙,直接结束该方向火焰的蔓延。具体实现的代码为:
- /// <summary>
- /// 爆炸
- /// </summary>
- /// <param name="bomb"></param>
- public void Explode(Bomb bomb)
- {
- int col = bomb.Poi.X / Utility.GridSize;
- int row = bomb.Poi.Y / Utility.GridSize;
- fires.Clear();
- //中心点
- Fire fire = new Fire();
- MakeFires(col, row);
- //上火焰
- int trow = row - 1;
- for (int i = 0; i < FirePower; i++, trow--)
- {
- fire = new Fire();
- if (trow < 0)
- {
- break;
- }
- if (map.Grids[col, trow] == GridType.Stone)
- {
- break;
- }
- else if (map.Grids[col, trow] == GridType.Soil)
- {
- MakeFires(col, trow);
- break;
- }
- else
- {
- MakeFires(col, trow);
- }
- }
- //下火焰
- trow = row + 1;
- for (int i = 0; i < FirePower; i++, trow++)
- {
- fire = new Fire();
- if (trow > map.Rows - 1)
- {
- break;
- }
- if (map.Grids[col, trow] == GridType.Stone)
- {
- break;
- }
- else if (map.Grids[col, trow] == GridType.Soil)
- {
- MakeFires(col, trow);
- break;
- }
- else
- {
- MakeFires(col, trow);
- }
- }
- //左火焰
- int tcol = col - 1;
- for (int i = 0; i < FirePower; i++, tcol--)
- {
- fire = new Fire();
- if (tcol < 0)
- {
- break;
- }
- if (map.Grids[tcol, row] == GridType.Stone)
- {
- break;
- }
- else if (map.Grids[tcol, row] == GridType.Soil)
- {
- MakeFires(tcol, row);
- break;
- }
- else
- {
- MakeFires(tcol, row);
- }
- }
- //右火焰
- tcol = col + 1;
- for (int i = 0; i < FirePower; i++, tcol++)
- {
- fire = new Fire();
- if (tcol > map.Cols - 1)
- {
- break;
- }
- if (map.Grids[tcol, row] == GridType.Stone)
- {
- break;
- }
- else if (map.Grids[tcol, row] == GridType.Soil)
- {
- MakeFires(tcol, row);
- break;
- }
- else
- {
- MakeFires(tcol, row);
- }
- }
- }
- /// <summary>
- /// 制造火焰
- /// </summary>
- /// <param name="col"></param>
- /// <param name="row"></param>
- public void MakeFires(int col,int row)
- {
- Fire fire = new Fire();
- fire.Poi.X = col * Utility.GridSize;
- fire.Poi.Y = row * Utility.GridSize;
- fires.Add(fire);
- }
2.炸弹定时爆炸
当主角放置炸弹后,到达一定的时间炸弹便会自爆,前面炸弹类中有一个int ExplodeDelay的变量,用来存放炸弹延迟爆炸时间,用List<Bomb>存放已放置炸弹,遍历每一个炸弹,并更新它们爆炸时间:
- #region 更新炸弹
- for (int i = 0; i < bombs.Count; i++)
- {
- bombs[i].ExplodeDelay--;
- if (bombs[i].ExplodeDelay == 0)
- {
- int col = bombs[i].Poi.X / Utility.GridSize;
- int row = bombs[i].Poi.Y / Utility.GridSize;
- Explode(bombs[i]);
- map.Grids[col, row] = GridType.Empty;
- BombCounts++;
- bombs.Remove(bombs[i]);
- }
- }
- #endregion
爆炸时间一到,火焰便创建了......看个图看下效果吧:
至于控制角色的移动,放置炸弹的实现,还有拾取奖品这里我就不多说了,无非就是键盘事件和前面所说的简单碰撞检测,联系上面的做法应该能自己写出来了,如果想看我怎么实现那就去下载我的源代码吧,里面包括了全部实现和素材,应有尽有!
最后,发几张截图,以表示《疯狂的炸弹之幽灵之战v1.0》讲解已到尾声,请期待第2版本《疯狂的炸弹之幽灵反攻v2.0》。主角的命运如何,怪物又如何反攻?且看v2.0版本详细分解。
【游戏开始界面】
【游戏关卡切换】
【游戏ing】
【游戏介绍】
Over!
编译环境:Microsoft Visual Studio 2008
图象处理:Macromedia Fireworks 8
源码下载:http://hwenycocodq520.download.youkuaiyun.com/