ページ 11

ちょっと凝ったアイテムの落とし方

Posted: 2009年11月15日(日) 18:36
by kai
こんばんは。
龍神録で敵アイテムの落とし方について教えてほしいのですが、
アイテムの落とす位置は
item[k].x+=rang(40);
item[k].y+=rang(40);
のようにランダムで落としているのですが、これを
添付した画像のアイテムのように
真ん中に一つ、ちょっと少し間をあけて周りに数個ランダム配置するようにしたいのですが
どういった計算をすればこのようになるのでしょうか?
誰か分かる方がいましたら、教えてください><

Re:ちょっと凝ったアイテムの落とし方

Posted: 2009年11月16日(月) 01:01
by Justy
 こんなんでしょうか。

[color=#d0d0ff" face="monospace"> // 配置されるアイテムの最大の距離
const double maxLength = 40;

// 少し開ける長さ
const double avoidLength = 15;

// 配置する角度
const double ang = rang(PI);

// オフセット位置
const double length = fabs(rang(maxLength - avoidLength)) + avoidLength;
double itemPosX = +sin(ang) * length;
double itemPosY = -cos(ang) * length;
[/color]
 出したいアイテムの方向の角度から求めた単位ベクトルと
ランダムで決めた長さに開けたい間の長さを足した長さを、
掛けて最終的なオフセット座標を出しています。

 あとはこのオフセット座標をアイテムを出したい中心位置に足すだけです。


※ 2009/11/17 21:07 コード修正 (fabs)

Re:ちょっと凝ったアイテムの落とし方

Posted: 2009年11月17日(火) 15:09
by kai
遅くなりましたが、
Justyさんのアドバイスのおかげで
無事解決できました!
しかし、Justyさんのプログラムの名前の付け方って
いつみてもプログラマーっぽくてかっこいいですよね。尊敬します。
avoidLengthとか今の自分には思いつかないです。

Re:ちょっと凝ったアイテムの落とし方

Posted: 2009年11月17日(火) 21:10
by Justy
 よくみたらマズイところが合ったので修正しました。

 rang(X)は 0~Xでなく、-X~Xだったんですね。
 となると
[color=#d0d0ff" face="monospace]
const double length = fabs(rang(maxLength - avoidLength)) + avoidLength;
[/color]

としないと rang()の結果が負だと、避けるどころか近づいてしまうことがあります。

 というわけでちょっと直しました。



>名前の付け方

 そう言われたのは初めてです (;^_^A
 
 一応変数の役割とか意味が見ただけで(何となくでも)わかるような名前を
つけるようにしています。

 何せこのコードの中に3つも“長さ”がありますんで。