Welcome

首页 / 软件开发 / Silverlight / Silverlight游戏设计(Game Design):(十二)帝国时代II(Demo) 之“战争艺术”①

Silverlight游戏设计(Game Design):(十二)帝国时代II(Demo) 之“战争艺术”①2011-08-12 博客园 深蓝色右手即时战略类型游戏因其精确的微操,宏大的场面以及丰富的策略元素广受玩家的爱戴,《沙丘魔堡II 》开创了真正意义上的即时战略游戏形态,之后Westwood创生了《命令与征服》系列加之暴雪的《魔兽争 霸》及《星际争霸》系列瞬间将RTS的发展推向高潮。就是在这样的氛围下,微软的《帝国时代》系列孕 育而生,踏着人类文明进步的足迹,陪伴我度过了高中那个人生转折的年代。

本节,我将为大家讲解的是利用场景编辑器搭建的帝国时代2游戏Demo。

即时战略游戏最大的特点就在于它的操作上,通过鼠标搭配键盘进行不同组合的单位管理。在帝国时 代游戏中,鼠标左键负责选取单位,而右键则是指挥它们进行移动及攻击;其时,我们完全可以把所有的 操作都集中到左键上,让玩家拥有更好的操作手感。然而,与此同时功能的多样化必将加大相关代码的复 杂度,左键既要负责选中单个单位,又要在按住不放的情况下选中范围内单位,同时还要在无有效选择情 况下指挥已选中的单位进行目标点移动;因此,我们必须充分利用并衔接好mouseLeftButtonDown、 mouseLeftButtonUp以及mouseMove事件才能达到目的。这里我用到一个小技巧,就是在鼠标按下后如果拖 动出的范围小于10*10像素则认定为无效的范围选取,从而执行其他操作;这也是一个关键技术点,当然 ,或许你有更加优秀的方案能完美的处理好这些判断的并发。

在范围选取单位对象时,即时战略游戏中的通常做法是从鼠标点击点开始向拖动的目标绘制一个矩形 ,在Silverlight中我们可以这样做,在左键按下后如判断为选取状态时记录下起始坐标selectedStart, 然后在鼠标移动事件中进行如下处理即可:

/// <summary>
/// 鼠标移动绘制单位选取范围
/// </summary>
private void mouseMove(object sender, MouseEventArgs e) {
if (isMouseCaptured) {
selectedEnd = e.GetPosition(mainScene.Container);
//拖拉出的方块必须x,y大于10像素才进入选择范围状态,否则为 指挥移动状态
if (Math.Abs(selectedEnd.X - selectedStart.X) >= 10 && Math.Abs(selectedEnd.Y - selectedStart.Y) >= 10) {
isSelecting = true;
bool scaleX = false, scaleY = false;
if (selectedEnd.X < selectedStart.X) { scaleX = true; }
if (selectedEnd.Y < selectedStart.Y) { scaleY = true; }
mainScene.Selector.RenderTransform = new ScaleTransform() { ScaleX = scaleX ? -1 : 1, ScaleY = scaleY ? -1 : 1 };
mainScene.Selector.Width = Math.Abs (selectedEnd.X - selectedStart.X);
mainScene.Selector.Height = Math.Abs (selectedEnd.Y - selectedStart.Y);
} else {
isSelecting = false;
}
}
}

代码虽很简单,却能实现随意方向的矩形绘制,效果是很完美的: