Tips(小技) constructor コンストラクタ
投稿者 : リセッタ(em114-48-205-214.pool.e-mobile.ne.jp)
- 2011/04/29(Fri) 14:59
No.12980
|
|
|
|
|
# 質問じゃないけど 情報提供って事で 小技集スレッドです。
以前説明のあったサイトが無くなっているみたいなので、ここに説明を書いておきます。
・コンストラクタ(constructor)って何? インスタンス(オブジェクト)が作成された時、最初に呼ばれる処理。 つまり、new演算子、もしくはtonyu Systemからオブジェクト新規作成,貼付でオブジェクトを作った時呼ばれる関数。 詳細は"コンストラクタ"でぐぐ(検索す)れば、出てきます。(他の言語でも考え方は一緒) ※ tonyu Systemからオブジェクト新規作成,貼付の場合は引数無(すべてnull値)になる。 ・何ができるの? 何種類かの敵を作る場合、敵1、敵2…と複数のクラスを作る代わりに、 敵クラスを一つ作ってnew演算子でオブジェクト作成時の引数で処理を変える事で対応できる。 ・書式は? ○定義 constructor コンストラクタ名([引数[,引数]...]) 処理 コンストラクタ名 任意。混乱を避ける為にクラス名にするのが無難。 引数 呼出元で省略時はその引数名のローカル変数は未定義状態になる。 未定義状態は値としては'null'(メソッドと同様) 処理 処理内容を記述。複数行の場合は{}で囲い複文にすること。 ○呼出し new クラス名([引数[,引数]...]); ※ クラス名で呼び出しです。 ・記述する処理内容に何か制限がありますか? 1.'update(),updateEx()'は使ってはだめです。('wait()'は未確認) ・基底(継承元/親)クラスのコンストラクタは呼べないの? 'super()'を使って呼んでください。(必要な引数を定義すること) ※ 基底クラスの初期処理を行うため、通常'super()'を処理内容に記述する。 ・祖父母に当たる基底クラスは呼べない? 'super.super()'で基底の基底クラスのコンストラクタは呼べません。(親に当たるクラスまでしか呼べません) ・代表的なオブジェクトのコンストラクタの引数はどうなっていますか? 使い易さを考慮し'new'演算子と一緒に書いておきます。 (自作コンストラクタで使う場合'new'を外し、関数名をsuperにして呼出す) new PlainChar(x,y); // 基底:Sprite x,y:位置 new SpriteChar(x,y,p,f); // 基底:PlainChar x,y:位置 p:パターン番号 f:鏡像フラグ new DXChar(x,y,p,f,s,r,a); // 基底:PlainChar x,y,p,f:同上 s:倍率 r:角度 a:不透明度(0〜255) new PanelChar (x,y,w,h); // 基底:PlainChar x,y:位置 w,h:大きさ new TextChar(xx,yy,t,c,s); // 基底:PlainChar x,y:位置 t:表示文字列 c:色 s:大きさ(px) new SecretChar(x,y); // 基底:PlainChar x,y:位置 new FrameManager(x,y); // 基底:SecretChar x,y:位置 new String(i); // 基底:Object i:半角文字コード(-128〜127 : 128以上のコードは-256を足すこと) // 全角の例)"愛(Shift-Jis:0x88a4:136,164)" (new String(136-256)+new String(164-256)); new Panel(w,h); // 基底:Object w,h:大きさ ・デストラクタはないの? あります。でも一般のプログラムでは必要ありません。 ("Kernel"以下のフォルダで独自にリソースの後処理をする場合のみ) ・サンプルないの? 敵プログラムのサンプルです。
[file name:enemy.tonyu] extends DxChar; constructor enemy(x,y,tt) { // tt:敵種別 [0]〜 var pp; if(tt) t=tt; else t=0; pp=$pat_enemy+t; super(x,y,pp,0,1,0,255); // 基底クラスコンストラクタ呼出(DxCharクラス:↑'extends'宣言参照) }
while(1) { // 移動処理 if(!screenOut()) { // 画面内 if(t==0) mv0(0); else // 敵0移動処理:上から下 if(t==1) mv1(0); else // 敵1移動処理:右から左 if(t==2) mv1(1); else // 敵2移動処理:左から右 if(t==3) mv0(1); // 敵3移動処理:下から上 } // 当り判定 // :(略) update(); } // :(略)
[file name:gemeManager.tonyu] extends FrameManager; function onAfetrMove() { $map.scrollTo($viewX+1,$viewY); // 強制横スクロール if($viewX==200) appear(new enemy($viewX+100,20,0)); if($viewX==210) appear(new enemy($viewX+100,20,0)); // :(略) if($viewX==410) appear(new enemy($viewX+100,100,1)); // :(略) update(); }
・その他質問があれば題名に"Q:Con."文字列を加えて、このスレッドに返信してください。 例)Q:Con. 処理内容に何を書けば良いのですか? S:Con. 処理内容の制限補足です
# 一部修正しました。(11-5-1)
|
Re: Tips(小技) constructor コンストラクタQ:Con.
投稿者 : Percentage(pw126160236058.60.tik.panda-world.ne.jp)
- 2011/04/30(Sat) 19:09
No.12987
|
|
|
|
返信の仕方はこれでおkですか?
Tonyuのコンストラクタ名は、今のところ意味は無しとヘルプに書いてあったような気がします。 あと、super.suer()->super.super()ですね。
・waitとupdateの挙動の違いについて updateは内部的にネイティブ関数suspendを呼び出しているようで、オブジェクトスレッドの挙動を一時中断するようです。 それとは違いwaitは、オブジェクトスレッドをwait中スレッドリストに追加するようになっている(らしい)ので、実質コンストラクタで呼び出しても意味はありません。
|
Re:Tips…… Q:Con.(12987)
投稿者 : リセッタ(em111-188-77-172.pool.e-mobile.ne.jp)
- 2011/05/01(Sun) 00:23
No.12991
|
|
|
|
>返信の仕方はこれでおkですか? Tipsスレッドにしたいので、コンストラクタの質問はQ:Con.にしました。わかりずらい文章ですいません。 Ex) Q:Con. 処理内容は何をしたらいいの? S:Con. コンストラクタ名の補足
>Tonyuのコンストラクタ名は、今のところ意味は無しとヘルプに書いてあったような気がします。 コンストラクタってヘルプ載ってた?Wikiの方発掘しましたかね?
>あと、super.suer()->super.super()ですね。 super.super()じゃだめだけどsuper->super()で…… タイポか、すいません
>・waitとupdateの挙動の違いについて……(略) コンストラクタ内部で使用できるかの話で、wait()もsuspend()を内部的に呼んでいるので駄目だろうな〜。でも実際動かして確認はしてないってことです。(update()メソッドは"Tonyu System"が無反応になります) コンストラクタで呼ぶ意味があるのか?ですが、コンストラクタでChar系オブジェクトをappear()して初期設定を待ちたいって場合なんかupdate()したいよね?
補足・情報ありがとうございました。
|
|