※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Tonyu Tips

(この項目は半永久的に未完成です。補正、Tipの追加等をお願いします。)
LastUpdate:H18.3.6

目次



○Tonyuの処理速度について


○異なる型の演算
異なる型で算術演算を行った場合、以下の様な演算結果になる。
また、型の変換も行われる。
ex.
1+0.1     == 1.1(浮動小数点型)
1+"str"   == "1str"(文字列型)
1.1+"str" == "1.1str"(文字列型)


○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
  1. 基本
  2. 枠付文字
  3. 影付文字
途中で、文字が切れているのは仕様。

【枠付文字を書く関数】
//引数(順に)-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;等とすればいい。


-