Tonyu Tips
(この項目は半永久的に未完成です。補正、Tipの追加等をお願いします。)
LastUpdate:H18.3.6
LastUpdate:H18.3.6
目次
- Tonyu Tips
- 目次
- ○Tonyuの処理速度について
- ○異なる型の演算
- ○NULL値の扱い
- ○値の型を調べる方法
- ○使用可能な値とその範囲
- ○変数・関数に使える文字
- ○使用可能なフォント(H18.3.6修正)
- ○使用可能なフォント表示例&応用文字
- ○変数の初期値
- ○返す値
- ○1クラスの最大サイズ
- ○真スタック領域の大きさ
- ○画像の大きさ取得
- ○クラス名の取得
- ○クラスの判別(t is ○)
- ○文字列をグローバル変数に変換
- ○基本オブジェクトの引数(appearするときの参考に)
- ○ローカル変数とオブジェクト変数使い分け
- ○関数で引数の初期値を設定する方法
- ○関数の戻り値で2つ以上の値を得る方法
- ○共用関数の作成方法
- ○Panelの意味、使用法
- ○Panelの有効利用法
- ○オブジェクトの表示位置を画面上に固定
- ○変数、ポインタについて
- ○クラスを作成せずにオブジェクト作成する
- 目次
○Tonyuの処理速度について
○異なる型の演算
異なる型で算術演算を行った場合、以下の様な演算結果になる。
また、型の変換も行われる。
また、型の変換も行われる。
ex. 1+0.1 == 1.1(浮動小数点型) 1+"str" == "1str"(文字列型) 1.1+"str" == "1.1str"(文字列型)
○NULL値の扱い
○値の型を調べる方法
整数型 : isInt(v)
浮動小数点型 : isFroat(v)
文字列型 : クラス"String"か否か
浮動小数点型 : isFroat(v)
文字列型 : クラス"String"か否か
ex.値の型を判別する関数 function AnyType(v1){ var type; if(v1 is String) type="文字列"; else if(isFloat(v1)) type="浮動小数点数"; else if(isInt(v1)) type="整数"; else type=-1; return type; }
○使用可能な値とその範囲
整数 : 10桁(大体) 浮動小数点数 : 38桁(10の-38乗~10の38乗)(大体) 文字列 : 半角10万字以上(これ以降は未確認)
○変数・関数に使える文字
a-z 0-9(但し、2文字目以降) _ (アンダーバー) 全角文字全て
○使用可能なフォント(H18.3.6修正)
以下、使用可能なフォントの一覧。
"ごとコピペして使用すべし。
(訂正:インストール済みのフォントなら全て使用可能
但し、あまり特殊なフォントはプレイヤー側にない場合があるので
以下に示すフォントを使用するのが無難)
"ごとコピペして使用すべし。
(訂正:インストール済みのフォントなら全て使用可能
但し、あまり特殊なフォントはプレイヤー側にない場合があるので
以下に示すフォントを使用するのが無難)
"MS 明朝" "MS P明朝" "MS ゴシック" "MS Pゴシック" "HGゴシックE" "HGPゴシックE" "HGSゴシックE" "HGゴシックM" "HGPゴシックM" "HGSゴシックM" "HG行書体" "HGP行書体" "HGS行書体" "HG丸ゴシックM-PRO" "HG創英角ゴシックUB" "HGP創英角ゴシックUB" "HGS創英角ゴシックUB" "HG創英角ポップ体" (注、参照) "HGP創英角ポップ体"(注、参照) "HGS創英角ポップ体"(注、参照) "HG正楷書体-PRO"
注)Tonyuでは、プログラム中に半角カタカナがあると、エラーが起こる場合がある。
この為、 "HG創英角ポップ体"(+その下の2種)はそのまま入力しても、エラーとなる。
これを回避するため、以下の様にする。
この為、 "HG創英角ポップ体"(+その下の2種)はそのまま入力しても、エラーとなる。
これを回避するため、以下の様にする。
texTmp="AポップA"; //この形ならエラーにならない strPop=texTmp.substring(1,6); //"ポップ"だけ取り出す setFont("HG創英角"+strPop+"体"); //フォントの設定
"HGP創英角ポップ体","HGS創英角ポップ体"についても同様。
尚、指定したフォントが存在しない場合、"MS Pゴシック"が使用される模様。
○使用可能なフォント表示例&応用文字
各フォントの文字表示例を示す。
書式は
書式は
フォント名: 文字サイズ8 文字サイズ10 文字サイズ15 文字サイズ20
途中で、文字が切れているのは仕様。
【枠付文字を書く関数】 //引数(順に)-x座標,y座標,テキスト,文字色,枠色,文字サイズ //ws-枠の太さ function sub_DT2(px,py,tex,cl1,cl2,ts){ var _x,_y,ws; ws=1; for(_x=-ws;_x<=ws;_x++)for(_y=-ws;_y<=ws;_y++){ if(_x==0&&_y==0)0; else $panel.drawText(px+_x,py+_y,tex,cl2,ts); }$panel.drawText(px,py,tex,cl1,ts); }
【影付文字を書く関数】 //引数(順に)-x座標,y座標,テキスト,文字色,枠色,文字サイズ //ws-影の長さ function sub_DT3(px,py,tex,cl1,cl2,ts){ var _x,_y,i,ws; ws=2; for(i=0;i<=ws;i++){ for(_x=-1;_x<=1;_x++)for(_y=-1;_y<=1;_y++){ if(_x==0&&_y==0)0; else $panel.drawText(px+_x+i,py+_y+i,tex,cl2,ts); } }$panel.drawText(px,py,tex,cl1,ts); }
”$panel.”は、適宜変更、省略すべし。
注)枠付文字・影付文字共に、通常文字に比べ描画に要する処理量が大きい
具体的には、
枠付文字-( (ws*2+1)*(ws*2+1) )倍、 (ws=2なら25倍)
影付文字-(ws*9)倍、 (ws=2なら18倍)
具体的には、
枠付文字-( (ws*2+1)*(ws*2+1) )倍、 (ws=2なら25倍)
影付文字-(ws*9)倍、 (ws=2なら18倍)
○変数の初期値
変数 : null 配列 : null ハッシュテーブル : null
○返す値
代入式 : 式の右辺 算術演算式 : 演算結果 比較演算式 : 0 or 1 論理演算式 : 0 or 1 関数 : returnで値を返した場合、その値 返していない場合、その関数のオブジェクト
○1クラスの最大サイズ
32KB
これを超える場合は、複数のクラスに分割して書く必要がある。
○真スタック領域の大きさ
110
―スタック領域とは?
. 関数呼び出しの際に使用される、変数を格納する領域。
. これを使い切ると、エラー"スタックオーバーフロー"が発生する。
. 関数呼び出しの際に使用される、変数を格納する領域。
. これを使い切ると、エラー"スタックオーバーフロー"が発生する。
関数を呼ぶたびに引数の数+ローカル変数の数+5消費
関数を抜けるとその関数を呼ぶときに消費した分回復
引数の数は、定義した関数の引数の数では無く、関数の呼び出し時に渡した引数の数である
関数を抜けるとその関数を呼ぶときに消費した分回復
引数の数は、定義した関数の引数の数では無く、関数の呼び出し時に渡した引数の数である
function A(a,b,c,d,e,f,g,h,i) {if(a)return A(a-1,b,c,d,e,f,g,h,i)+14;else return 6;} ↑A(7)なら6+14*7=104で大丈夫 A(8)だと6+14*8=118でエラー発生
やたら深度の深い関数呼び出し、引数・ローカル変数の多い関数は危険。
アクション系はともかく、RPGをテキトーに作ってるとよく引っかかる。
アクション系はともかく、RPGをテキトーに作ってるとよく引っかかる。
スタック領域のサイズが小さい為、再起を利用したプログラムは通常の方法では不可能。
自作のスタックを使用する、新しく生成したオブジェクトで再起の処理を行う等の必要がある。
自作のスタックを使用する、新しく生成したオブジェクトで再起の処理を行う等の必要がある。
スタック領域を設定する関数が欲しい 。
(07年9月18日追記:現在のバージョンではスタック領域を設定する関数が実装済み)
(07年9月18日追記:現在のバージョンではスタック領域を設定する関数が実装済み)
○画像の大きさ取得
横幅 : getPatWidth(p) 縦幅 : getPatHeight(p)
(p:画像ファイル名)
○クラス名の取得
obj.getClassName()
if (t is ○) は if (t.getClassName()=="○") と等価
if (t is ○) は if (t.getClassName()=="○") と等価
ex. 自分と同じクラスを探す for(t in $Chars){ if(t.getClassName()==getClassName()) print("一致:"+t.getClassName()); }
○クラスの判別(t is ○)
○に入り得るもの、
-自分が作成したクラス
-その他、標準クラス
SpriteChar,DxChar,TextChar,,,
,Array,Matrix,Hashtable,
,Object,PlainChar,String,
etc....(と言うか、クラス全部.)
親クラスを指定すると、その子クラスも指定したことになる。
-自分が作成したクラス
-その他、標準クラス
SpriteChar,DxChar,TextChar,,,
,Array,Matrix,Hashtable,
,Object,PlainChar,String,
etc....(と言うか、クラス全部.)
親クラスを指定すると、その子クラスも指定したことになる。
ex.インスタンスの判別 a=new Array(); print("配列:"+(a is Array)); text="str"; print("文字列:"+(text is String)); obj=new SpriteChar(); print("スプライト:"+(obj is SpriteChar)); print("PlainChar:"+(obj is PlainChar)); //すべて"真"である.
○文字列をグローバル変数に変換
ex.変数var2にグローバル変数var1を代入する。 var2=getGlobal("$var1");
○基本オブジェクトの引数(appearするときの参考に)
new SpriteChar(x,y,p,f) new DxChar(x,y,p,f,scale,angle,alpha) new TextChar(x,y,text,color,size) new PanelChar(x,y,width,height) new SecretChar() (引数無し)
○ローカル変数とオブジェクト変数使い分け
オブジェクト変数にはthisを付け、
ローカル変数には付けない事で使い分けが可能。
ローカル変数には付けない事で使い分けが可能。
ex. var1; //オブジェクト変数 function FUNC(){ var var1; //ローカル変数 var1=5; //ローカル変数に5を代入 this.var1=10; //オブジェクト変数に10を代入 }
○関数で引数の初期値を設定する方法
指定されなかった引数には、Nullが入っている。
初期値を指定するには、値がNullのときに値を入れればいいのだが、
値を指定していない引数には、値を代入することができない。
そこで、ローカル変数を一つ使用し、
その変数に、引数がNullのときは特定の値を入れ、
そうでないときは引数を入れるようにすればよい。
初期値を指定するには、値がNullのときに値を入れればいいのだが、
値を指定していない引数には、値を代入することができない。
そこで、ローカル変数を一つ使用し、
その変数に、引数がNullのときは特定の値を入れ、
そうでないときは引数を入れるようにすればよい。
ex.関数、引数がある場合は引数を返し、ない場合は10を返す。 function FUNC(_var1){ var var1; if(_var1==null) var1=10; else var1=_var1; return var1; }
○関数の戻り値で2つ以上の値を得る方法
配列を引数として与え、それに戻したい値を入れる。
ex.引数として与えた配列に10,20を入れる a=new array(); FUNC(a); print(a.get(0)); //10が表示される function FUNC(_a){ _a.add(10); _a.add(20); }
○共用関数の作成方法
方法1.使用したい関数の定義したクラスを全クラスの親クラスにする。
方法2.使用したい関数を持つクラスのオブジェクトをグローバル変数に入れ、
これを通して呼び出す。(ex.$g.FUNC();)
方法3.Kernel/PlainCharファイルに使用したい関数を記述する。(キケン、超上級者向け。実行ファイルでない限り他人の環境ではエラーが出ます。基本的にはやめておきましょう)
方法2.使用したい関数を持つクラスのオブジェクトをグローバル変数に入れ、
これを通して呼び出す。(ex.$g.FUNC();)
方法3.Kernel/PlainCharファイルに使用したい関数を記述する。(キケン、超上級者向け。実行ファイルでない限り他人の環境ではエラーが出ます。基本的にはやめておきましょう)
○Panelの意味、使用法
Panelはボードの機能、PanelCharはそのボードを毎フレーム画面上に表示する機能
(と様々な便宜)を司る。
つまり、自前で毎フレーム、ボードを表示すれば(かつ必要な便宜を自分で行えれば)
PanelCharを使用する必要はなくなる。
(ボードの表示には、stretchDraw(x,y,w,h)命令を使う)
(と様々な便宜)を司る。
つまり、自前で毎フレーム、ボードを表示すれば(かつ必要な便宜を自分で行えれば)
PanelCharを使用する必要はなくなる。
(ボードの表示には、stretchDraw(x,y,w,h)命令を使う)
○Panelの有効利用法
1.Panelを軽く使用する
PanelCharは使わない。
Panelに表示したいものを描き、これをcopyRect()を使用して$Panelにコピーする。
PanelCharは重いと言う話をよく聞くが、この方法ならあまり重くないはず。
但し、パネルの移動、回転したパネルの表示等は出来ないし、
$Panelのコピー先にある画像も上書きしてしまう。
また、表示の更新も自前でしなければならない。それが嫌なら大人しくPanelCharを使うべし。
2.??
PanelCharは使わない。
Panelに表示したいものを描き、これをcopyRect()を使用して$Panelにコピーする。
PanelCharは重いと言う話をよく聞くが、この方法ならあまり重くないはず。
但し、パネルの移動、回転したパネルの表示等は出来ないし、
$Panelのコピー先にある画像も上書きしてしまう。
また、表示の更新も自前でしなければならない。それが嫌なら大人しくPanelCharを使うべし。
2.??
○オブジェクトの表示位置を画面上に固定
オブジェクトに以下の関数を記述すると、
そのオブジェクトをスクロールの影響から無視する。
function draw() {
そのオブジェクトをスクロールの影響から無視する。
function draw() {
drawScreenXY(1); super.draw(); drawScreenXY(0);
}
○変数、ポインタについて
変数には、数値や文字列以外(Array,オブジェクト等)は全て、
"それ自体"ではなく"それを示すポインタ"が入っている。
その為、この変数を代入した場合、代入元と代入先の示すものは同一のものとなる。
(同じ内容という意味ではなく、同じものを示すということ)
"それ自体"ではなく"それを示すポインタ"が入っている。
その為、この変数を代入した場合、代入元と代入先の示すものは同一のものとなる。
(同じ内容という意味ではなく、同じものを示すということ)
ex.Arrayの場合 a=new array(); b=a; b.add(10); print(a.get(0)); //10が表示される
これは、Arrayの場合だが、オブジェクト("new ○" の形で生成したもの全て)でも同様である。
(また、これは代入だけではなく、関数の引数として渡した場合にも同じことが言える)
(また、これは代入だけではなく、関数の引数として渡した場合にも同じことが言える)
これを利用して、配列にオブジェクトを格納し管理、なんてことも可能。
○クラスを作成せずにオブジェクト作成する
オブジェクトが必要だが、処理を記述するわけではない。(他のオブジェクトから操作すればいい)
その、処理をしないクラスをわざわざ作るのは煩わしい。
こんな状況は結構ある。
実はクラスを作らなくても、オブジェクトは生成可能である。
基本オブジェクトを直に生成すればいい。
その、処理をしないクラスをわざわざ作るのは煩わしい。
こんな状況は結構ある。
実はクラスを作らなくても、オブジェクトは生成可能である。
基本オブジェクトを直に生成すればいい。
ex.obj=appear(new SpriteChar(x,y,p)); obj.wait(); //wait()しないとすぐに終了してしまう。
SpritCharだけでなく、DxChar,PanelCharなども可能。
このオブジェクトを移動させたい場合は、obj.x+=10;等とすればいい。
このオブジェクトを移動させたい場合は、obj.x+=10;等とすればいい。
-