「Tonyu Tips」の編集履歴(バックアップ)一覧はこちら
「Tonyu Tips」(2007/09/18 (火) 11:00:44) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*Tonyu Tips
(この項目は半永久的に未完成です。補正、Tipの追加等をお願いします。)
LastUpdate:H18.3.6
**目次
#contents
****○Tonyuの処理速度について
[[こちら>Tonyu Tip_処理速度について]]
****○異なる型の演算
異なる型で算術演算を行った場合、以下の様な演算結果になる。
また、型の変換も行われる。
ex.
1+0.1 == 1.1(浮動小数点型)
1+"str" == "1str"(文字列型)
1.1+"str" == "1.1str"(文字列型)
****○NULL値の扱い
[[こちら>null値との計算]]
****○値の型を調べる方法
整数型 : isInt(v)
浮動小数点型 : 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種)はそのまま入力しても、エラーとなる。
これを回避するため、以下の様にする。
texTmp="AポップA"; //この形ならエラーにならない
strPop=texTmp.substring(1,6); //"ポップ"だけ取り出す
setFont("HG創英角"+strPop+"体"); //フォントの設定
"HGP創英角ポップ体","HGS創英角ポップ体"についても同様。
尚、指定したフォントが存在しない場合、"MS Pゴシック"が使用される模様。
****○使用可能なフォント表示例&応用文字
各フォントの文字表示例を示す。
書式は
フォント名: 文字サイズ8 文字サイズ10 文字サイズ15 文字サイズ20
+[[基本>http://www4.atwiki.jp/gomatarou/?cmd=upload&act=open&pageid=30&file=TonyuFont_SizeList1.PNG]]
+[[枠付文字>http://www4.atwiki.jp/gomatarou/?cmd=upload&act=open&pageid=30&file=TonyuFont_SizeList_Frame.PNG]]
+[[影付文字>http://www4.atwiki.jp/gomatarou/?cmd=upload&act=open&pageid=30&file=TonyuFont_SizeList_shadow.PNG]]
途中で、文字が切れているのは仕様。
【枠付文字を書く関数】
//引数(順に)-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倍)
****○変数の初期値
変数 : 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をテキトーに作ってるとよく引っかかる。
スタック領域のサイズが小さい為、再起を利用したプログラムは通常の方法では不可能。
自作のスタックを使用する、新しく生成したオブジェクトで再起の処理を行う等の必要がある。
スタック領域を設定する関数が欲しい 。
****○画像の大きさ取得
横幅 : getPatWidth(p)
縦幅 : getPatHeight(p)
(p:画像ファイル名)
****○クラス名の取得
obj.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....(と言うか、クラス全部.)
親クラスを指定すると、その子クラスも指定したことになる。
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のときは特定の値を入れ、
そうでないときは引数を入れるようにすればよい。
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ファイルに使用したい関数を記述する。(キケン、超上級者向け。実行ファイルでない限り他人の環境ではエラーが出ます。基本的にはやめておきましょう)
****○Panelの意味、使用法
Panelはボードの機能、PanelCharはそのボードを毎フレーム画面上に表示する機能
(と様々な便宜)を司る。
つまり、自前で毎フレーム、ボードを表示すれば(かつ必要な便宜を自分で行えれば)
PanelCharを使用する必要はなくなる。
(ボードの表示には、stretchDraw(x,y,w,h)命令を使う)
****○Panelの有効利用法
1.Panelを軽く使用する
PanelCharは使わない。
Panelに表示したいものを描き、これをcopyRect()を使用して$Panelにコピーする。
PanelCharは重いと言う話をよく聞くが、この方法ならあまり重くないはず。
但し、パネルの移動、回転したパネルの表示等は出来ないし、
$Panelのコピー先にある画像も上書きしてしまう。
また、表示の更新も自前でしなければならない。それが嫌なら大人しくPanelCharを使うべし。
2.??
****○オブジェクトの表示位置を画面上に固定
オブジェクトに以下の関数を記述すると、
そのオブジェクトをスクロールの影響から無視する。
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;等とすればいい。
&counter()
*Tonyu Tips
(この項目は半永久的に未完成です。補正、Tipの追加等をお願いします。)
LastUpdate:H18.3.6
**目次
#contents
****○Tonyuの処理速度について
[[こちら>Tonyu Tip_処理速度について]]
****○異なる型の演算
異なる型で算術演算を行った場合、以下の様な演算結果になる。
また、型の変換も行われる。
ex.
1+0.1 == 1.1(浮動小数点型)
1+"str" == "1str"(文字列型)
1.1+"str" == "1.1str"(文字列型)
****○NULL値の扱い
[[こちら>null値との計算]]
****○値の型を調べる方法
整数型 : isInt(v)
浮動小数点型 : 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種)はそのまま入力しても、エラーとなる。
これを回避するため、以下の様にする。
texTmp="AポップA"; //この形ならエラーにならない
strPop=texTmp.substring(1,6); //"ポップ"だけ取り出す
setFont("HG創英角"+strPop+"体"); //フォントの設定
"HGP創英角ポップ体","HGS創英角ポップ体"についても同様。
尚、指定したフォントが存在しない場合、"MS Pゴシック"が使用される模様。
****○使用可能なフォント表示例&応用文字
各フォントの文字表示例を示す。
書式は
フォント名: 文字サイズ8 文字サイズ10 文字サイズ15 文字サイズ20
+[[基本>http://www4.atwiki.jp/gomatarou/?cmd=upload&act=open&pageid=30&file=TonyuFont_SizeList1.PNG]]
+[[枠付文字>http://www4.atwiki.jp/gomatarou/?cmd=upload&act=open&pageid=30&file=TonyuFont_SizeList_Frame.PNG]]
+[[影付文字>http://www4.atwiki.jp/gomatarou/?cmd=upload&act=open&pageid=30&file=TonyuFont_SizeList_shadow.PNG]]
途中で、文字が切れているのは仕様。
【枠付文字を書く関数】
//引数(順に)-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倍)
****○変数の初期値
変数 : 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をテキトーに作ってるとよく引っかかる。
スタック領域のサイズが小さい為、再起を利用したプログラムは通常の方法では不可能。
自作のスタックを使用する、新しく生成したオブジェクトで再起の処理を行う等の必要がある。
スタック領域を設定する関数が欲しい 。
(07年9月18日追記:現在のバージョンではスタック領域を設定する関数が実装済み)
****○画像の大きさ取得
横幅 : getPatWidth(p)
縦幅 : getPatHeight(p)
(p:画像ファイル名)
****○クラス名の取得
obj.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....(と言うか、クラス全部.)
親クラスを指定すると、その子クラスも指定したことになる。
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のときは特定の値を入れ、
そうでないときは引数を入れるようにすればよい。
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ファイルに使用したい関数を記述する。(キケン、超上級者向け。実行ファイルでない限り他人の環境ではエラーが出ます。基本的にはやめておきましょう)
****○Panelの意味、使用法
Panelはボードの機能、PanelCharはそのボードを毎フレーム画面上に表示する機能
(と様々な便宜)を司る。
つまり、自前で毎フレーム、ボードを表示すれば(かつ必要な便宜を自分で行えれば)
PanelCharを使用する必要はなくなる。
(ボードの表示には、stretchDraw(x,y,w,h)命令を使う)
****○Panelの有効利用法
1.Panelを軽く使用する
PanelCharは使わない。
Panelに表示したいものを描き、これをcopyRect()を使用して$Panelにコピーする。
PanelCharは重いと言う話をよく聞くが、この方法ならあまり重くないはず。
但し、パネルの移動、回転したパネルの表示等は出来ないし、
$Panelのコピー先にある画像も上書きしてしまう。
また、表示の更新も自前でしなければならない。それが嫌なら大人しくPanelCharを使うべし。
2.??
****○オブジェクトの表示位置を画面上に固定
オブジェクトに以下の関数を記述すると、
そのオブジェクトをスクロールの影響から無視する。
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;等とすればいい。
&counter()
表示オプション
横に並べて表示:
変化行の前後のみ表示: