Tips13


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

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

メッセージ

キャラクターの場合

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

#code(csharp){{
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を拾うことができます。

#code(csharp){{
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のソースといっしょですね。 ダメージはキャラクターに対してしか与えられないので、色変更に変えました。

参考文献



メニュー

オリジナル

T2A

  • InPorYelm?

UOR+T2A

AOS

  • なし

UOML

 

  • counter: 542
  • today: 1
  • yesterday: 0
  • online: 1