したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

SphereScript言語仕様について

1電プロ:2009/08/14(金) 00:20:30
8/16のベータ版リリースへ向けてSphereScriptの本格実装を急いでいる現状ですが、SphereEngine4の前にリリースする目的は、先に言語仕様を公開することで意見をもらい、SphereEngine4のリリース後に「こうしておけばよかった!」ということをなくすためです。

プロのエンジニアの方、RSEのスクリプトが初めてのプログラミングの方、双方からの提案をお待ちしています。

一応、プログラマ以外にも分かるように「RSEのスクリプト」と比較すると
・レジスタ、フラグ、ラベルを「変数」に統一化して自分で好きな名前が付けられる。必然的に個別の上限数も無くなった。(全体で上限8096件まで)
・カウンタは言語仕様からは消えた。代わりにスクリプト自体により記述され、機能提供されている。
・四則計算や論理計算がそのまま書けるので「敵機が8以上いてなおかつ味方機がその半分以下の状態で、自機の残りHPが30%以下になった場合」というスクリプトが1行で書けるようになった
・#includeによりスクリプトを分割、流用できる
・台詞ウィンドウの中身をスクリプト実行時に計算して作成できる
・スクリプトのサイズ制限がほぼ無くなった(各ファイル最大65536行256桁)
・スレッド数の制限もほぼ無くなった(互換性のため今は16本だが256本に拡張予定)

ついでに、プログラマ向けに現在のSphereScriptの言語仕様をANSI C言語と比較した場合の大きな違いを列挙しておきます。
SphereScriptには...
・switch~case構文が無い。
・doubleやshortやcharが無い。
・構造体、共用体、ビットフィールドがない。
・ポインタが無い、代わりに参照型がある。
・文字列-数値間にも暗黙の型キャストが行われる。必ず文字列になる。
・文字列と数値を+演算子でそのまま加算できる(数値が文字列展開されて結合される)
・変数宣言が無くてもいい。
・VBのようなvaliable型(可変型)がある。
・valiable型は関数の引数や戻り値にも指定できる。

2電プロ:2009/08/14(金) 00:24:07
現状の言語仕様での実装例としては、公式対戦サーバの11thOnlineのスクリプトが参考になります。
http://raiderssphere.net/11th_online.zip

3wakaba:2009/08/14(金) 00:42:16
早速ですが質問です。
配列の初期化方法はどのように行うのでしょうか?

個人的にはJavaScriptやRubyなどで使用されている、[]形式での初期化が行えると記述量が減って大分うれしいのですが。

記法としては以下のイメージです。
//空の配列を作る。
r_list = [];

//初期値を持った配列を作る
num_list = [1, 2, 3];

r_list = [
"R-10",
"R-21",
"R-24"
];

なお、私が普段業務で使用しているPHPではarr = array();とした形式で配列の初期化を行います。
ただ、PHPでも上記の[]の形式で配列定義出来た方が良いのではないか?といった動きが出ている事を付記しておきます。

4電プロ:2009/08/14(金) 08:06:45
>>3 wakabaさん
現状では、配列をまとめて初期化する方法はありません。(宣言時にゼロクリアされるだけです)

c言語では配列の初期化時に
int clear_score[5]={100,150,200,300,400};
という記述が出来るのですが、同じ機構を導入することを考えています。11thのスクリプトを移植していて、初期化が出来たらなぁ〜とは思っていたので。

ちなみに、c言語で上記記述が出来るのは宣言時のみですが、
宣言時以外でもまとめて初期化できると便利かもしれません。
それに加え、上記記述だと配列の5番目に代入しているように見えるので、分かりにくい。(人間にとってもコンパイラにとっても)
というより、SpEでは変数宣言が不要なので、言語仕様の軽量化という意味でも宣言と同時の初期化は出来ないようにしたほうが良いでしょう。プロにとってはまどろっこしいですが、1行に2つ以上の意味を持たせると、途端に学習難易度が上がってしまいます。覚えやすさ優先で。
↓たぶんこうします。

//int clear_score[5]; //変数宣言が必要な場合はこう
clear_score[]={100,100,100,100,100}; //中身を100で埋める
...
clear_score[]={stage_id*50+200,stage_id*60+200,stage_id*80+200,stage_id*100+300,stage_id*100+500}; //後から配列をまとめて更新
...
n=clear_score[level]; //配列要素にアクセス

5wakaba:2009/08/14(金) 09:02:10
>>4 電プロさん
早速の返信ありがとうございます。

> 現状では、配列をまとめて初期化する方法はありません。(宣言時にゼロクリアされるだけです)
なるほど。

> int clear_score[5]={100,150,200,300,400};
> それに加え、上記記述だと配列の5番目に代入しているように見えるので、分かりにくい。(人間にとってもコンパイラにとっても)
他のスクリプト言語ならばこの場合だと配列の6番目に配列を代入している認識になりますね。
# 型宣言をはずせばclear_score配列の6番目の要素に連想配列またはJSON形式の無名クラスインスタンスを入れている形になりますね。
# RubyとJavaScriptではそういう解釈になります。おそらくPHP6でもそうなるはず。
# 右辺が配列インスタンスならばJavaでもC#でもそうか。

> プロにとってはまどろっこしいですが、
まどろっこしいというよりも、経験からくる期待する動作と異なった動きからバグ、あるいは使えない言語と認識されそうで怖い所ですが・・・
また、他言語の概念を流用できないため、他の言語を使っての説明も困難になります。

> //int clear_score[5]; //変数宣言が必要な場合はこう
> clear_score[]={100,100,100,100,100}; //中身を100で埋める
> ...
> clear_score[]={stage_id*50+200,stage_id*60+200,stage_id*80+200,stage_id*100+300,stage_id*100+500}; //後から配列をまとめて更新
> ...
> n=clear_score[level]; //配列要素にアクセス
これは危険な気がします。
他のスクリプト言語での期待される結果は以下になりますね。

clear_score[]={100,100,100,100,100}; //clear_score配列に0番目の要素を作り配列{100,100,100,100,100}を代入
clear_score[]={stage_id*50+200,stage_id*60+200,stage_id*80+200,stage_id*100+300,stage_id*100+500}; //途中で追加が無ければ1番目の要素を作り配列を代入
n=clear_score[level]; //levelが0ならば配列{100,100,100,100,100}を取得できる。

スクリプト言語を名乗る以上、記述の参考にするのはスクリプト言語にしたほうが他言語経験者にとってはギャップが最小化されるのではないでしょうか?

追伸:
{}の使い方もヤバイかもしれません。
{}でくくられた要素はJavaScript(と、おそらくPHP6。導入検討中)ではJSON形式の、Rubyでは連想配列として見なされます。
このギャップは看過できないレベルになると思われます。
また、上記言語に限らず「{}はJSON形式として扱おう」という流れが出来つつあります。
そのために言語の記法の拡張まで行われている現状において、別の意味を持たせるのは危険だと考えられます。

6電プロ:2009/08/30(日) 13:06:53
>>wakabaさん
>clear_score[]={100,100,100,100,100}; //clear_score配列に0番目の要素を作り配列{100,100,100,100,100}を代入
>clear_score[]={stage_id*50+200,stage_id*60+200,stage_id*80+200,stage_id*100+300,stage_id*100+500}; //途中で追加が無ければ1番目の要素を作り配列を代入
>n=clear_score[level]; //levelが0ならば配列{100,100,100,100,100}を取得できる。
ここをC++使いの私にも、分かりやすく書いてもらえませんか?
コメントが、2次元配列を作っているように読めてしまいます。
C言語で書く以下の処理を置き換えるとどうなりますか?宣言は無いと思うので単にまとめて代入する処理だけになると思いますが。

int list[]={10,20,30,40,50}; //1次元配列の宣言および初期化(C言語の場合まとめて代入できるのは宣言時のみ)
n=list[3]; //配列の4番目にアクセス

7電プロ:2009/08/30(日) 13:11:57
ついでに、近いうちにプリプロセッサを導入しようと思います。
今あるのは
#include "ファイル名"
のみですが、C言語にある以下のものを追加予定です。
#define
#if
#else
#elif
#endif
#ifdef
#ifndef

#defineはなるべく早く作りたいです。そうすれば
int TRUE=1;
とかいうアホなスクリプトをインクルートファイルに用意する必要がなくなります。

#ifdefとかはかなりプロユースな感じですが、あるとRS4の開発でラクができるので入れたいところ。

8wakaba:2009/08/31(月) 01:08:07
ファイルパスについて2点要望があります。

1. 扱っている文字列が明示的にファイルパスであると判る型の追加は出来ませんでしょうか?
ex) path SPE_HOME = "C:/spe/";
現状の仕様では、変数だけではそれが文字列なのかファイルパスなのか判らないので・・・

2. 上記の例でも書いていますが、パスの区切り文字は「/」に出来ませんでしょうか?
エスケープがらみで泣く人が出そうなので、対応頂ければと思います。

9電プロ:2009/08/31(月) 21:17:38
>>8 wakabaさん
>1. 扱っている文字列が明示的にファイルパスであると判る型の追加は出来ませんでしょうか?
ファイル名を文字列扱いできなくする(表示出来ない、計算できない)利点が無いのでやりません。
RSEClipseの都合ではないですか?正規表現で対応してください。

>2. 上記の例でも書いていますが、パスの区切り文字は「/」に出来ませんでしょうか?
採用。(゚ー゚)b

"..\\bgm\\rs3_04_m01.rad"
というようにファイル名でいちいち\マークを2つ重ねざるを得ないのは、C言語と同じなのですが、以前よりイライラを感じておりました。プロでもよく間違えます。(設計書からファイル名をコピペしたりする時に)
"../bgm/rs3_04_m01.rad"
と書ければ間違いも減ってよいと思います。

10wakaba:2009/08/31(月) 23:11:17
>>9
2番採用ありがとうございます。

1.ですが、現行ではファイルパスはプリミティブで書けることにより文字列と明確に差別化されています。
現在の実装では文字列として扱われるため、改めて明示的に分けてあったほうが見易いと考えているからです。
また、将来的にディレクトリトラバーサルなどの攻撃が現実となった時に、既存のスクリプトに手を加えずにある程度エンジン側で対応できるメリットがあります。

値そのものは文字列と同じ振る舞いで大丈夫だと思います。
その値がパスである事を強調するくらいとなります。

ちなみに正規表現で対応についてですが、SphereScriptではマルチバイトセーフな正規表現エンジンが実装されるのでしょうか?
また、正規表現を扱える人は絶望的に少ないような・・・(ましてやWindowsのファイルシステムを理解した上でとなると)

11wakaba:2009/09/06(日) 01:19:00
>>電プロさん
型と定数について確認させて下さい。

1. 型について
現在、SpSにて考慮されている型は以下の種類であっていますでしょうか?
int、float、string

また、関数ポインタと配列に型名が付くとしたら以下のイメージでしょうか?
function、array

2. 定数について
定義部を見ずに定数と認識する方法は制定されますでしょうか?
例えば、SpSと同様に変数名の頭に記号が付かないRubyでは、大文字で構成されたものは定数と見なすとしています。
# PHPの場合は変数の頭に$が付くので、定数は$が付いているかいないかで判断されますが。
# 但し、慣例としてPHPでも定数は全て大文字で表現されます。

1ユーザとしては定数は全て大文字で記述すること。との規約と制約があると助かるところです。

追伸:
こちらのスレでの書き込みは以下の観点から記述しています。
1. それが実装されれば書きやすい、記述量を適切に減らせるものかどうか
2. 時間がたってからスクリプトをメンテナンスする際に間違えないように出来るかどうか
3. ユーザ同士でスクリプトを読みあう際に障壁を削れるかどうか

RSEclipse都合の場合はそれを明示します。
ですので、原則として上記の認識の元で書いているものとお考え下さい。

12電プロ:2009/09/16(水) 21:19:26
>>11 wakabaさん
遅くなりました。回答します。

1.
型として使われる予約語は以下のとおりです。
int, float, string, valiable

referは型を参照と見なす修飾子なので型ではありません。
単に
refer
と書くと
refer valiable
と同じ意味になります。
配列型は用意しません。関数ポインタは今のところvaliable型で代用していますが、そのうちfunction型を使えるようにしたいです。そうすると関数定義との整合性が揃うので言語仕様的にもすっきりします。



2.
定数と変数を言語仕様で分けることは考えていません。
理由は書くと長くなるので割愛します。
紛らわしいという件については、「定数は全部大文字」というルールで対応します。C言語の一般的なコーディング規約と同じです。


それと、しつこいようで恐縮ですが
>>6
の返答をいただけないでしょうか?
配列周りは後から変えられない言語基幹部分なので、早めに仕様を固めたいです。

13wakaba:2009/09/16(水) 23:07:18
>>12 電プロさん
回答ありがとうございます。

> 型として使われる予約語は以下のとおりです。
> int, float, string, valiable
了解です。
# 個人的には「valiable」は「var」だと嬉しいです。英語が苦手な人でも間違えずにすむので。
# 「ヴァりあぶるなんて空じゃかけねーっす><」とか。

> referは型を参照と見なす修飾子なので型ではありません。
使い方のイメージ的は以下でしょうか?
@php hogehuga変数をhoge変数に参照渡し。
$hoge =& $hogehuga;

@sps hogehuga変数をhoge変数に参照渡し。
hoge = refer hogehuga;

# ・・・ではなくて、単純に「この変数は参照でしか扱えません宣言」だったらどうしよう。

> 2.
> 紛らわしいという件については、「定数は全部大文字」というルールで対応します。C言語の一般的なコーディング規約と同じです。
了解しました。

ちなみに定数の定義はどのようになるのでしょうか?
#define int MAX_HP = 9999;
あるいは
#define int MAX_HP 9999;
でしょうか?
RSEclipe側の都合となってしまうのですが、すぐ回答いただけるようでしたら、これだけでも早めに回答頂けると幸いです。

> >>6 の返答をいただけないでしょうか?
申し訳ありません。見落としていました。

> コメントが、2次元配列を作っているように読めてしまいます。
元の書き方ですと、スクリプターとしては2次元配列を作っているように見える。と言う事を表現していました。

> C言語で書く以下の処理を置き換えるとどうなりますか?宣言は無いと思うので単にまとめて代入する処理だけになると思いますが。
> int list[]={10,20,30,40,50}; //1次元配列の宣言および初期化(C言語の場合まとめて代入できるのは宣言時のみ)
> n=list[3]; //配列の4番目にアクセス
配列ならば以下となります。
list = [10,20,30,40,50]; //1次元配列を作って代入
n=list[3]; //配列の4番目にアクセス

整数型だけを受け取れる配列ではなく、配列は配列という認識ですね。
なので、以下も許容されます。
list = [10,'asdf',30,'ほげふが',50];
n=list[1]; //配列の2番目にアクセス。nには'asdf'が入る
n=list[2]; //配列の3番目にアクセス。nには30が入る

# そういや連想配列はどうするんだろう。
# RubyやJSONっぽく
# hash_map = {"key" : "value", "10" : 200};
# が妥当なのだろうか。

14電プロ:2009/09/16(水) 23:50:10
>>13 wakabaさん
#defineをはじめとするプリプロセッサは、C言語と同じにすることを目指しています。(マクロ関数は正直厳しいと思うけど…)
なので、
#define HP_MAX 9999
となります。

ただ、現在はプリプロセッサが#includeのみなので、TRUEとかFALSEはヘッダにて、
int TRUE=1;
int FALSE=0;
と、カッコ悪いことこの上ない記述になっています。定数ヅラした単なる変数です。

15wakaba:2009/09/17(木) 00:16:49
>>14 電プロさん
ありがとうございます!
=なしですね。

> ただ、現在はプリプロセッサが#includeのみなので、TRUEとかFALSEはヘッダにて、
TRUE、FALSEは組み込み定数になってたりすると嬉しいところですね。
あるいは型を増やす?(え
# 0以外は全部trueだとCになるんでしたっけ?

そういや「未定義」を示す状態は無いのでしょうか?
nullとかundefinedとかですが。

16wakaba:2009/09/17(木) 00:29:28
>>14 電プロさん
すみません。定数定義で1点確認させて下さい。
定数定義時は型の指定は無しなのでしょうか?

17電プロ:2009/09/18(金) 22:10:28
>>16 wakabaさん
#defineが行うのは単なる置き換えです。型はありません。
参考までに、一般的なコンパイラの処理の流れをリストにしておきます。SphereScriptも中間コード生成で終了するまでの流れは同じです。
※専門家が言うには「プリプロセス」はコンパイラの機能として定義してはいけないらしいですが…。

プリプロセス

字句解析

構文解析

中間コード生成

最適化

機械コード生成

18wakaba:2009/09/22(火) 17:18:28
>>17 電プロさん
回答ありがとうございました。
ちなみに、#define中の演算は可能でしょうか?
例)
#define DAY_TS 24 * 60 * 60

n = 7;
#define N_DAYS_TS n * 24 * 60 * 60

新規となりますが、スコープについて確認させてください。

SphereScriptには「静的スコープ」はありますでしょうか?
もしなければ、強く実装を希望します。
フレームワークなどの基盤を作る場合の強力な下地となるためです。
また、グローバル変数を使わずに安全に値を管理することが出来るようになる利点もあります。

もしも、これから実装されるのでしたらば、以下の宣言の追加を提案します。
static 変数名;

以下は、想定しているサンプルスクリプトです。
----
//外部の影響を受けないように隔離したユニット管理関数
//unitを省略した場合、indexに紐づくunitを返す
function unit_manager(index, unit = null){
static unit_list; //<-静的スコープの宣言

if (is_set(unit_list)) { //is_setは変数が未定義かどうかを調べる仮関数
unit_list = []; //空配列として初期化
}

if (!is_null(unit)) { //is_nullは変数がnullかどうかを調べる仮関数
//unitが指定されている場合は追加または更新
unit_list[index] = unit;
}

if (is_set(unit_list[index])) {
return unit_list[index]; //登録済みの機体ならば機体を返す
}
return null; //未登録の場合はnullを返す
}

19wakaba:2009/09/22(火) 17:50:12
>>電プロさん
SphereScriptにおけるパスの扱いについて確認させてください。

http://www.rectangle.jp/denpro/rs3_350a_kari2.zip
に含まれる、mission04a.spt内1100行目における、音声ファイルへのパスが以下のようになっています。
"/voice/mob173.rad"
これは、「/」スタートの場合はRaidersSphereのインストールフォルダを「/」と見なす解釈でしょうか?

もしもそうならば、「/」の使用法についての再考を提案します。
一般的に「/」から始まるパスはそのオペレーティングシステム全体でのルートを指します。
そのため、表記上極めて紛らわしい形となることと、そこを突いてのセキュリティホールを容易に仕込む事が可能となるためです。
# /etc/passwd。これはシステムのパスワード?それともSPEのパスワード?

もしも変更が叶うならば、パスについて以下の仕様を提案します。
RaidersSphereのインストールフォルダは「C:\RaidersSphere3rd」とします。

●「/」または「C:/」などのドライブレターから始まるパス
システム全体のルートからのパスを指します。
「C:/」はWindows上のファイルシステムにおける「C:\」と同義となります。
「/」はWindows上ではWindowsがインストールされているドライブと同義となります。
# 「Cドライブ」にWindowsがインストールされている場合 => 「C:/」と同じ。

「C:\RaidersSphere3rd\mission\mission01.spt」内で#include "/RaidersSphere3rd/common/lib.inc"とした場合、
"/RaidersSphere3rd/common/lib.inc"は「C:\RaidersSphere3rd\common\lib.inc」と見なされる

●「./」から始まるパス
パスを指定しているファイルと同じフォルダを指します。
「C:\RaidersSphere3rd\mission\mission01.spt」内で#include "./rse.inc"とした場合、
"./rse.inc"は「C:\RaidersSphere3rd\mission\rse.inc」と見なされる

●「../」から始まるパス
パスを指定しているファイルの一つ上のフォルダを指します。
「C:\RaidersSphere3rd\mission\mission01.spt」内で#include "../unit.inc"とした場合、
"./unit.inc"は「C:\RaidersSphere3rd\unit.inc」と見なされる

●先頭に「/」「./」「../」がつかないパス
RaidersSphereのインストールフォルダを指します。
「C:\RaidersSphere3rd\mission\mission01.spt」内で#include "system.inc"とした場合、
"system.inc"は「C:\RaidersSphere3rd\system.inc」と見なされる

20電プロ:2009/09/22(火) 18:07:22
>19 wakabaさん
単にバックスラッシュが分かりにくいので「\」を「/」に置き換えただけです。

話を戻して(あえて旧形式で書きます)「"\voice\mob173.rad"」の1文字目の「\」がおかしい件について。
確かにおかしいです。本来スクリプトからの相対パスなので「"voice\mob173.rad"」と書かなければいけないはずです。
というか単なる解釈側のバグの可能性もあるので確認しておきます。

それと、RSEが現在取り扱い中のゲームコンテンツ以外のシステムを触れるのはコンセプトからしてもおかしいので、
RSEインストールフォルダより上の場所にはアクセスできない仕組みが必要と思われます。
いわゆる「絶対パスのルート」がRSE.exeのある場所になり、それ以外は相対パスになります。

3.5世代では書き込み命令は存在しないので、今は問題にはなりませんが、
SpE4ではきっとファイルが読み書き自由になると思うので、何らかの対策が必要です。

21wakaba:2009/09/22(火) 18:24:24
>>20 電プロさん

早速の回答ありがとうございます。

> というか単なる解釈側のバグの可能性もあるので確認しておきます。
了解です。

> それと、RSEが現在取り扱い中のゲームコンテンツ以外のシステムを触れるのはコンセプトからしてもおかしいので、
> RSEインストールフォルダより上の場所にはアクセスできない仕組みが必要と思われます。
> いわゆる「絶対パスのルート」がRSE.exeのある場所になり、それ以外は相対パスになります。
RSEまでは単体でかつ3DフライトSTGの"クライアントしか(失礼)"作成出来ない環境だったので、上記のコンセプトで問題ないと思います。
ただし、今後SpEを展開するに当たり、サーバ上の任意のリソースにアクセス出来ないのは実用上致命的だと考えます。

# 例えば、LIGHT_HOSTからhtdocs配下に何かを出力したい場合、Webサーバの設定をいじってSphereEngine配下を公開領域としなければならなくなる。
# あるいは、日次バッチで出力されたファイルを参照したい場合には、バッチ側でSphereEngine配下にデータを出力しなければならなくなる。
# 仮にスケールアウトが必要な環境となった場合、全部のサーバに対してバッチから出力を行う? <= この行は未来過ぎ
# 結論としてセキュリティの観点からも環境構築、運用の観点からも致命的と考えます。

> 3.5世代では書き込み命令は存在しないので、今は問題にはなりませんが、
> SpE4ではきっとファイルが読み書き自由になると思うので、何らかの対策が必要です。
そうなりますね。
実は読み込みでも結構怖かったりしますが。
Thumbs.dbからイヤンアハンな何かを調達出来ちゃったりもしますし。

22selen:2009/11/25(水) 04:13:31
>>電プロさん
SphereScriptの記法について質問があります。
get_status命令で、example=get_status("PLAYERS_WEAPON"); から武装IDを取得する場合、旧スクリプトでR0-R3に割り当てられて
いた部分(自機、メインパイロン、サブパイロン、センターパイロン)は、それぞれどのように記述すれば良いのでしょうか?
ご教授頂けると幸いです。

23電プロ:2009/11/25(水) 23:40:46
>>22 selenさん
要点のみで失礼させていただきます。
get_status("PLAYERS_MAIN_WEAPON", 0); //プレイヤーメイン武装
get_status("PLAYERS_SUB_WEAPON", 0); //プレイヤーサブ武装
get_status("PLAYERS_CENTERWEAPON", 0); //プレイヤーセンター武装


24電プロ:2009/11/25(水) 23:41:38
>>23 追加
get_status("PLAYERS_PLANE", 0); //プレイヤー機種

25selen:2009/11/26(木) 07:05:37
>>23-24 電プロさん
ご回答ありがとうございます。
ご教授頂いたように記述した所、作成中のスクリプトが無事動作致しました。ありがとうございました。

26wakaba:2009/12/09(水) 23:36:35
>> 電プロさん
予定機能の実装タイミングについて確認させてください。

>>7にあった機能のうち、defineが実装される時期はいつくらいでしょうか?
RSEclipse側でC77までに対応するかどうかの判断として使いたいので、
回答頂けると幸いです。

27電プロ:2009/12/09(水) 23:56:06
>>26 wakabaさん
冬コミ後に対応します。多分3月とか4月です。

RS4の工程上、まずは「ビル立てて、敵置いて、飛べる」ものを作るのが最優先となっています。
11thと違ってRS4は多人数でつくるので”クリティカルパス”の発想が必要になります。

28wakaba:2009/12/10(木) 00:21:23
>>26 電プロさん
冬コミ後ですね。ありがとうございます。

29JoJo:2010/03/26(金) 13:04:02
お世話になります。
リファレンスのset_colorの動作に
「(前略)3Dスプライトのユニットの色を変化させる。」
とありますが
3Dスプライトとはなんでしょうか?
またどのような場面で使われているのでしょうか?教えて下さい。

30電プロ:2010/03/27(土) 13:59:55
>>29 Jojoさん
情報不足でご迷惑おかけ中です…。
set_colorはRS3の最後のレイチェルの台詞表示で使われています。(あれは実質的に2Dですが…)


set_color(id, r, g, b, a);
引数:id ユニットのラベルID
r,g,b,a 赤,緑,青,不透明度(0-255)
説明:
パッケージファイルのテクスチャタイプにおいてSURFACE/CROSS/SPRITEを設定するか、またはスクリプト内部においてcreate_sprite()関数を使用して作成した3Dスプライトユニットのうち、[id]にて指定されるユニットの頂点カラーを[r,g,b,a]に変更します。


↑はやいところ、こういうのを全関数まとめたいのですが、優先順位の関係で、4月下旬頃の着手になりそうです。

31スティンガー:2010/04/05(月) 03:54:36
こんばんは。
要望を2点。

1.兵装のチェーンガンやミサイルポッドに関して
 現状は弾の射出位置は座標(0,0,0)で固定だったと
思いますが任意の位置から射出出来ませんでしょうか?
3Dモデルの形状によっては出鱈目な位置から
攻撃が発生してしまいます。

2.プレーヤ機死亡後に関して
 ダメージ率100%でゲームオーバとなりますが、処理継続
できるようになりませんでしょうか?
プレーヤ敗北用のエンディングや、敵主要キャラが勝ったとき
の台詞で「m9(^Д^)死に腐れ」的なイベントを作って見たいです。

32wakaba:2010/04/11(日) 23:03:26
2. についてはスクリプト側でHPにゲタを履かせるのは如何でしょう?
HPを+10000くらいにしておいて、規定値以下になったらゲームオーバー扱いにするなど。
規定値以下になった場合の例としてはラバーズなどの撃破後沈降処理が参考になると思います。

33スティンガー:2010/04/12(月) 23:29:46
>>32
ご意見有難うございます。
 しかし、自機に対し高いHPを設定するとHUDのダメージ
表示が余り機能しなくなるのでは?(未だ試していませんが)
例えばHP10000で10ダメージ食らっても表示の
ダメージは0のままと思われます。また、ビルや地面に
垂直に衝突した場合はHPの量を問わず即死だったと思います。

34wakaba:2010/04/19(月) 01:10:45
>> 電プロさん
EFFY移植チームの若葉です。

現状のRSE3.5の仕様について3点確認させてください。
1. 関数の変数への代入は可能かどうか。
 スレッド作成時には行えているように見えます。
 これを任意の関数、変数にて行うことは出来ませんでしょうか?

 あるいは、文字列で渡した関数名を実行する関数でも大丈夫です。
 ex) http://php.net/manual/ja/function.call-user-func.php
 SPTならばこちらのイメージです => call_user_function('create_copy', dst_label, src_label);

2. 関数の変数への代入が可能ならば、配列にて使用できるかどうか。
 おそらく可能だとは思いますが、念のため確認させて下さい。

3. 2次元以上の配列の実装予定はいつぐらいになるか。
 2次元以上の配列を扱えると内部データの構造が大分すっきりするためです。
 JSON形式などのハッシュマップでも代用できますが、これは早くてもSpE4からですよね?

移植時の障害となっている箇所の回避目的のため、回答いただけますと幸いです。

35電プロ:2010/04/23(金) 22:07:00
>>34 wakabaさん
別のところで詳細を議論したので、結論をここにまとめます。

1. 関数の変数への代入は可能かどうか
関数ポインタはSpE4で実現したい機能ですが、EFFYを有償頒布する方向で動いているならば、RSE3.5にも搭載します。

2. 関数の変数への代入が可能ならば、配列にて使用できるかどうか。
関数型もしくは汎用型の変数に代入する実装となるため、自動的に配列にも対応することになります。

3. 2次元以上の配列の実装予定はいつぐらいになるか
もう実現済みです。
後日ココにサンプルを貼ります。


新しい話題ですが、構造体及び配列の丸ごと渡し&戻しも将来的にはやります。が、多分夏には間に合わない。実現できれば仕様がC言語と同等になり、システム記述が強力になるのですが…。

36JoJo:2010/04/25(日) 13:40:16
どうも、この度EFFY移植チームに移植されたJoJoです。
wait_time()の仕様について確認させて下さい。
3.51b現在、wait_time(2 / 60);と引数に代入すると

system.inc (66行目) : [Error] waitシステム割り込み命令の引数にゼロまたは負の値が指定されています

というエラーを吐きます。
2 / 60に限らず1 / 2など(恐らく)分数全てについて、同様のエラーを吐きます。
仕様でしょうか。

さて、現状では、1秒以下のwaitには必然的に小数を使うことになりますが
小数の桁数チェックが必要なら何桁まででしょうか。

また、そもそもこの問題は
3.2のwaitframeを、wait_time(1 / 60)と移植したのが事の発端ですが
waitframeからwait_timeへの正しいコンバートの仕方についても教えてください。

37電プロ:2010/04/25(日) 17:31:31
>>34 wakabaさん
二次元配列のサンプルです。九九の表を作ります。4次元配列まで作れるようになっているはず。(2次元までしか動作確認はしていませんが…)

#include "system.inc"

int list[10][10]; // 初期化(無くてもいい)
print_string("10x10の配列のテスト。九九の表を作る\n");

for (i=0;i<10;i++) {
for (j=0;j<10;j++) {
list[i][j]=i*j; // 九九の計算
}
}

for (i=1;i<10;i++) {
for (j=1;j<10;j++) {
print_string( i + "x" + j + "=" + list[i][j] + " ");
}
print_string("\n"); // 1行分出力したら改行
}

38電プロ:2010/04/25(日) 17:38:10
>>36 JoJoさん
2/60は「整数を整数で割り算」と解釈されるため、0になってしまいます。小数にするには、片方もしくは両方を小数にしてください。具体的には

wait_time(2.0 / 60.0);

と記述してください。2と2.0は(C言語でもそうですが)別の数値と解釈されます。

さらに、スクリプトの最初で

int FRAME_SEC=1/60.0;

と記述しておき、

wait_time(2 * FRAME_SEC);

と書くほうが見た目はプロっぽくなりますね。

39wakaba:2010/04/25(日) 19:27:31
>>37
サンプルありがとうございます。
これで特殊機動管理が大分楽になりそうです。

配列について追加の質問です。

以下の実装を行うとエラーとなります。
----
length = 2;

〜〜〜〜

int label_list[length];
label_list[0] = L200;
label_list[1] = L201;

increment = -1;
effy_fade_in(increment, label_list, length);
----
rs3original\ICKX\effy\st1.spt (187行目) : 変数定義のインデックスが即値ではありません。

配列サイズ指定に変数を使用する事は不可能なのでしょうか?

40電プロ:2010/04/25(日) 20:24:30
>>39 wakabaさん
配列初期化は即値整数で無ければいけません。
宣言無しでも配列が使えるようになっているので、そういう場合は自前で初期化ルーチンを作ってください。

領域自体は動的に確保しているので、そのうち言語拡張で変数も宣言に使えるようにするかもしれません。

41wakaba:2010/04/25(日) 21:39:56
>>40 電プロさん
なるほど、了解です。

> 宣言無しでも配列が使えるようになっているので、
凄く助かります。

それと先のコードでもう一点問題がありました。
関数の引数に配列を使用できないようです。
sps.exeで簡単に実証できるコードを容易しました。
お手数ですが確認をお願いします。

----
#include "system.inc"
print_string("Hello, Sphere!");

hoge[0] = 1;
hoge[1] = 2;
len = 2;

huga(hoge, len);

function huga (hoge, len) { // test.spt (10行目) : [Error] [hoge]は定義されていない変数です。
for (i = 0;i < len;i++) {
print_string(hoge[i]);
}
}
----

追伸:配列の長さを得る関数などは作れませんでしょうか?
そうすると上の関数の引数を一個削れるのですが・・・

42電プロ:2010/04/26(月) 19:04:09
>>41 wakabaさん
その例がまさしく「配列の全部渡し」であって、そのうち実装したいと言っている件です。

それと、実行エンジンの仕様上、配列の長さは取れません。取れたとしても全メモリ検索になるため、使い物になら無いほど遅くなります。
一般的なWeb系言語と異なり、ハッシュにしても添え字にしても、「配列の逆引き」が取れない仕組みです。

43wakaba:2010/04/26(月) 23:39:17
>>42 電プロさん
何の事か今まで正直さっぱりでしたがそういう意味でしたか > 全部渡し
そうなると、引数での配列の渡し、ひいては関数を利用した隠蔽化は当分出来ないという認識でOKでしょうか?

配列の逆引きも了解です。ちと厄介ですね。
Web系というか一般的なスクリプト言語全般での標準実装だけに・・・

関数ポインタで偽装版でも作れないものかな。

44電プロ:2010/04/29(木) 00:04:52
>>43 wakabaさん
配列渡しについては、作業優先順位として

関数ポインタ→RS3rd3D-Dive→SpE4エディタ→RS4体験版→構造体及び配列渡し→...

といった感じになっています。
スクリプトだけ優先しても「仏作って魂入れず」なので、順番に進めます。

技術的な点では、構造体と参照と配列があればハッシュマップと同等のライブラリが実現できるので、構造体の実装をお待ちください。
wakabaさんなら自前で作ることなど造作も無いはず。

現状では自前での実装すら出来ないので「ちと厄介」と思うのは私も同感です。


それと、web系(というかオープン系)スクリプトのみで言うとほぼ標準装備のハッシュマップですが、
もっと広い産業(ゲームとか、インフラとか、機械とか)まで含めて見ると、やはり特殊なものだったりします。
この違いは産業構造の違いから来るものです。
(ヒドイのになるとGUI「だけ」で書く言語(しかも業界標準)とか、「関数が全部スレッドになる」言語(しかもハードウェア自体が並列化される)とかがあります。オープン系が如何に均質化していることか…。)

45wakaba:2010/04/29(木) 01:22:57
>>44 電プロさん
> 関数ポインタ→RS3rd3D-Dive→SpE4エディタ→RS4体験版→構造体及び配列渡し→...
優先順位表ありがとうございます。
配列渡しはEFFYでは間に合わないですね。
大分ダーティだけど、渡したつもり配列を用意して管理するしかないかな。

> 技術的な点では、構造体と参照と配列があればハッシュマップと同等のライブラリが実現できるので、構造体の実装をお待ちください。
> wakabaさんなら自前で作ることなど造作も無いはず。
出来る範囲で何とかします。

> それと、web系(というかオープン系)スクリプトのみで言うとほぼ標準装備のハッシュマップですが、
> もっと広い産業(ゲームとか、インフラとか、機械とか)まで含めて見ると、やはり特殊なものだったりします。
ヘビーウェイトランゲージでもかなり特殊な扱いですからね・・・
豊富なのはJavaとC#くらいなイメージ。

> この違いは産業構造の違いから来るものです。
> (ヒドイのになるとGUI「だけ」で書く言語(しかも業界標準)とか、「関数が全部スレッドになる」言語(しかもハードウェア自体が並列化される)とかがあります。オープン系が如何に均質化していることか…。)
オープン系は業務レベルでの目的指向が多いですからね。そもそもリアルタイム性とか求められにくいし。Hadoopとか最たる例かも。
この話は興味あるし面白いので次回お会いしたときにでも・・・(え

46selen:2010/04/30(金) 21:46:25
>>電プロさん
>>29-30の内容について確認させて頂きたいことがあります。

ゲーム内で使用する3Dモデル(自機)に対し、スクリプトファイル内でcreate_sprite関数を使用して生成した平面モデルを
set_parent関数で貼り付けた時に、シェーダをオンにすると生成スプライトに対するモデルビュー変換は機能していても、
他のモデルに対する遮蔽計算が機能しなくなりますが(生成スプライトが他のモデルを透過して常時前面に表示されるように
なる)、これは正しい挙動なのでしょうか? シェーダオフの状態では透過するようなことはありません。

確認RSE:3.51, 3.51a, 3.51b
スプライトに貼り付けたテクスチャ:

UNIT_ID 860
UNIT_NAME "sample"
TEXTUREFILE_LARGE rs3original\name\title\img\sample.bmp
TEXTURESTYLE CROSS
TEXTURESTYLE LIGHT
TEXTURESTYLE SPRITE

SCALE (0.03,0.02,0.3)

UNIT_TYPE EFFECT
UNIT_ATTRIBUTE OBJECT
UNIT_ATTRIBUTE UNLISTED

47wakaba:2010/05/01(土) 22:01:05
電プロさん

3点要望、質問させてください。

1. デフォルト引数について
現在のSphereScriptでは関数オーバーロードは出来ません。
利用時に使用しない引数を省略するためにデフォルト引数という概念の導入は出来ませんでしょうか?

具体的には以下の実装が出来ることを期待します。

----
//int child_flag = FALSEとすることで、呼び出し側でchild_flag未指定時はFALSEが入る。
function move(int label, float pos_x, float pos_y, float pos_z, int child_flag = FALSE) {
〜〜中の処理〜〜
}

L1 = 1;
//L1を親として0, 0, 0に移動する
move (L1, 0, 0, 0);

//L1を子として親の0, 0, 0に移動する
move (L1, 0, 0, 0, TRUE);

//L1を親として0, 0, 0に移動する
move (L1, 0, 0, 0, FALSE);
----

移植作業を行った際に、今までは明示不要なものが明示必須になっていたため混乱した経験があります。
# 旧マニュアルにも書いてなかったし。

48wakaba:2010/05/01(土) 22:09:27
2. 配列の他関数への引渡し

現時点では配列を引数として渡せないとのことなので、グローバル変数に入れてから別の関数に渡す事を考えています。
そこで以下の実装を行ったのですが、ランタイムエラーとなりました。
現時点では関数内から別の関数へ配列を渡す事は不可能なのでしょうか?

なお、main();の下にint hoge[1];としても駄目でした。

----
#include "system.inc"

main();

function main () {
hoge[0] = 1;
hoge[1] = 2;
len = 2;
huga(len);
}

function huga (len) {
for (i = 0;i < len;i++) {
print_string(hoge[i]); //test.spt (14行目) : [Error] [hoge[0]]は定義されていない変数です。
}
}
----

49wakaba:2010/05/01(土) 22:11:46
3. 配列の代入

配列を別の変数に代入できません。
これも仕様なのでしょうか?

----
#include "system.inc"

hoge[0] = 1;
hoge[1] = 2;

fuga = hoge; //test.spt (6行目) : [Error] [hoge]は定義されていない変数です。
----

お手数ですが、ご検討のほどよろしくお願いします。

50電プロ:2010/05/01(土) 23:02:35
>>46 selenさん
データを受けとりました。
今の関数ポインタの作業が終わったら着手します。

>>47 wakabaさん
1.について
なぜデフォルト引数が必要なのか?

引数が省略できないことを知らなかったから

なぜ省略できないことを知らなかったのか?

マニュアルがまったく未整備だから。

ということで、「マニュアルが無い」ことが根本原因なので、とにかくマニュアルを作る作業を進めます。
引数をスタックに積んでいるので、技術的にはデフォルト引数は実現可能ですが、上記理由から優先順位はRS4の後です。
現状の市場規模で、小細工で誤魔化しだすとキリが無い(というか切実な話、サークルが持たない)ので、
基本に倣って「ミニマムな言語仕様」と「可能な限り早い質疑応答」で対応するのが理想です。

2.について
関数の中で最初に使うと、ローカル変数扱いされます。名前空間が違うのでアクセスできません。
グローバル変数としてmain関数より前に初期化するなり宣言するなりすれば、グローバル変数の名前空間に配置されるため、アクセスできるようになります。

3.について
仕様です。基本的に、「配列を丸ごと○○する」というあらゆる操作が現状不可能です。全ての演算はスカラー値のみしか扱えません。
ベクトルを扱う機能は冬コミあわせで実装します。

51wakaba:2010/05/02(日) 02:07:16
>>50 電プロさん
1. 将来的には対応されるとのことで了解しました。ありがとうございます。

マニュアルに関してはSpsDoc側の準備が出来つつあるので、コメントを付与した.incファイルを頂ければこちらでがっつり加工しますが如何でしょう?
# ほんとはその草案もやるべきなんだけどね。sの人とかいかが?(え

> 現状の市場規模で、小細工で誤魔化しだすとキリが無い(というか切実な話、サークルが持たない)ので、
> 基本に倣って「ミニマムな言語仕様」と「可能な限り早い質疑応答」で対応するのが理想です。
なんですよね・・・他についていけるエンジニアがいないのが・・・

それを踏まえても一応背景は書いておきます。
要望提出の根っこは"今まで出来ていた事が出来なくなる"事が今までのユーザに対しての大きな悪いインパクトになると考えての事です。
こちらの理想とする行動を取れば問題ないという対応は問題なので要望として機能拡張を出しました。

2. 次のコードで動作する事を確認しました。ありがとうございます。
----test.spt
#include "system.inc"
#include "out.inc"

main();

function main () {
hoge[0] = 1;
hoge[1] = 2;
len = 2;
huga(len);
}
----

----out.inc
int hoge[16];
function huga (len) {
for (i = 0;i < len;i++) {
print_string(hoge[i]);
}
}
----

3.了解です。基本、定義したらそのままですね。
となると、一度生成された配列を初期化することも不可能なのでしょうか?

52電プロ:2010/05/02(日) 15:24:13
>>51 wakabaさん
後から配列を初期化することは出来ません。
まだ明確な言語仕様にはなっていませんが、変数を宣言した場合はゼロ(または空文字列)が代入されます。

配列を宣言した場合も要素全てに対してゼロ(または空文字列)が代入されます。

53電プロ:2010/05/02(日) 15:39:39
>マニュアルに関してはSpsDoc側の準備が出来つつあるので、コメントを付与した.incファイルを頂ければこちらでがっつり加工しますが如何でしょう?
その方法でやりましょう。
とりあえず10関数分くらい作ってみるので、その方法で問題ないか確認願います。

※通勤電車の中で書くつもり(ちなみに今年のGWはありませんのでw、明日着手します)

54wakaba:2010/05/02(日) 22:31:58
>>52 電プロさん
なるほど。とすると安全な配列変数の再利用は不可能。ということですね。
配列操作系の拡充を期待したくなりますね。

>>53 電プロさん
了解しました。問題ありません。よろしくお願いします。

> 通勤
(;ω;)ブワッ

新規で一点確認させて下さい。

camfocusで引数が1個のものの場合はどのように移植すればよいのでしょうか?
具体的にはカメラコードがLONG,SHORT以外の場合のものです。

お手数ですが、ご回答のほどよろしくお願いします。

55wakaba:2010/05/03(月) 00:10:02
>>38 電プロさん

少し前に上がっていたwaitframeの件で確認させて下さい。
以下のコードで実行したところ、同じようにエラーとなりました。

現時点ではwaitframeを再現する事は出来ないのでしょうか?
お手数ですがご確認のほど、よろしくお願いします。

----
;//3.5

#include "system.inc"

int FRAME_SEC = 1 / 60.0;

function wait_frame(frame)
{
wait_time(frame * FRAME_SEC);
}

print_string(1);
wait_frame(500);
print_string(2);
----
ログ:
1
system.inc (66行目) : [Error] waitシステム割り込み命令の引数にゼロまたは負の値が指定されています。
ランタイムエラーがあります。RuntimeError.txtを参照してください。
----

56wakaba:2010/05/03(月) 15:31:46
>>55
すみません。自己解決しました。
FRAME_SEC定数がintだったためです。お騒がせしました。
----
;//3.5

#include "system.inc"

float FRAME_SEC = 1 / 60.0; //そりゃintじゃまるまるよ

function wait_frame(frame)
{
wait_time(frame * FRAME_SEC);
}

print_string(1);
wait_frame(500);
print_string(2);
----
これは恥ずかしい・・・

57電プロ:2010/05/03(月) 22:55:47
>>51
リファレンスの素データとして、こんな形式で書けば良いでしょうか?
http://www.rectangle.jp/denpro/SphereScriptRef.txt

今回は無いですが、複雑な関数に関しては、「サンプルコード」が要るかもしれません。
あと関数仕様以前に言語自体の仕様解説も要ると思った…。近いうちに書きます。

ココ1年ずっと通勤電車の中でPCで何か書いてます、台本とか、言語の設計概要とか、リファレンスとか…。年換算で数百時間っていろいろ出来るよねw

58電プロ:2010/05/03(月) 22:58:38
>>56 wakabaさん
「cam_focus」でRS3の移植版をgrepしてください。
Mission02に以下の記述が見つかります。
view_mode("ROUND"); //視点モードを周回撮影に変更、
cam_focus(10,10); //L10の戦車を撮影

59電プロ:2010/05/03(月) 23:38:16
>>54
>とすると安全な配列変数の再利用は不可能。ということですね。
毎回ループで一つずつ初期化すればOKでは?(ダサい事この上ないですが・・・)
もしくは自然に書くならローカル変数にするとか。ローカル変数は宣言が呼ばれるたびにゼロで初期化されます。

60wakaba:2010/05/04(火) 09:15:41
>>57 電プロさん
素データありがとうございます。

そのテキストを元に書くとしたら以下でしょうか。
最初からコードに書いてしまえばそのまま配布するだけで済むので一石二鳥です。
# むしろSpsDoc摘用済みのmission.incなどが配布されればそれでデータの引渡し完了です。

元:
systemcall string string_head(string str, int n);
引数: str 取り出し対象の文字列
n 取り出す文字数
戻値: 文字列strの先頭n文字からなる文字列
説明:文字列の先頭部分を取り出します。元の文字列は一切変更しません。2バイト文字は2文字として扱われます。

SpsDoc形式:
/**
* 文字列の先頭部分を取り出します。元の文字列は一切変更しません。2バイト文字は2文字として扱われます。
*
* @param string str 取り出し対象の文字列
* @param int n 取り出す文字数
* @return string 文字列strの先頭n文字からなる文字列
*
* @caption 文字列の先頭からの一部分を返す
* @since 1.0
* @version 1.0
* @engine RSE3.5
*/
systemcall string string_head(string str, int n);

"説明"が2行目、"引数"は@param、"戻値"は@returnになります。
1点だけ情報追加で必要で、@captionにその関数の簡単な説明を書いていただけると助かります。
それら以外はタダのフォーマットなのでコピペで使えます。

判らないことがありましたらhttp://rs.wakabadou.net/SpsDoc/を参照して頂ければと思います。
現時点でのSpsDocの正式な仕様です。

> 今回は無いですが、複雑な関数に関しては、「サンプルコード」が要るかもしれません。
別途管理でしょうか。
関数コメントには返すデータのデータ構造までは許されても、サンプルコードなどの具体は含まれるべきでないので。
# メンテ保障が出来ない。

> あと関数仕様以前に言語自体の仕様解説も要ると思った…。近いうちに書きます。
こんなのはいかが? => http://rs.wakabadou.net/sps/
この先5年で出る不満を想定して書いているので現状の仕様には沿いませんが、ずれてる部分を直せばそのまま使えるはず。

61wakaba:2010/05/04(火) 09:17:45
>>58 電プロ
grepしました。
基本、第一と第二を同じにすればOKという所でしょうか。

grep結果を元に手繰らないといけないのはきついですね・・・
システムの裏側で持ってる値をベースに振舞うわけだからどうしたものか。

62wakaba:2010/05/04(火) 09:23:27
>>59 電プロ
配列を引数渡しできないので変わりにグローバル変数を引数代わりに使うつもりでした。
再利用時点で前回の長さが不明なので、そもそも全体をクリアする処理を自動化できないのと、
"クリアと見なしている値"が入っているという状態が生まれるため本質的にはクリアされてないという問題があります。

そもそもの使いたい用途が"与えられた配列に含まれる全部の要素をどうにかする"なので、この辺りは自力でhash map作ってiterator提供する他ないのかな。
# 特定のスプライト群を纏めて色変更したりとか。

63wakaba:2010/05/04(火) 09:45:20
>>60
さっくり作ってみた => http://www.rectangle.jp/wakaba/SphereScriptRef.txt

64wakaba:2010/05/04(火) 10:09:59
電プロさん

恐らくグレア由来と思われる不具合が発生しているため報告します。
本件、GWB、selen両氏からの情報提供を元に記述しています。

以下、GWBパート
若葉堂との共同開発時に致命的なトラブル(バグ)を発見しました。
このトラブルはおそらくこれから高精密度モデルの使用を目指しているSpEにとって大きな障害となるでしょう。

具体的な症状は"RSE3.5系にて複雑なモデルが太陽とグレアに向かっているとき処理が落ちること"です。

以下の二つのSSをご覧下さい。
1. http://www.rectangle.jp/wakaba/64/1.png
2. http://www.rectangle.jp/wakaba/64/2.png

1. は3.5系、2. は3.12です。
通常のフライトでは共に"55frame/s:30%"くらいの負荷で進行します。

これが、太陽とグレアに向かって飛ぶと3.5系ではFPSが23-35まで低下し、処理が60-185%まで激増します。
3.12では全く変化がなく、問題はありません。

このトラブルの原因は恐らく、3.5系のグレアの位置、表示判定、あるいは光源処理にあると推測されます。
同様のトラブルを発生させるパターンが他にもあります。例えば雨天と霧環境の真上角度がそうです。
つまりこのトラブルがすべての環境に悪い影響を与えていると推測されます。

出来ましたら修正願います。

若葉追記:
1500頂点程度のオブジェクトでも同様の状態になるとの報告を受けています。

以下、selenパート
上記のGWB氏の報告を受けての調査結果です。

【共通事項】
* 3.51以降の全バージョンで発生する(=プログラマブルシェーダを使用可能な全バージョンで発生する)
* 3.50a以前のバージョンでは発生しない
* シェーダのオン/オフを問わず発生する
* 添付画像左上の黄色い数値がフレームレート。計測はFraps。画像は全てシェーダオン時の物
* 計測環境
o RSE:3.51b
o 起動モード:1600x1200、フルスクリーン
o OS:XP Pro SP3
o CPU:PhenomII X4 940BE@3.2GHz
o Mem:DDR2-1066 2GBx2
o VGA:Radeon HD5850 1GB
o VGA Driver:Catalyst 10.2
o DirectX:Feb 2010

【後方視点プレイ時に特定の機体で太陽へ向かうとフレームレートが落ちる現象】
後方視点プレイ時に、特定の機体で太陽へ向かうとフレームレートが落ちる。HUD視点プレイ時は落ちない。
現在確認されている「特定の機体」は、初期型Y1と後期型Y1。Y1モデルをR-21に差し替えた場合は発生しないので、Y1固有のスクリプト処理が原因ではない。

(EFFY RSE3.2版 st3 Rev:72 初期型Y1)参考画像 => http://www.rectangle.jp/wakaba/64/351b_y1_1stver_and_r21_toward_the_sun.jpg
* フレームレートが落ちる機体
o 初期型Y1 (effy_unit.rsu UNIT_ID 253)
o 後期型Y1 (effy_unit.rsu UNIT_ID 254)
* フレームレートが落ちない機体(検証に使用したのは ToW Concept)
o R-10
o R-21
o R-40
o F-2A
o F-15J
o Su-33

【後方視点プレイ時に特定の機体で特定の角度を向くとフレームレートが落ちる現象】
後方視点プレイ時に、特定の機体で特定の角度を向くとフレームレートが落ちる。HUD視点プレイ時は落ちない。
現在確認されている「特定の機体」は、初期型Y1と後期型Y1。「特定の角度」は環境ID(天候)によって異なる。

検証済み環境ID:00-03, 12-20
未検証の環境ID:04-11(検証済みIDで充分なデータが取れたため省略)
使用パッケージ:EFFY RSE3.2版 st9 Rev:72 後期型Y1(st9.rseの環境IDを書き換えてテストを行った)

* パターン1:角度が正の値で角度計が反転している時のみフレームレートが落ちるID
o 00, 12, 13, 14, 15, 18, 19, 20 参考画像 => http://www.rectangle.jp/wakaba/64/351b_y1_2ndver_env14.jpg
* パターン2:角度が負の値で角度計が反転していない時のみフレームレートが落ちるID
o 16, 17 参考画像 => http://www.rectangle.jp/wakaba/64/351b_y1_2ndver_env16.jpg
* パターン3:特定の向きで特定の角度の範囲内(±45°)に収まった時にフレームレートが落ちるID
o 01, 02, 03(02-03は方位によってフレームレートが落ちる角度が変化する) 参考画像 => http://www.rectangle.jp/wakaba/64/351b_y1_2ndver_env01.jpg
* フレームレートが落ちる機体
o 同上
* フレームレートが落ちない機体(検証に使用したのは ToW Concept)
o 同上

65wakaba:2010/05/05(水) 02:17:06
なんか笑えるくらいさっくりできちゃったので共有

これが => http://www.rectangle.jp/wakaba/spsdoc_sample/mission.inc
こうなる => http://www.rectangle.jp/wakaba/spsdoc_sample/mission.inc.html

これが => http://www.rectangle.jp/wakaba/spsdoc_sample/system.inc
こうなる => http://www.rectangle.jp/wakaba/spsdoc_sample/system.inc.html

これは実際に上記スクリプトファイルをSpsDocで出力した結果となります。

後は電プロさんに上のURLから拾えるincファイルの穴埋めをして頂ければ、マニュアルの作成は終わりですね。

見た目の調整は後ほど。

66電プロ:2010/05/05(水) 18:10:33
>>64 wakabaさん
内容は理解しましたが、スレチなので、
こちらか
http://jbbs.livedoor.jp/bbs/read.cgi/otaku/7445/1157379817/l50
こちらへ
http://jbbs.livedoor.jp/bbs/read.cgi/otaku/7445/1220970233/l50
コピペお願いします。

67wakaba:2010/05/05(水) 18:12:32
>>66 電プロさん
すみません、素で間違えてました。コピペします。

68電プロ:2010/05/05(水) 18:22:08
>>65
一撃でHTML化できるならば、SpsDocに合わせて書いてしまいます。
(HTML化されないと「RSEClipse限定のコンテンツを電プロが書く」ということになってしまうので、いろいろな意味で問題が…)
ところでこれ、2行に分けて書くことって出来ないのでしょうか?説明が長くなった場合ちょっと読みにくいのでは…?
複数行が許されるならば、そこに強引にサンプルも入れてしまえば良いです。

「はじめてのSphereScript」は確かにこれで大丈夫そう。品質的にもほぼ完璧。
http://rs.wakabadou.net/sps/

微妙に「リファレンス」ではないような気がするので、今こちらでは真の意味でのリファレンスを書いています。
例えば、小数の剰余(3.7%0.5)がどうなるか、なんてのは言語設計者でなければ書けないし、初心者に対して説明することでもないので。
似た話では「全ての演算子とその評価順位」とか「文字列と数値の演算の全パターンと挙動」とか。
リファレンスをもとに上記ページを改訂すれば内容的にも正しくなりますね。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板