SYSTEM4をやっていて感じたこと、
不便に思ったこと、なかなか気づかなかったミスなど
みんなでいろいろメモするところ。
メモの増やし方は左上の「編集」をクリックして、
sys3.9でいうならラベルを増やすように、
編集ページの一番下に*名前(ここでは蓄積メモXXXXX)というような感じで
書いていって追加していく。
([#XXXXXXXX]というのは自動で追加されるので作成時はつけなくてもいい)
シナリオ関数とセーブ:蓄積メモ00032
#シナリオ1
#シナリオ2
#シナリオ3
#シナリオ4
というシナリオ関数があるとする。
シナリオ1→2→3とジャンプして、シナリオ3の関数の中でセーブすると
シナリオ1、2、3を書き換えられなくなる(書き換えるとロードできなくなる)ことがある。
(書き換えても問題なくロードできることもあるみたいだが、理由はわからない)
セーブ処理する関数は簡潔に
void セーブ(void)
{
int nResult; if (SACT_RESUME_SAVE("sample_save_data", "save01.asd", nResult)) { // セーブ後 if (nResult == 1) { セーブ成功(); } else { セーブ失敗(); } } else { // ロード後 ロード後の処理(); }
}
void セーブ成功() {
system.MsgBox("セーブ成功");
}
void セーブ失敗() {
system.MsgBox("セーブ失敗");
}
void ロード後の処理() {
system.MsgBox("ロードしました");
SP_DEL_ALL(); 初期化(); 画面更新(); MES_MARK_START(); MSG_DRAW_LAST();
}
このように、SACT_RESUME_SAVEがあるブロック(親ブロック含む)は簡潔にして
分割した関数の方を書き換えると便利だと思う。
ルビの振り方
バーティカルバー「|」(SHIFT + ¥)で
「|ルビを振りたい部分|ルビ|」のように囲む。
例:
'まあ|適当|てきとう|に|想像|そうぞう|してくれ。'A;
バックログ関係
既出かわかりませんがバックログ関係でメモ
メッセージログがまったく残っていない状態でバックログ画面を表示させるとエラーが起こる
scenario_func.jaf の BACK_LOG_OPEN関数に
MES_LOG_ADD_STRING(" ",true);
と追記することでとりあえず回避。
他にもなんかいい方法がありそうだけど。
配列について
- 1.
Realloc
Copy Fill
PushBack PopBack
Insert Sort
以上は全部1次元専用。
Alloc
Free
Numof
Empty
については他の次元数でも可能。
(まあ個別に次元数を指定するなら、同じような機能の関数はできるけど……)
- 2.
配列同士は=で代入することができない。
例:
void game_main(void){ int nX = 10; int nY = nX; //可能 array@int anX[10]; array@int anY[10];
anX[0] = 10; anY[0] = anX[0]; //可能 anY = anX; //コンパイルエラー }
- 3.
大きい要素のグローバル配列は宣言時に領域確保をさせると起動に時間がかかる。
最初に要素を与えず、game.mainなどの関数内でAllocを使って確保するようにすると、
待ち時間中のCG表示などもできるので良い。
- 4.
配列に構造体オブジェクトを入れることができるが、
構造体内にその構造体名の配列(その構造体オブジェクトを入れる配列)を入れると
コンパイルエラーになる。
- 5.
Copyの説明は、
int Copy(int n転送先インデックス, ref array a, int n転送元インデックス, int n個数)
というものだが、この ref array a は便宜上つけているだけで、
型や次元数を無視して参照をとれるものではない。
- 6.
次元数は定数値(const int)での指定。
intによる宣言の切り替えはできない。
const int nA = 1;
void game_main(void){ array@int@nA anA;//可能 int nX = 1; array@int@nX anX;//コンパイルエラー }
領域の確保は、配列変数の宣言時に指定する場合は定数値だが、
Allocで確保する場合は変数でも可能になる。つまり関数の引数で
指定し確保することもできる。
- 7.
一次元以降の配列は、どこかの次元が0(empty)のまま
二度Allocをかけると(おそらく)その領域は確保されない。
例:
array@int@2 an0; an0.Alloc(10,0); an0.Alloc(20,100);//20は反映されるが、100は反映されない。 an0[1][1] = 3;//範囲外で実行時にエラーがでる。
そのため、どんな配列でも、なるべく1要素ぐらいは
最初に取っていた方が良いだろう。
00027
これも当たり前のことですが、CG描画には時間がかかります。
何も文字を表示せずに100回数値を足すのと、足した数値の結果を描画しながら
100回数値をたしていくのでは、表示しない方が早いです。
EX.1
INT K,J; FOR(; K== 100; ++K){J+= K;}
EX.2
INT K,J; FOR(; K== 100; ++K){J+= K; N(J);MES_CLS;}
00026
CG加工のαマップコピーは、リンク段階でSP指定していないCG(背景とか)には
しないこと。CGが真っ黒になっちゃいます。
00025
プログラムを正確に書くには楽をすること。
省略が可能ならする。コピペできるならコピペする。
というわけで、関数=サブルーチンのメリットとデメリット(why?system3.xからの引用)
・ソースファイルが読みやすくなり、動作の把握が容易になる
・一度定義すれば何度でも使うことができる。またサブルーチンは別のソースファイルで
定義された物でもそのまま呼び出して使うことができる
続いてデメリットです。
・同じ処理をサブルーチンを使った場合と使わない場合では、サブルーチンを使ったほうが若干処理が重くなる
・処理を前もって定義する為,サブルーチンにエラーがあった場合予期せぬところでバグが出る
蓄積メモ00001
sys4以外のスクリプトの中には文を直接書くものがある。
例:
SYS4の場合
' はにほー'R;
' おいらはハニワ。'A;
その他のスクリプトの場合
はにほー
おいらはハニワ。@[RP]
こういうスクリプトからSYS4に移行した場合、
若干面倒に感じる時もあるかもしれない。特に半角全角の切り替えが鬱陶しい。
マクロを使うという手もあるが、エディタによっては次のような方法もある。
Z はにほー X
Z おいらはハニワ。 A
このように記述し、後でZを'に、Xを'R;に、Aを'A;にすべて置換する。
もちろん文章中に全角アルファベットを使う場合は注意。
蓄積メモ00002
最大値 2,147,483,647 を十六進数記述に直すと、 0x80000000
(21億 4748万 3647。約2ギガ)
グローバルなconst intで定数として指定しておくと、役に立ったり立たなかったり
この数字はN、NHでは表示されない。
蓄積メモ00003
コンパイルエラーが出た場合、ほかのエラーに付随して
関数定義ブロックの最後に【}】がありません
というメッセージが出ることがあるが、あまり気にする必要はない。
また、
if(n == 500){'aaaa'A;}
と書きたいところを、
if(n = 500){'aaaa'A;}
と間違って記述しても、コンパイルエラーに引っかからないので注意。
蓄積メモ00004
CG_COPY_STRETCHなどで、スプライト(以下SP)サイズより
サイズの大きいCGをSPに入れた場合、その余剰分は削られてしまう。
これは例えば100×200の画像をど同サイズのSP内で回転させた時も同じで、
真横に90度回転、つまり200×100にした場合、
Xが100削られることになる。
蓄積メモ00005
利用規約みっつ。
System4.0開発キット使用規約
蓄積メモ00005_1
ポポリタン拡張用BGM素材集の使用規約
蓄積メモ00005_2
ポポリタン拡張用CG素材集の使用規約
蓄積メモ00010
コンパイルエラーのメッセージ
関数定義ブロックの最後に【}】がありません
は、普通【}】がついてない場合のミスとしては出てこない。
もしその関数に次の関数があり、【}】がついてないなら、
ローカルオブジェクト宣言中に【;,】以外の無効な区切り番号【(】が現れました
【void】は型として有効ではありません
このどちらかが、エラーメッセージとして表示される。
その関数に次の関数がなく、最後であった場合は、
ファイルの終端に到達しました
となる。
蓄積メモ00011
最初のうちに引っかかりやすい間違い。
引数が書かれてある行に対し、
【=】は構造体オブジェクト名としては無効です。
【,】は構造体オブジェクト名としては無効です。
などと表示されるのは、引数の型が書かれていないミス。
また、
関数定義の第○引数の後に【,】もしくは【)】がありません
と表示されるのは、
【,】と【.】を書き間違えてしまってたりする場合もある。
例:
void 君の心に印はあるか(int 超. 電, 子 = "バイ男マン"){} //誤
void 君の心に印はあるか(int 超,int 電,string 子 = "バイ男マン"){} //正
蓄積メモ00013
return文の最後に【;】がついていません
という停止メッセージがでているが、その行に特に異常がない場合、
その関数の型がvoidになっているかもしれない。
また、
式文の最後に【;】がありません
という停止メッセージがでているのが、関数名のある行の場合、
関数の型を記述してない可能性がある。
正:
int かんすう(void){return 0;}
void かんすう(void){return;}
誤:
かんすう(void){return;}
int かんすう(void){return;}
void かんすう(void){return 0;}
蓄積メモ00019
CG圧縮の際に24ビットでない画像があってもQNTに圧縮され、エラーはでない。
だが画像は表示されなかったり、三つ並んだりする変な表示になる。
同様に、マスク用のCGがおかしい時も画像が表示されなかったりする。
蓄積メモ00020
マニュアルにないのは他にもあったりする。
void MOVE_SET(int nSP, int nX, int nY, int nSpeed = 1000)//nSpeed:標準1000
void MOVE_RESET()
void MOVE()
SACT\eteの中。
蓄積メモ00021
※トップは10分前後で急遽作ってみました。
気分を害したらごめんなさい。
おまけ。
マウスが(nXからnXsize)にいるとき、Y座標を分割して、
マウスのY座標が何番目にあるかを返す関数です。
引数
nX 開始X
nY 開始Y
nXsize 終点のX
nYsize 分割のサイズ。
int MOUSE_GET_POS_Y(int nX = 0,int nY = 0,int nXsize = 0,int nYsize = 0) { if(nXsize <= 0) {nXsize = SACT.GetScreenWidth();} if(nYsize <= 0) {nYsize = 1;}
int LocalObj_mX,LocalObj_mY; MOUSE_GET_POS(LocalObj_mX,LocalObj_mY);
if(nX < LocalObj_mX && LocalObj_mX < nXsize && LocalObj_mY > nY + nYsize) {return (LocalObj_mY-nY)/nYsize;} return 0; }
もう一つ。一見即解。CG位置を中央の位置で指定。
void SP_SET_POS_CEN(int nSP,int nX,int nY) { int nWidth,nHeight; SP_GET_SIZE(nSP,nWidth,nHeight); SP_SET_POS(nSP,nX-(nWidth/2),nY-(nHeight/2) ); }
蓄積メモ00022
大抵の数字にマイナスが使えます(CG座標やZ値にも)が、
画像サイズ設定はもちろん、SP番号と、配列の要素数にも使えません。
SP番号に使えないのは、-1がMAINSURFACEの戻り値なせいかもしれません。
また、本来intで打つところに、floatを置いても小数点切り捨ての
intとして処理され、問題はでません。
23
テキスト送り速度は変更できるようにするか、いっそのこと、
0(ノーウェイト)にしてしまった方が良い。あんまり遅いと超空間と呼ばれかねない。
24
System4.0の最終バージョンは141?
それより上があればupキボンヌ