Hatena::Groupfatalemployeetraining

資材部の懲りない面々・あれこれブログ

「間違った社員教育」製品版委託頒布中!

2011-11-01

再開中

02:57

さて、肝心の「社員教育」の続きですが、どうやってゲーム性を出すかで悩んで、いろいろと妄想してギミックを盛り込もうと考えすぎまして、頓挫しておりましたが…

先日ようやくそのあたりすぱっと捨てて、シンプルに考えを整理することができましたので、作業再開しております。

次のステージはチェックポイント通過式のゲームにする予定です。

参考にするべく、RaidersSphereSecondのルミナリエを久しぶりに飛んでみたり。

EFFY付属の「ひよこ」のチェックポイント通過ミッションのコードを読んだりしました。

それらを踏まえて、まず、ギミックの実装してみます。

「ひよこ」の動作とほとんど同じですが、あらかじめ設定された制限時間でも消えて次のチェックポイントが出現するところが違います。

あと、チェックポイントはdds形式を使ってカッコ良く透過光で表示(帯状の字は実は子ユニットになっていて相対的にぐるぐる回るようになっていたり)。

なお、これやる過程で、「ユニットの装甲値が設定されていないユニットはget_posできない?」な謎な症状に遭遇しました。とりあえずチェックポイントの装甲値9999をセットして回避してありますが…どうも変な感じ。何か見落としているかもしれません。

2011-10-29

RSEclipse3、使う時に気をつけるべきこと

12:06


現在RSEclipse3を使用している人に注意点を挙げておきます。

自動生成でパッケージ作成した場合のひな型の中にライブラリファイルsystem.incがあります。

場所は、フォルダ「scripts」→「libs」→「core」の中です。

こいつの277行目と278行目に、

/** @var int __system_thread_id 起動しているカウンタ加算用スレッドID(起動していない場合はNULL) */
int __system_thread_id = NULL;

という行がありますが、これを以下のように修正してください。

/** @var int __system_thread_id 起動しているカウンタ加算用スレッドID(起動していない場合は-1) */
int __system_thread_id = -1;

(NULLを-1に変えます。)

さらに、259行目と260行目に

/** @const int NULL 擬似NULL値:整数の-1で代用 */
const int NULL = 1;

とありますが、この2行をばっさり削除してください。

この修正を行わないと、system.incで用意されているカウンタ機能が正しく動作しません。

作成したパッケージを「EFFY」や「ハウンドの勇気」に入れて動かす際、製品側に同梱されているsystem.incが上書き変更されてしまい、この機能を使用している「EFFY」や「ハウンドの勇気」が正常に動作しなくなります。注意してください。(Y1の機銃が回復しなくなったりetc)

2011-09-07

RSEclipse3自動生成パッケージ、現時点で気がつくこと

01:52

うめたろーさんがtwitter上で指摘された点。BGMと環境IDについてです。

なお、RSEclipse2では該当しない(自動生成されるコードが異なる)ため、RSEclipse2を使っている人は昨日の記事を見てRSEclipse3に更新してください。

また、今後RSEclipse3のバージョンが上がった場合、下記内容が変更になる可能性もあります。あらかじめご了承ください。

自動生成されるrseファイルについて

環境ID
;環境ID(変数名:ENVIRMENT  引数:環境ID)
ENVIRMENT		1

となっていますが、このENVIRMENTについてRSEclipseの文法解析がエラーを表示(赤いバッテン)してきます。

実際の動作には影響ないようなので放っておいても問題なさそうですが、とりあえず

;環境ID(変数名:ENVIRMENT  引数:環境ID)
ENVIRMENT		01

とすることでエラー表示が消えます。

BGM
;ブリーフィングBGM(変数名:BRIEFING_BGMT  引数:音楽ファイル名)
BRIEFING_BGM	0, rs3_01_briefing1.rad	;最初の数字はループ位置(-1だとループしない)

;武装選択BGM(変数名:SELECT_BGMT  引数:音楽ファイル名)
SELECT_BGM		0, rs3_02_select.rad	;最初の数字はループ位置(-1だとループしない)

となっていますが、これだといずれもBGMが鳴りません。

このBGM指定エントリは、「rseファイルの所在からの相対パス指定」で指定しないといけないようなので、

;ブリーフィングBGM(変数名:BRIEFING_BGMT  引数:音楽ファイル名)
BRIEFING_BGM	0, ..\..\..\..\rs3_01_briefing1.rad	;最初の数字はループ位置(-1だとループしない)

;武装選択BGM(変数名:SELECT_BGMT  引数:音楽ファイル名)
SELECT_BGM		0, ..\..\..\..\rs3_02_select.rad	;最初の数字はループ位置(-1だとループしない)

とする必要があります。

ただし、ミッションが完成してキャンペーン化する際に、rse,spt,plcファイルなどを一式mission用のフォルダ(scripts\missions\mission01など)に移す場合は、パスの深さが変わりますのでさらに「..\..\」を追加する必要があります。

自動生成されるsptファイルについて

BGM

mission_start()関数内で、BGMを鳴らす指定をしている行があります。

	play_bgm(BGM_RS3_MISSION04_FILE_NAME, BGM_RS3_MISSION04_LOOP_POINT);

数BGM_RS3_MISSION04_FILE_NAMEはRaidersSphere_const.inc中で定義されている、BGMのファイル名です。

しかしファイル名のみですので、BGMファイルのあるフォルダの指定が成されていません。

このplay_bgm関数引数も、「rseファイルの所在からの相対パス指定」で指定しないといけないようなので、

	play_bgm("..\\..\\..\\..\\bgm\\" + BGM_RS3_MISSION04_FILE_NAME, BGM_RS3_MISSION04_LOOP_POINT);

とすることでBGMが鳴るようになります。

格好悪いぞ!という人はsptファイル冒頭の定数定義のあたりに、

/** @const	string	ORG_BGM_PATH	エンジン付属BGMファイルのあるフォルダ */
const string ORG_BGM_PATH = "..\\..\\..\\..\\bgm\\";

/** @const	string	EXT_BGM_PATH	追加BGMファイルのあるフォルダ */
const string EXT_BGM_PATH = "..\\..\\common\\sounds\\bgm\\";

などと追加して、mission_start()内では

	play_bgm(ORG_BGM_PATH + BGM_RS3_MISSION04_FILE_NAME, BGM_RS3_MISSION04_LOOP_POINT);

などとすればよいと思います。

こちらも先ほどのrseファイルにおける指定と同様、ミッションが完成してキャンペーン化する際に、rse,spt,plcファイルなどを一式mission用のフォルダ(scripts\missions\mission01など)に移す場合は、パスの深さが変わりますのでさらに「..\..\」を追加する必要があります。

2011-09-06

RSEclipseとは

19:21

RaidersSphere3rd/EFFYのゲームエンジンであるRSE.exe上で動作するミッションを組むには、SphereEngineスクリプトというスクリプト言語でミッションを記述する必要があるわけなのですが、その統合開発環境が若葉堂本舗さんのRSEclipseです。(中身はeclipse+若葉堂本舗さん開発のRSEclipseプラグイン+必須プラグイン

この開発環境、コード入力支援だけでなく新規ミッションパッケージのひな形まで自動生成してくれる優れものです。うちでも使用させていただいております。

現在、サイトではバージョン2のインストーラダウンロードできますが、実は3.xがリリースされています。しかし、インストーラはまだないので、まずバージョン2をインストールしたあと、次のような手順による更新作業が必要です。

また、すでにバージョン3へ更新した人も、さらに最新の修正をネットワーク更新で反映することができます。この方法も最後に説明します。

RSEclipse2.xを3.xに更新する

00:14

RSEclipse2.xを、3.xに更新するには、以下の作業が必要です。

  1. RSEclipseのアップデート用サイトを変更する
  2. RSEclipse2.xプラグインをRSeclipseから削除する
  3. RSEclipse3.xプラグインをRSeclipseにインストールする

以下、手順を説明します。

(1)RSEclipseを起動し、「ウィンドウ」→「設定」を押します。

f:id:yumeno:20110906234032p:image

(2)「Install/Update」→「Available Software Sites」を選択し、一覧から「RSEclipse2」を選び、「Edit」ボタンを押します。

f:id:yumeno:20110907000007p:image

(3)次のような画面が表示されます。

f:id:yumeno:20110906234034p:image

「Name」を「RSEclipse3」に、

「Location」を「http://rs.wakabadou.net/rseclipse/3.x/」に修正します。

f:id:yumeno:20110906234035p:image

修正したら、「OK」ボタンを押します。

(4)一覧に表示されるサイト名とURLが正しく変更されていることを確認して、「OK」ボタンを押します。

f:id:yumeno:20110906234036p:image

(5)続いて「ヘルプ」→「Eclipse Platformについて」を押します。

f:id:yumeno:20110906234037p:image

(6)「Installation Details」ボタンを押します。

f:id:yumeno:20110906234038p:image

(7)「Installed Software」タブの一覧から「RSEclipse」を選び、「Uninstall」ボタンを押します。

f:id:yumeno:20110906234039p:image

(8)少し待ちます。

f:id:yumeno:20110906234040p:image

(9)確認画面が表示されますので、「終了」ボタンを押します。

f:id:yumeno:20110906234041p:image

(10)少し待ちます。

f:id:yumeno:20110906234042p:image

(11)RSEclipseの再起動を促すダイヤログが表示されますので、「はい」ボタンを押してRSEclipseを再起動します。

f:id:yumeno:20110906234043p:image

(12)RSEclipseが再起動されたら、「ヘルプ」→「Install New Software」を押します。

f:id:yumeno:20110906234044p:image

(13)「Work with:」欄で、ドロップダウンリストから「RSEclipse3」を選びます。

f:id:yumeno:20110906234045p:image

(14)「Group items by category」チェックボックスのチェックを外します。

f:id:yumeno:20110906234046p:image

(15)中央の一覧に「RSEclipse」が表示されますので、チェックボックスにチェックを入れ、「次へ」ボタンを押します。

f:id:yumeno:20110907001302p:image

(16)確認画面が表示されますので、「終了」ボタンを押します。

f:id:yumeno:20110906234048p:image

(17)少し待ちます。

f:id:yumeno:20110906234049p:image

(18)証明書に関する警告が出ますが、「OK」ボタンを押します。

f:id:yumeno:20110906234050p:image

(19)少し待ちます。

f:id:yumeno:20110906234051p:image

(20)RSEclipseの再起動を促すダイヤログが表示されますので、「はい」ボタンを押してRSEclipseを再起動します。

f:id:yumeno:20110906234052p:image

以上で更新は完了です。

RSEclipse3.xを最新版にネットワーク更新する

01:46

(1)「ヘルプ」→「Check for Updates」を選択します。

f:id:yumeno:20110907013940p:image

(2)少し待ちます。

f:id:yumeno:20110907013941p:image

(3)もしこんな画面が表示されたら、OKを押します。

f:id:yumeno:20110907013942p:image

(4)「次へ」ボタンを押します。

f:id:yumeno:20110907013943p:image

(5)「終了」ボタンを押します。

f:id:yumeno:20110907013944p:image

(6)少し待ちます。

f:id:yumeno:20110907013945p:image

(7)証明書についての警告が出ますが、「OK」ボタンを押します。

f:id:yumeno:20110907013946p:image

(8)少し待ちます。

f:id:yumeno:20110907013947p:image

(9)RSEclipseの再起動を促すダイヤログが表示されますので、「はい」ボタンを押してRSEclipseを再起動します。

f:id:yumeno:20110907013948p:image

2011-08-23

いまさら相対座標指定ライブラリの解説

20:10

相対座標指定ライブラリの解説を遅ればせながら、してみます。

referの説明はついったーで昨日やったから…だれかtogetterか何かでまとめてくださると?

道具立ての準備

20:10

まず、いろいろ道具が必要なので準備します。

円周率必要なので最初に定義します。

sqrt()はルート(平方根)を計算する関数です。

これもあると便利なのでとりあえず準備しておきます。


続いて、ベクトルのx軸周りの回転、y軸周りの回転、z軸周りの回転を準備します。

回転行列ですが、実は覚えてなくても簡単に作ることができます。

たとえば2次元ベクトル(x1,y1)をθだけ回転したら(x2,y2)になるような次のような回転行列の各成分を求めたいとします。

\begin{pmatrix}x_2 \\y_2\end{pmatrix}=\begin{pmatrix}a & b \\c & d\end{pmatrix}\begin{pmatrix}x_1 \\y_1\end{pmatrix}

この場合、各座標軸方向の単位ベクトル(長さ1のベクトル)を上の式に従ってθだけ回転してみます。

すると、(x1,y1)=(1,0)の回転結果は(x2,y2)=(a,c)。

(x1,y1)=(0,1)の回転結果は(x2,y2)=(b,d)となりますね。

では実際に絵を書いて、各座標軸方向の単位ベクトルを回転するとどうなるか確認します。

f:id:yumeno:20110823200707p:image

図より、a=cosθ, c=sinθ, b=-sinθ, d=cosθであることがわかりますね!

3次元ベクトルの回転行列についても全く同様に求めることができます。

\begin{pmatrix}x_2 \\y_2 \\z_2 \end{pmatrix}=\begin{pmatrix}a & b & c \\d & e & f \\g & h & i\end{pmatrix}\begin{pmatrix}x_1 \\y_1 \\z_1 \end{pmatrix}

このように回転行列を置いておいて、各軸方向の単位ベクトル(1,0,0)、(0,1,0)、(0,0,1)を回してみて各成分を求めればOKです。

(1,0,0)を回した結果が(a,d,g)、(0,1,0)を回した結果が(b,e,h)、(0,0,1)を回した結果が(c,f,i)になりますので、あとは作図して実際に成分を求める作業です。

それぞれRaiders Sphereの座標系&回転方向だと、次のようになります。

ベクトル(x1,y1,z1)をx軸まわりにθだけ回すとすると(_rot_x_axis)、

f:id:yumeno:20110823200808p:image

このようになります。回転軸であるx軸の単位ベクトル(1,0,0)は回転しても変化せず(1,0,0)のままですので、回転行列は以下の通りです。

\begin{pmatrix}x_2 \\y_2 \\z_2 \end{pmatrix}=\begin{pmatrix}1 & 0 & 0 \\0 & \cos{\theta} & sin{\theta} \\0 & -\sin{\theta} & \cos{\theta}\end{pmatrix}\begin{pmatrix}x_1 \\y_1 \\z_1 \end{pmatrix}

同様にy軸まわりにψだけ回すとすると(_rot_y_axis)、

f:id:yumeno:20110823200809p:image

このようになります。回転軸であるy軸の単位ベクトル(0,1,0)は回転しても変化せず(0,1,0)のままですので、回転行列は以下の通りです。

\begin{pmatrix}x_2 \\y_2 \\z_2 \end{pmatrix}=\begin{pmatrix}\cos{\psi} & 0 & \sin{\psi} \\0 & 1 & 0 \\-\sin{\psi} & 0 & \cos{\psi}\end{pmatrix}\begin{pmatrix}x_1 \\y_1 \\z_1 \end{pmatrix}

同様にz軸まわりにφだけ回すとすると(_rot_z_axis)、

f:id:yumeno:20110823200810p:image

このようになります。回転軸であるz軸の単位ベクトル(0,0,1)は回転しても変化せず(0,0,1)のままですので、回転行列は以下の通りです。

\begin{pmatrix}x_2 \\y_2 \\z_2 \end{pmatrix}=\begin{pmatrix}\cos{\phi} & -\sin{\phi} & 0 \\\sin{\phi} & \cos{\phi} & 0 \\0 & 0 & 1\end{pmatrix}\begin{pmatrix}x_1 \\y_1 \\z_1 \end{pmatrix}

です。これらを計算する関数をそれぞれ用意しておきます。

また、同じ計算をするが、使用する引数を簡単化した関数(rot_x_axis, rot_y_axis, rot_z_axis)を用意します。

ヨー軸回転の話は…

20:18

飛ばします!

解説書きかけているうちに、もっといい書き方がある気がしてきたんだ…

(calc_rxryrzとrel_rot_yawですね。どちらもこの後の関数では使わないのです)

あるユニットを別のユニットの持つ相対座標系で指定した座標に移動するには…

20:18

次は相対座標系を利用した移動の処理です。おおまかに次のような流れで進みます。

  1. 基準とする相対座標系を持つ機体の、絶対座標系における位置(px,py,pz)を求める
  2. 基準とする相対座標系を持つ機体の姿勢(ピッチ角rx、方位角ry、バンク角rz)を求める
  3. 相対座標系におけるベクトル(x, y, z)が、絶対座標系基準ではどのような値になるか求め(x, y, z)に上書きする(calc_rel_posを使う)
  4. 移動したい機体を、まず基準とする相対座標系を持つ機体と同じ位置に移動する
  5. 続いて移動したい機体を、ベクトル(x, y, z)ぶんだけ平行移動する
  6. 機体の向きを、基準とする相対座標系を持つ機体とそろえる

以上です。これがset_rel_pos_xyz_absの中身です。

実は、「相対座標系におけるベクトル(x, y, z)が、絶対座標系基準ではどのような値になるか求め(x, y, z)に上書きする」の部分以外はそんなに難しくありません。

相対座標系におけるベクトルが、絶対座標系基準ではどのような値になるか求める

20:18

2次元世界の場合の相対座標系と絶対座標系の座標変換について、ちょっと考えてみます。

下図左のように、平面上の機体に相対座標系が割りつけられていて、赤いベクトルの相対座標系での値(x,y)が分かっていたとして、赤いベクトルの絶対座標系での値を求めたい、とします。

f:id:yumeno:20110823201341p:image

実はその計算は、上図右のように、(相対座標系の座標軸が絶対座標系の座標軸を回転して得られるなら)赤いベクトルを回転することで得られます。

(もし座標系の座標軸が平行移動も含むなら、平行移動して回転すればOKです)

3次元世界の場合でも同じですから、

機体姿勢がピッチ角rx、方位角ry、バンク角rzの場合、相対座標系におけるベクトル(x,y,z)を、z軸周りにrz回転させ、次にx軸周りにrx回転させ、次にy軸周りにryだけ回転させれば!

そのベクトルの絶対座標系における値が計算できるのです。

この処理を行っているのが、_calc_rel_pos(同じくcalc_rel_pos)ですね。