Tips13

Last-modified: 2011-08-25 (木) 11:07:11

指定した範囲内のキャラクター・アイテムを抽出する(範囲ダメージなど)

  • カテゴリー: スクリプト
  • 重要性: 普通
  • 投稿日: 2005-08-01 (月) 21:29:00

キャラクターの場合

ダブルクリックしたとき、範囲内にいるキャラクターにダメージを与えるアイテムを例に解説します。

public override void OnDoubleClick(Mobile from)//ダブルクリックしたときの処理
{
ArrayList mobiles = new ArrayList();//キャラクターを格納するためのリストを宣言

foreach (Mobile m in from.GetMobilesInRange(3))//使用者の3マス以内にいるキャラクターを取得
{
mobiles.Add(m);//取得したキャラクターをリストに追加
}
for ( int i = 0; i < mobiles.Count; ++i )//リストのキャラクター1人ずつを処理する
{
Mobile m = (Mobile)mobiles[i];//listからMobile型に格納する
m.Damage(10);//格納したキャラクターに10ダメージ与える
}
}

このアイテムをダブルクリックした場合、ダブルクリックしたキャラクターの範囲3マスにいるすべてのキャラクターに10ダメージ与えます。 5行目の

foreach (Mobile m in from.GetMobilesInRange(3))

が肝です。 GetMobilesInRangeという関数がキャラクターの範囲3マスにいるすべてのキャラクターを拾ってきてくれます。引数の3は範囲の距離です。そしてforeach文で、GetMobilesInRangeで拾ってきたキャラクター一人一人に処理を行うようにしています。その処理とは、7行目の

mobiles.Add(m);

です。ここではGetMobilesInRangeで拾ったキャラクターを全てmobilesに追加しています。

で、9行目の

for ( int i = 0; i < mobiles.Count; ++i )

でmobilesに追加された全てのキャラクターに処理を行います。その処理とは12行目の

mob.Damage(10);

です。ここで、キャラクターに10ダメージを与えています。

ここで一つ気付くかもしれませんが、2度わざわざ範囲内のキャラクターすべてに対して処理を行っていますね。 5行目の

foreach (Mobile m in from.GetMobilesInRange(3))

9行目の

for ( int i = 0; i < mobiles.Count; ++i )

ですね。これはforeachで処理を行うキャラクターを選別し、forで処理を行うようにしているからです。こうすることで、見た目上とても分かり易いソースを書けます。また、一度目のforeach内で全ての処理を行うと予期せぬ動作を起こしやすいです。そのため、このように2度分けて処理を行うようにしています。

アイテムの場合

上記のソースの5行目のGetMobilesInRangeをGetItemsInRangeに変え、Mobile型をすべてItem型に変えれば、範囲内のItemを拾うことができます。

public override void OnDoubleClick(Mobile from)
{
ArrayList items= new ArrayList();

foreach (Item item in from.GetItemsInRange(3))//3マス以内にあるアイテムを取得
{
items.Add(item);//取得したアイテムをリストに追加
}
for ( int i = 0; i < items.Count; ++i )
{
Item item = (Item)items[i];//リストのアイテムをItem型に格納する
item.Hue=100;//格納したアイテムの色番号を100にする
}
}
このアイテムをダブルクリックした場合、ダブルクリックしたキャラクターの範囲3マスにあるすべてのアイテムの色番号が100になります。おおざっぱな部分はGetMobilesInRangeのソースといっしょですね。ダメージはキャラクターに対してしか与えられないので、色変更に変えました。