|
|
本文是对物资调动进行描述,实际上要说明的是游戏里多个城市是如何进行关联的。
在城市调动的时候,我们首先想到的是,我们物资能够调动给那些城市,因为不同的城市周边的城市都是不一样的,有些城市可以移动到,有些却不能,同时有些城市现在可以,但是下一个月就不可以(被敌方占领),所以,确定关系是第一步。确定好关系,剩下的就非常简单了。
我们首先来看一下我们是如何得到两个城市之间的关系的。我们先对城市对象增加了一个“关联城市列表”(.net 里的ArrayList,C++ 可以使用 list 模版, Delphi 可以使用 Tlist类, VB6不清楚,不过可以用一个数组来模拟),并在存储城市属性的xml文件里增加一个小节:
<连接城市>
<城市 名字="荆州"></城市>
<城市 名字="陈留"></城市>
<城市 名字="柳州"></城市>
</连接城市>
用来表明当前城市与那些城市有关联关系。在城市初始化的时候,根据上面的信息找到对应的城市对象加入本城市的“关联城市列表”里。
有了这个列表,我们在进行物资调动的时候,把自己城市里的“关联城市列表”传入选择将领(城市)窗体,并根据传入国家参数把不是自己国家的城市过滤掉。这样就完成了城市的选择,剩下的就是通过物资调动窗体读取调动的物资,并通过国家对象的物资调动操作进行数据的操作。
军事窗体里物资调动button的过程,
private void btn_物质调动_Click(object sender, System.EventArgs e)
{
选择将领Form form = new 选择将领Form();
// 这里弹出一个选择城市对话框,城市信息从“城市.关联城市”里读取
C城市列表 list = form.选择城市(城市.关联城市, 1, 1, 城市.国家);
if (list == null)
return;
物资调动Form form2 = new 物资调动Form();
sango.核心.T调动物资 物资 = new T调动物资();
物资.金钱 = 城市.基本属性.金钱;
物资.粮食 = 城市.基本属性.粮食;
物资.士兵 = 城市.军事.士兵;
物资 = form2.show(物资);
if (物资 == null)
return;
C城市 city = list[0]; // 这个是目标城市对象
// 调用国家的物资调用操作去实现两个城市的物资变化
城市.国家.物资调动(城市, city, 物资);
this.bind();
}
在“城市选择窗体(选择将领Form)”对城市对象进行过滤,把不是自己国家的城市排除在选择范围之外:
foreach(C城市 城市 in 城市列表) // 枚举所有传进来的城市
{
if (国家 != null)
if (城市.国家 == null || 国家.名字 != 城市.国家.名字)
continue;
System.Data.DataRow dr = dt.NewRow(); // 参数一个新的城市选项
dr[0] = false;
dr["名字"] = 城市.名字;
dt.Rows.Add(dr);
}
国家的物资调动的操作函数:
public bool 物资调动(C城市 原始城市, C城市 目标城市, T调动物资 物资)
{
原始城市.基本属性.金钱 -= 物资.金钱;
原始城市.基本属性.粮食 -= 物资.粮食;
原始城市.军事.士兵 -= 物资.士兵;
目标城市.基本属性.金钱 += 物资.金钱;
目标城市.基本属性.粮食 += 物资.粮食;
目标城市.军事.士兵 += 物资.士兵;
return true;
}
所以实现物资调动功能大概使用200行代码,里面包括很多可以被其它地方重复使用的代码(关联城市的初始化,城市的选择窗体),所以实际上只是物资调动功能的代码只有不到40行代码,应该是足够少了的。
|
|