したらば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)がどうなるか、なんてのは言語設計者でなければ書けないし、初心者に対して説明することでもないので。
似た話では「全ての演算子とその評価順位」とか「文字列と数値の演算の全パターンと挙動」とか。
リファレンスをもとに上記ページを改訂すれば内容的にも正しくなりますね。

69wakaba:2010/05/05(水) 22:20:34
>>68 電プロさん
> 一撃でHTML化できるならば、SpsDocに合わせて書いてしまいます。
よろしくお願いします。
事実上の世界標準フォーマットをそのまま使ってるので、俺がくたばっても何とかなるのが強み。

2行に分ける場合は<br />タグを使ってください。
但し、関数コメントのサンプルの実装はお勧めしません。
メンテナンスが必須になるうえにリンクの追跡が事実上不可能なのでリスクが大きいためです。
出来れば別個のコンテンツとして用意しておいて頂ければと思います。
リンク張る事も出来ますし。

> 全ての演算子とその評価順位
それはこの辺りに追記ですね。ちと分量多すぎたのでスルーしてます。
http://rs.wakabadou.net/sps/#lang-reference.operators

SphereScriptリファレンスはPython, Ruby, Java, C#, PHPのリファレンスサイトを見て作っているので、一通りの記述はあるはずです。

70wakaba:2010/06/15(火) 00:28:12
電プロさん

set_section 第二引数の仕様について確認させてください。

RSE3.5時点でset_sectionの第二引数は、第一引数で指定しているラベルのUNIT_TYPEに関わらず「0」を指定することができます。
RSE側のマニュアルを読む限り、「0」はTOYBOXのみ指定できる引数に見えます。

RSE3.5時点では「0」はUNIT_TYPEを問わずデフォルト動作をするという認識でよろしいでしょうか?

71wakaba:2010/06/19(土) 12:54:58
電プロさん

Project ICKXとして雲の表示オプションについて要望です。

「雲の表示をあり」としている場合でも、スクリプト制御で強制的に「雲の表示をなし」とすることはできないでしょうか?

出来れば.spe、最悪の場合でも.rseにてミッション単位での制御を希望します。
.speで制御したいのは難易度によって表示を切り替えたいため、.rseで制御したいのは最悪の場合、任意のミッションでは非表示にしないとクリア困難なものがあるためです。

以上、ご検討のほどよろしくお願いします。

72電プロ:2010/07/04(日) 20:09:48
>>71 wakabaさん
雲のON/OFFは天候依存なので、とりあえずは天候を快晴のものに変えてください。
RSE3.5のエンジンではスクリプトからの制御は難しいため、RSEファイルによる強制ON/OFFを考えています。

73wakaba:2010/07/06(火) 00:33:01
>>72 電プロさん
返答ありがとうございます。

>>70についてはSC48で伺った通り『「0」はそのユニットのデフォルト動作に戻す』で了解しました。

>>71も了解です。幸い、天候の差し替えが可能なミッションのためスクリプト制御でなんとかします。

74匿名希望:2010/10/03(日) 22:23:04
get_rotで取得できる方位角の値について質問です。

AとBを向かい合わせたくて、get_rot で Aの角度を取得、
 Bの上下角度 = Aの上下角度 + 180°
 Bの方位角度 = Aの方位角度 + 180°
 Bの傾き角度 = Aの傾き角度 + 180°
とやったら、方位だけ意図と逆でした。
(Bの方位角度 = Aの方位角度 とやると向き合いました)

get_rot で取得できる"方位"の値が逆な(180°ずれている)気がしますが、これは意図した動作でしょうか。
(もしくは自分の理解が足りないのか...)

75KEN:2010/10/05(火) 19:44:36
Bの上下角に180度足してるので機体が前転しているからでは?
さらにバンク角も180度足しているため、背面から戻ったのではないでしょうか?

76匿名希望:2010/10/05(火) 22:05:00
>>75
…言われてみればその通りですね。方位だけ180°足せば十分だったのか。
自分の理解が足りていなかったようです。オハズカシイ

77enoch:2010/10/11(月) 03:13:36
質問です。

ver3.5で2次元配列もしくはマップの定義は可能ですか?
仮にver3.5で出来ないとしても、ver4.0では可能ですか?

78enoch:2010/10/11(月) 08:24:04
もうひとつ質問です。

3.5以前は
getstatus L1,PLAYERS_WEAPON
でR0-R03のそれぞれに機体IDや
装備兵装の情報を設定していました。

現状はint型でかつ、get_posのように
与えた変数の戻り値を使う仕様でも
有りません。

3.5以降はどのようにプレーヤ機の機体IDや兵装IDを
取得すればよいですか?

79匿名希望:2010/10/11(月) 10:26:46
>>78
複数戻り値があるものは、引数で与えた変数に値が格納されるようになっているようです。
mission.inc の中身を参照すると、型名が refer になっているのがそれです。(C++の参照型と同じ?)
何番目に何の値が帰ってくるかは mission.inc の変数を見ればなんとなくわかるかと思います。

80Project ICKX:2010/10/11(月) 14:51:37
こちらの掲示板では初めまして。Project ICKXです。
EFFY開発時にgetstatusなどの引数をまとめておいたので共有いたします。

次のエントリから資料にアクセスできます。
http://www.effy.info/special/blog/#b23

プレイヤー機体の兵装IDをベタ書きで実装すると次のイメージでしょうか。
player_pylon_main_unit_id = get_status('STATUS_PLAYERS_PYLON_MAIN', 1); //旧R1
player_pylon_sub_unit_id = get_status('PLAYERS_SUB_WEAPON', 1); //旧R2
player_pylon_center_unit_id = get_status('PLAYERS_CENTERWEAPON', 1); //旧R3

ライブラリをフルに活用すると下の書き方もできます。
player_pylon_main_unit_id = get_player_pylon_main(); //旧R1
player_pylon_sub_unit_id = get_player_pylon_sub(); //旧R2
player_pylon_center_unit_id = get_player_pylon_center(); //旧R3

81enoch:2010/10/11(月) 16:10:39
>>80
情報サンクス
 getstatusでプレーヤ機の情報を取るのは"PLAYERS_PLANE"を
引数に与えればよいのですね。
 RS3の3.5verのソースやマニュアルなど、どこにも書いていない
パラメータなので不明でした。他にも既存ソースやマニュアルに無い
情報があるかもしれないので参考にさせて頂きます。
貴重な情報を有難うございました。
 RSE側に既存でconst.inc(定数定義クラスっぽいの)があると
いいんですけどねー。
 当方で作成中のものは、そのうちwikiあたりに3.5verの
サンプルミッションとしてアップする予定です。

 もうすぐサンクリでエフィーの完成版発売ですね。
御健闘をお祈りいたします。

82Project ICKX:2010/10/11(月) 17:12:15
>>81
お役に立てたようで何よりです。

> RSE側に既存でconst.inc(定数定義クラスっぽいの)があるといいんですけどねー。
無いので「RaidersSphere_const.inc」を作ってみました。
exeそのものから引いている情報もあるので、引数の情報は9割がたカバーできているはずです。

> もうすぐサンクリでエフィーの完成版発売ですね。御健闘をお祈りいたします。
ありがとうございます。
そちらのサンプルも楽しみにお待ちしております。

83KEN:2010/10/17(日) 16:04:43
サンプルミッションを作ったのですが、原因不明のエラーが出ます。
int rader_target = 100;
と値を入れたのに、起動すると「 rader_target は定義されていない関数・・・・・」というメッセージが出ます。
いろいろ試しましたが解決できません。
uploaderにファイルがありますので、どなたかアドバイスをください。

84通りすがり:2010/10/17(日) 16:47:01
>>83
変数の生存期間は、宣言した関数内のみになっています。
別関数に飛んだ場合、同じ名前の変数であっても別物となります。

real_rader_mission.spt を見てみましたが、
rader_set_up関数内で宣言した rader_target は 、
rader_loop関数内では有効でありません。そのためエラーが出ています。

rader_target をグローバル変数にするか、
rader_loop等の関数の引数を使って渡すと解消できるかと思います。

85KEN:2010/10/22(金) 16:38:13
ありがとうございます 謎が解けてすっきりしました。 変数についてぜんぜんわかっていなかったようです・・

86KEN:2010/12/07(火) 20:51:14
get_rotでrxに入る値の範囲はいくらですか?
もし90°以上のピッチ角、例えばrx=120 ry=0 rz=0 ならば、rx=60 ry=180 rz=0 とも表されると思うのですが、実際はどちらがはいるのでしょうか?

87電プロ:2010/12/08(水) 21:55:01
>>86 KENさん

正解はrx=60 ry=180 rz=180。
基本的にはHUDのとおりです。というかHUDは内部的にget_rotを使ってます。
飛んでみると良くわかります。北向きまっすぐに飛んで、120度ピッチアップした状況を想像してください。

rxだけは±90°で、他は±180°。

ピッチ(rx)を上げると天頂(rx>=90°)を回った時点から方位(ry)とロール(rz)が-180°になります。あとはピッチアップするごとに(コックピットが上下反転しているので)rxは減少します。

88ゆめの:2010/12/09(木) 02:36:36
get_rotの戻り値についてですが、

> rxだけは±90°で、他は±180°。

他はプラスマイナス180度とのことですが、テストすると、0〜360度でしたよ?これは想定外動作なんでしょうか。(現状、スクリプトでプラスマイナス180度になるようにする関数を書いて、間にかませて使っています。)

89電プロ:2010/12/09(木) 22:59:47
>>88
>テストすると、0〜360度でしたよ?
すいません。↑これが正しいです。

RSE3を作った当時は「象限とかラジアンとかマイナスの方位は分かりにくいだろう」として今のスクリプト関数の仕様になっています。
方位に関しても時計回り方向にプラスになります。

とはいえ、この仕様はゲームプログラムの常識からするとかなりオカシイのと、凝ったスクリプトを書こうとするといろいろ無理が出てくるので、SpE4では数学的に正しい仕様に変更されます。
※RSEの内部的には全部ラジアンで処理していて、左手座標系の象限と角度は当然ですが一致しています。

90ゆめの:2010/12/09(木) 23:02:13
すみません、手元の環境でのget_rotの動作テストの詳細ですが、
自機についてget_pos(), get_rot()した結果をそのままメッセージ表示する形で行いました。(換算は行っていません)
●使用スクリプト:http://hatsuyume.flop.jp/rsedit/uploda/src/RS_file47.zip
●実行の様子:http://www.youtube.com/watch?v=Al2unoe2IqI
ピッチ角rxは0〜90度と270〜360度、方位角およびロール角は0〜360度となっているように見えます。
当方のテストスクリプト上での関数の使用方法等に問題がある可能性もありますので、仕様と違う動作かどうか、ご確認いただければ幸いです。

91ゆめの:2010/12/09(木) 23:04:39
>>テストすると、0〜360度でしたよ?
>すいません。↑これが正しいです。

ああ、ほぼ同時に書き込みになってしまいました。すいません。
仕様について、了解いたしました。
回答くださりありがとうございます。

92ゆめの:2010/12/09(木) 23:23:06
(恥のかきついでに…)
質問が2つほどあるのですが、ご回答いただければ幸いです。
現行のRSE3.5(最新のRSE.exe)において、
航空機ユニットを別のユニットの子ユニットとすると、子ユニットにした航空機ユニットの座標が毎フレームめちゃくちゃになって正常に動作しないのですが、これはそのような仕様でしょうか。それとも環境依存で当方だけに起きている現象でしょうか…
また、何かの子ユニットとなっているユニット(種別は問わない)に対してget_pos()関数を使用すると、親ユニットに対する相対座標ではなく絶対座標系での座標が得られるようになっているようですが、これはそのような仕様でしょうか。(get_rot()と動作が違うように感じます)

93wakaba:2010/12/12(日) 10:10:22
変数の型宣言について質問です。

11月12日付公開版のspe.exeではobject型、array型ともに引数の型、戻り値の型としては使用できましたが、変数の型として使用できませんでした。

こちら、本来は変数の型としてもobject型、array型は指定できる認識で正しいでしょうか?

RSEclipseの実装に影響を与えるため、ご回答頂ければ幸いです。

94wakaba:2010/12/12(日) 10:16:56
これは多分Bug報告 ;p

11月12日付公開版のspe.exeに同梱されているtest6.sptにて仕様と外れたJSON形式の行があります。
# しかも実行可能

21:vector={x:5, y=9, z=11}; //オブジェクトの定義

こちら、y及びzの後ろが「=」となっています。
JSONの場合、名前の後ろは必ず「:」となるため、コンパイルエラーとするのが正と考えられます。

95電プロ:2010/12/12(日) 21:09:01
>>92 ゆめのさん
get_posではユニットのワールド座標(絶対座標)を取得します。

航空機が何かに「くっついて飛ぶ」のは矛盾しているので、航空機を子ユニットにすると正しく動作しなくなります。
スクリプトでどのように書いても、内部制御でワールド座標変換を行っていますので、必ず座標が飛んでしまいます。

おそらく「子ユニットのHUD表示を航空機にしたい」のだと推測されますが、RSE3.5ではそのような動作は出来ません。SpE4で実装予定です。

96電プロ:2010/12/12(日) 21:15:35
>>93-94 wakabaさん
変数の型にobjetを指定すると「中身が空っぽ」になってしまうので、現状では
array arr; // 配列型変数arrを定義
というような書き方は出来ません。かならず中身の定義とセットにする必要があります。
arr=[100,1,1]; // 配列型変数arrを初期化して生成
これでは統一性に欠けるため、いずれは空っぽのオブジェクトの型定義もできるようにします。

JSON式のイコールについては意図的に解釈できるようにしています。
SphereScriptの構文解析のルールに合わせているためです。
JSON式の完全準拠ではありません。

97シャーデンフロイデ:2011/01/01(土) 16:55:22
こんにちは
SphereEngine4に関して質問です。
 現状はミサイルの発射音や、FLACKGUNやチェーンガンの兵装ごとの
効果音は一種類だけしか出力できませんが、SE4では各武器ごとに効果
音を変えることは可能ですか?ユニットIDの違う、チェーンガンの
兵装が違う音を出すといった感じで。
 また、自機以外は機銃とミサイルは1つづつの選択となりますが、プレーヤ側のように複数の兵装を持たせ、距離やロックタイプに応じた
挙動(対空兵装は対空のみ、対地兵装は対地へのみ使用など)は
可能ですか?

98電プロ:2011/01/04(火) 11:10:03
>>97 シャーデンフロイデさん
細かい仕様の部分はまだ決まっていません。
爆装した敵機はきちんと爆撃するようにはしたいと思っていますが、
発射音については発想自体が無かったですね。
面白そうなので出来るように考えておきます。
ただ、何でもかんでも出来ることを増やすとサウンドカードの負荷が超えて音飛びしたりしそうなのが怖いところですが。

Win7のおかげでオンボードグラフィックの性能向上が目覚しいですが、
サウンド性能はここ10年変わっていないような気がするのです。

100JoJo:2011/05/01(日) 23:53:09
お世話になります。
3.5の新関数fog_color(int near, int far, int r, int g, int b)についての質問です。
前半2つの引数int near, int farのデフォルト値(または用法用量)を教えて下さい。
数値に関わらず分割されたマップの輪郭線がはっきり見えてしまう問題(下記SS)に遭遇しています。
http://twitpic.com/4ryijj
宜しくお願いします。

101電プロ:2011/05/02(月) 00:02:44
>>100 JoJoさん
以下を参照してください。
マップ輪郭線の問題は、near/farではなく色(r,g,b)の問題です。

/*----------------------
fog_color(int near, int far, int r, int g, int b);

<引数>
near:フォグの開始距離(晴天時はゼロ)
far:フォグの終了距離(晴天時は1000)
(r,g,b):フォグ色(空の色と合わせる事。0,0,0だと黒になり、255,255,255だと白になる。)

※rに負の値を入力すると、フォグカラーは「現在値」になるので、距離だけ変えたい場合は、
fog_color(near, far, -1, -1, -1);
と記述すると良い。
----------------------*/

102JoJo:2011/05/02(月) 00:49:52
>>101
有難うございます。デフォルト値と用法については了解しました。
では例えば、戦場の照明色を緑にしたい場合には緑の空を用意する必要があり、かつ今のところ差し替え不可能ということですか?

103濡烏:2011/05/11(水) 12:14:44
SphereEngine4についての質問です
1.SpE4では自機の地上歩行や停止などは実現可能になるのでしょうか?
2.ゲーム中でユニットのパラメータやテクスチャを変更することは可能になるでしょうか?
また、その変更を保存できるでしょうか?

104電プロ:2011/05/11(水) 23:27:30
>>102 JoJoさん
空テクスチャはエンジンに組み込まれているので変えられません。
地中トンネルのような閉鎖空間ならば空が見えないのでごまかしが効きますが、上空では無理ですね。

>>103 濡烏さん
回答します。
>1.SpE4では自機の地上歩行や停止などは実現可能になるのでしょうか?
SpE4では「動かない自機」も用意するので、スクリプト側で動作を作れば好きな乗り物になります。各種行列計算や当たり判定計算も用意するので、車両も作れます。
カメラとの位置関係も変えられるので、車を人に変えれば、何の変哲もない兵隊FPSを作ることも出来ます。

2.ゲーム中でユニットのパラメータやテクスチャを変更することは可能になるでしょうか?
出来るようになります。定義データを変更してから再読み込みするとか、別のユニットに変更するとか、いくらでも。
結果を保存するのも、そのようにスクリプトを組めば作れます。

105濡烏:2011/05/12(木) 13:35:31
>>104
返信ありがとうございます
さらに追加で質問なのですが、
1.車両やモビルスーツみたいなのを自機側のみならず
敵ユニットにも同じような動作をするようにできますか?
2.四肢のあるユニットを作成したとして、ゲーム中で四肢を動かすことはできますか?
(モビルスーツがガシャガシャと歩行するモーションなどが実現可能かどうか)

要はモビルスーツ同士の戦闘を作ってみたいんですが・・・

106電プロ:2011/05/12(木) 20:36:42
>>105 濡烏さん
敵の動きもスクリプトで組めば、そのとおりに動きますし、
アニメーションを使えるので、スクリプトと統合して歩かせることも容易です。
ただこの「容易」はプログラマにとっての話であって、そうでない場合かなりの茨の道になるかと思います。

「簡単に俺得ロボットアクションが作りたい」というイメージでの質問であれば「できません」という回答です。

まぁ、「飛行機しか飛ばせない」はずのRSE3.5で戦車造った人がいるくらいですから、1年くらい待ってれば誰かがロボットアクションのスクリプトを作って公開してそうな気はしますw

107アルマロス:2011/05/15(日) 03:28:32
>>106
ロボットアクションについて質問させてください。

1.オブジェクトとの接触について
 現状ではビルや地面に接触すると、当たった角度に
よってダメージを受け弾き飛ばされます。
オブジェクトとの接触時にダメージを受けたり弾かれる
ことが無いようにできますか?

2.地面に立たせた際の挙動について
 橋などのステージ既存オブジェクトや、後から追加したオブジェクト
の上に乗るという挙動は可能ですか?
現状はスクリプト側で高度0まで下方向に移動させるように
すれば地面に立っているようにはできます。しかし、それだと
高度0より高い位置にあるオブジェクトの上に乗ろうとすると
貫通して高度0まで落下してしまいます。

3.被弾時の挙動
 例えばFLAKの弾を受けると機体が左右に傾きますが、
ロボットアクションの場合、常に機体は水平である
必要が有ります。被弾時に機体が左右に傾かない
ようにすることは可能ですか?

108電プロ:2011/05/15(日) 17:54:25
なんかロボットアクションに反応する人多いなw

>>107 アルマロスさん
今のところの構想では、「何もしない」自機を用意しておき、スクリプトで全て、移動・アタリ判定計算・移動制限などを実装する仕組みになります。

飛行機として持っている挙動だけでなく、重力や当たり判定なども全て無効化しますので、全てプログラマが実装してください。
エンジン側は何もしないので、逆に言えばプログラマの好きに作れます。
ロボットとなるとちょっと大変ですが、戦車くらいならば(本職のプログラマならば)1日で実装できそうです。もちろんが壁あたればダメージを受けずに停止するように作れます。

一応、自動車の走行や航空機の離着陸などを想定して、走行可の建物とそうでない建物、というような使い方の出来るフラグは用意するつもりです。
それと、今回はユニットに「重さ」というパラメータが加わるので、自機を重くして、弾を軽くすればダメージだけ受けて自機は動かなくなります。

109FROST:2011/06/10(金) 01:27:47
SpEで行列の計算をするにはどうすればいいのでしょうか。

110FROST:2011/06/10(金) 15:54:13
言葉足らずでした。
行列を扱える型があるのかどうか知りたいのです。また、もしあるなら、そのような型で定義した型同士を足したり掛けたりすると、行列の計算になりますか?

111電プロ:2011/06/11(土) 11:05:27
>>110 FROSTさん
SphereScriptはオブジェクト(C言語でいうと構造体と配列、代数学で言うと行列)が型として使え、線形計算も行われるため、行列の加減算はそのまま書けます。

オブジェクト(行列)の掛け算および割り算は、代数学的な拡張が多すぎるので、サポートしていません。必要に応じて関数を自作して、内部で要素ごとの計算により逆行列・内積・外積などを実現してください。

DirectXのDXライブラリで言う、D3DXVECTOR3及びD3DXMATRIX型に相当する標準の行列及び各種計算関数はSpE4で提供される予定です。


行列という単語が出てくるということは、恐らくアフィン変換をやろうとしているのだと思いますが、SpE4ではあんまり『行列』って意識をしないでも必要十分な座標計算ができるようなライブラリを用意します。
例えば、
・ユニットから見た、ある絶対空間ベクトルの相対空間ベクトルを得る関数
・ユニットから見た、ある相対空間ベクトルの絶対空間ベクトルを得る関数(↑の逆関数)
・自機の上下、前後、左右に相当する絶対空間上の単位ベクトルを得る関数
・オイラー角表現からその方向の単位ベクトルを得る関数
・単位ベクトル表現からその方向のオイラー角を得る関数
などなど。

112FROST:2011/06/11(土) 12:12:18
 なるほど、加減算はできても掛け算はできないんですか。回転行列を何回か使うので行列の掛け算ができたら楽だったんですが… 行列の掛け算は無理やり何とかしようと思います。
 自機の上下、前後、左右に相当する絶対空間上の単位ベクトルを得る関数は是非欲しいですね。

113アルマロス:2011/07/06(水) 23:53:08
こんばんは

get_pad_nowに関してです。
 現状は加減速やヨーの入力に対応していませんが、
次期では対応するものと考えて良いですか?
 また、PSのアナログパッドのR3スティック
(右側のアナログ方向キー)の入力を読み取る
ことは可能ですか?
視点切り替えなどに使えるものなら使ってみたいです。

114電プロ:2011/07/09(土) 09:41:24
>113 アルマロスさん
加減速やヨーは「軸」なので、get_pad_analogで取得できます。

get_pad_analog("PAD_ROLL");
get_pad_analog("PAD_PITCH");
get_pad_analog("PAD_THROTTLE");
get_pad_analog("PAD_YAW");

115アルマロス:2011/07/18(月) 08:47:40
<<114 電プロさん

上記114の加速やヨーの読み取りに関してです。

リファレンスが無いので使い方の確認です。
get_pad_analog("PAD_THROTTLE")>0;//加速ボタン押下
こうですか?分かりません。

また、ストール中など加減速やヨーが自由に出来ない
状態でもパッドを押下した事自体は読み取られますか?


次期verについて質問です。
1.ロックオンが発生する範囲
 ロックオンカーソルが発生する範囲が
知りたいです。ミサイルの射程に敵がいる場合、
画面の中心からみてどの位置にいる敵にロック
が発生しますか?
 また、ロックオンが発生する上下左右の範囲を
任意で設定はできますか?


2.兵装の装填数
 任意の数値を設定することは可能ですか?
機体の搭載量と兵装のリロード時間とパイロン
で割り出されているようですが、任意の装填数
を設定したいです?
 機体や兵装の設定を変えた際、出撃しないと装填
数が分からないのでバランスをとるのが非常に
手間がかかります。

116ジオペリア:2011/07/20(水) 23:54:17
こんばんは、早速質問があるのですが、今更こんな事いうのもアレですがSphereEngine4のエディターで旧スクリプト(RS2ndで使ってたやつ)は使えるのですか?

117電プロ:2011/07/21(木) 21:54:27
アルマロスさん

>get_pad_analog("PAD_THROTTLE")>0;//加速ボタン押下
>こうですか?
そのとおりです。

失速中でも、スロットル値は入力どおりに読み取れたはずです。

>1.ロックオンが発生する範囲
このアイディアはなかったのですが、変えられると面白そうなので、一応変えられるようにするつもりです。
敵の対空砲や地対空ミサイルなどは既に射撃範囲をパラメータ化できているので、それに順ずる形で航空機のロックオン範囲も設定できるようにします。

>2.兵装の装填数
RS2nd/RS3rdと、この仕様のおかげでゲームバランス調整が容易になっているという実績が有るので、
リロード時間で自動計算させるという基本仕様は今回も変えません。

ただしこれも例によって、スクリプト側で変えられるようにはなっているので、
自分で作るなり、誰かに頼むなり、もしくは電プロに頼むなりして、
任意の武装数に設定できる仕様を作ればそのとおりになります。
例えば『原作と同じバランス(キャラ設定や見た目など?)にしたい』という意味でのバランス調整であれば、
搭載量を即値指定するほうがやりやすいのは確かなので。


ジオペリアさん
旧スクリプトは使えません。
ちなみに、現状の新スクリプトについてもライブラリが完全に入れ替わるので
RSE3.5のゲームをSpE4に持ってくるには、かなり本格的な「移植作業」が必要となります。

118<削除>:<削除>
<削除>


新着レスの表示


名前: E-mail(省略可)

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

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

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

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