1208799
Tonyu BBS
[再読み込み] [ホームページ] [使いかた] [ワード検索] [管理用]

おなまえ

Eメール
題  名  
コメント(http(s)://などのURLが含まれていると投稿できないことがあります)
添付プログラム
※プログラムに関する質問は、そのプログラムを添付して送ると対応が早くできます
添付方法...
削除キー (自分の記事を削除時に使用。英数字で8文字以内)
文字色
無題 投稿者 : @key(ntchba123237.chba.nt.ngn2.ppp.infoweb.ne.jp)
- 2012/11/17(Sat) 00:24 No.13603
 


wikiの最新が更新されてますね
編集パスワードを解放して欲しいと思っているのは自分だけじゃないと思う
過去ログバックアップ制度もあるし荒らしは気にしないでいいんじゃないかな
運営さん!お願いします


Re: 無題 投稿者 : kazz(ntchba123237.chba.nt.ngn2.ppp.infoweb.ne.jp)
- 2012/11/17(Sat) 00:54 No.13604
 
全然関係ないけれどここで使ってるハンドルネームはkazzでした・・・

無題 投稿者 : RT(y238088.dynamic.ppp.asahi-net.or.jp)
- 2012/10/07(Sun) 02:29 No.13596
 


こんにちは。私は中学生です

質問なんですが、今の座標(x,y)から(tx,ty)までt[frame]で「なめらか」に移動するメゾットってどうやって作るのでしょうか。案外難しくて作れませんでした。

「なめらか」というのは、速度が一定ではなくて、最初は速度0、だんだん早くなり、真ん中では最速で、それからは遅くなって座標が(x2,y2)になったときにちょうど速度が0になるものです。

私が作ってみた「なめらかでない」プログラムは以下です。

extends SpriteChar;

/* 初期化 */
x=100;
y=100;
dx=0;
dy=0;
targetx=0;
targety=0;

/* 移動先、時間を設定(更新) */
function target_set(tx,ty,t) {
  targetx=tx;
  targety=ty;
  dx=(tx-x)/t;
  dy=(ty-y)/t;
}

/* 実際に動く */
function move() {
  
  /* dx,dy(速度)を加算 */
  x+=dx; 
  y+=dy;
  
  /* 終了条件は、指定した座標中心の半径1の円の内来た時 */
  if ((targetx-x)*(targetx-x)+(targety-y)*(targety-y)<1) {
    dx=0;
    dy=0;
  }
}

/* 今の座標から(200,200)へ100frameかけて等速移動するよう設定 */
target_set(200,200,100);

/* メインループ */
while(1) {
  move(); //実際に移動
  update(); 
}

(まだ幼稚なプログラムだと思いますがお見逃しを。。。)
プログラムを見ればわかるように、target_setで目標を指定、moveで目標に向かって動く、という感じにしたいです。


Re: 無題 投稿者 : RT(y238088.dynamic.ppp.asahi-net.or.jp)
- 2012/10/07(Sun) 02:32 No.13597
 
すみません、修正です。
誤:(x2,y2)になったときに
正:(tx,ty)になったときに

読みづらくてすみません><
お願いします。


等加速度運動 投稿者 : リセッタ(ai126213132121.5.tss.access-internet.ne.jp)
- 2012/10/07(Sun) 06:35 No.13598
 
この手の問題は、速度と時間(フレーム数)のグラフをイメージすると解り易いです。

等速運動なら長方形に、等加速度運動なら直角三角形になります。
  d=L/(1*T)      // 速度
  M+=d*1          // 移動
中央で減速になるので加速し続けた場合の半分の三角形がイメージできたでしょうか?
  d=L/((T*T)/4) // 加速度
  M+=d*dt         // 移動

ソース

/* 初期化 */
x=100;
y=100;
dx=0;
dy=0;
targetx=0;
targety=0;
tc=0; fc=0; // 追加

/* 移動先、時間を設定(更新) */
function target_set(tx,ty,t) {
  targetx=tx;
  targety=ty;
//dx=(tx-x)/t;
//dy=(ty-y)/t;
  dx=(tx-x)/(t*t/4);  // 変更
  dy=(ty-y)/(t*t/4);
  tc=t;               // 追加
}

/* 実際に動く */
function move() {
  
  /* dx,dy(速度)を加算 */
//x+=dx*fc; 
//y+=dy*fc;
  fc++;               // 追加
  if(fc<tc/2) { // 加速
    x+=dx*fc; 
    y+=dy*fc;
  } else {      // 減速
    x+=dx*(tc-fc);
    y+=dy*(tc-fc);
  }
  
///* 終了条件は、指定した座標中心の半径1の円の内来た時 */
//if ((targetx-x)*(targetx-x)+(targety-y)*(targety-y)<1) {
  /* 終了条件は、指定したフレーム数移動した時 */
  if(fc>=tc) {
    dx=0;
    dy=0;
    fc=0; tc=0;  // 追加
  }
}

/* 今の座標から(300,300)へ100frameかけて等速移動するよう設定 */
target_set(300,300,100);

/* メインループ */
while(1) {
  move(); //実際に移動
  update(); 
}


等加速度運動 投稿者 : RT(y238088.dynamic.ppp.asahi-net.or.jp)
- 2012/10/07(Sun) 20:08 No.13599
 
Download:13599.zip 13599.zip リセッタ様、ありがとうございます!!
なるほど、グラフで考えれば簡単ですね。学校の物理で習ったv-tグラフみたいなやつですよね。完全に(?)理解しました!

そう来ると、一般化したくなってきて、してしまいました。ついでに文字も物理っぽくしました。
需要があるかどうかはわかりませんが、ご自由にお使いください。

添付ファイルのpngにあるような等加速運動ができるモジュールです。簡単に話すと、目的地と初速度、加速、等速、減速の3つの時間を指定するとあとは勝手になめらかに動いてくれます。
導出過程もまとめました。

コードは以下です。

extends SpriteChar;

/* 初期化 */
x=300; //初期位置[px]
y=300; //初期位置[px]

/************************

なめらか移動モジュール(?)始まり

************************/

target_x=0; //目的x座標[px]
target_y=0; //目的y座標[px]
first_vx=0; //x方向の初速度[px/frame]
first_vy=0; //y方向の初速度[px/frame]
max_vx=0; //x方向の最大速度[px/frame]
max_vy=0; //y方向の最大速度[px/frame]
distance_x=0; //(target_setが呼ばれた時の)目標までのx方向距離[px]
distance_y=0; //(target_setが呼ばれた時の)目標までのy方向距離[px]
kasoku_t=0;  //加速する時間[frame]
tousoku_t=0; //等速運動する時間[frame]
gensoku_t=0; //減速する時間[frame]
t=0; //なめらか移動用時間カウンタ[frame]
moving=0; //なめらか移動中フラグ(1…移動中 0…停止中)


/* 移動先、時間を設定(更新)
tx,ty…目的のx座標、y座標[px]
v0…初期速度[px/frame](x方向とy方向に分解されます)
t1…加速する時間(0〜)[frame]
t2…等速運動時間(0〜)[frame]
t3…減速する時間(0〜)[frame]
*/
function target_set(tx,ty,v0,t1,t2,t3) {
  
  //ゼロ除算防止・マイナス時間禁止
  if (dist(tx-x,ty-y)==0) return;
  if (t1<0 || t2<0 || t3<0) return;
  
  //初速度設定
  first_vx = v0 * (tx - x) / sqrt( (tx - x)*(tx - x) + (ty - y)*(ty - y) );
  first_vy = v0 * (ty - y) / sqrt( (tx - x)*(tx - x) + (ty - y)*(ty - y) );
  
  //距離設定(符号付き)
  distance_x = tx-x;
  distance_y = ty-y;
  
  //max速度計算
  max_vx = ( 2*distance_x - t1*first_vx ) / (t1 + 2*t2 + t3);
  max_vy = ( 2*distance_y - t1*first_vy ) / (t1 + 2*t2 + t3);
  
  //加速・等速・減速時間設定
  kasoku_t=t1;
  tousoku_t=t2;
  gensoku_t=t3;
  
  //カウント時間設定
  t=0;
  
  //移動中フラグON
  moving=1;
}

/* target_setで設定したように動く */
function move() {
  t++;
  if (t<=kasoku_t) { //等加速度運動(加速)
    x += first_vx + (max_vx-first_vx) * t / kasoku_t;
    y += first_vy + (max_vy-first_vy) * t / kasoku_t;
  } else if (t<=kasoku_t+tousoku_t) { //等速運動
    x += max_vx;
    y += max_vy;
  } else if (t<=kasoku_t+tousoku_t+gensoku_t){//等加速度運動(減速)
    x += max_vx - max_vx*( t-kasoku_t-tousoku_t ) / gensoku_t;
    y += max_vy - max_vy*( t-kasoku_t-tousoku_t ) / gensoku_t;
  } else {
    moving=0;
  }
}

/* 移動中なら1、停止中なら0を返す */
function is_moving() {
  return moving; 
}

/************************

なめらか移動モジュール(?)終わり

************************/

randomize();

/* メインループ */
while(1) {
  if (is_moving()==0) target_set(rnd($screenWidth),rnd($screenHeight),rnd(5)-2,rnd(60),rnd(60),rnd(60)); //移動が終わったら次の移動情報を設定
  move(); //実際に移動
  update(); 
}

リセッタさん、ありとうございました。


Re: 無題 投稿者 : RT(y238088.dynamic.ppp.asahi-net.or.jp)
- 2012/10/07(Sun) 20:20 No.13600
 
↑これだと、target_x,target_yの意味がありませんね。ちょっと改造してみました。

extends SpriteChar;

/* 初期化 */
x=300; //初期位置[px]
y=300; //初期位置[px]

/************************

なめらか移動モジュール(?)始まり

************************/

target_x=0; //目的x座標[px]
target_y=0; //目的y座標[px]
first_vx=0; //x方向の初速度[px/frame]
first_vy=0; //y方向の初速度[px/frame]
max_vx=0; //x方向の最大速度[px/frame]
max_vy=0; //y方向の最大速度[px/frame]
distance_x=0; //(target_setが呼ばれた時の)目標までのx方向距離[px]
distance_y=0; //(target_setが呼ばれた時の)目標までのy方向距離[px]
kasoku_t=0;  //加速する時間[frame]
tousoku_t=0; //等速運動する時間[frame]
gensoku_t=0; //減速する時間[frame]
t=0; //なめらか移動用時間カウンタ[frame]
moving=0; //なめらか移動中フラグ(1…移動中 0…停止中)


/* 移動先、時間を設定(更新)
tx,ty…目的のx座標、y座標[px]
v0…初期速度[px/frame](x方向とy方向に分解されます)
t1…加速する時間(0〜)[frame]
t2…等速運動時間(0〜)[frame]
t3…減速する時間(0〜)[frame]
*/
function target_set(tx,ty,v0,t1,t2,t3) {
  
  //ゼロ除算防止・マイナス時間禁止
  if (dist(tx-x,ty-y)==0) return;
  if (t1<0 || t2<0 || t3<0) return;
  
  //初速度設定
  first_vx = v0 * (tx - x) / sqrt( (tx - x)*(tx - x) + (ty - y)*(ty - y) );
  first_vy = v0 * (ty - y) / sqrt( (tx - x)*(tx - x) + (ty - y)*(ty - y) );
  
  //距離設定(符号付き)
  distance_x = tx-x;
  distance_y = ty-y;
  
  //max速度計算
  max_vx = ( 2*distance_x - t1*first_vx ) / (t1 + 2*t2 + t3);
  max_vy = ( 2*distance_y - t1*first_vy ) / (t1 + 2*t2 + t3);
  
  //加速・等速・減速時間設定
  kasoku_t=t1;
  tousoku_t=t2;
  gensoku_t=t3;

  target_x=tx;
  target_y=ty;
  
  //カウント時間設定
  t=0;
  
  //移動中フラグON
  moving=1;
}

/* target_setで設定したように動く */
function move() {
  t++;
  if (t<=kasoku_t) { //等加速度運動(加速)
    x += first_vx + (max_vx-first_vx) * t / kasoku_t;
    y += first_vy + (max_vy-first_vy) * t / kasoku_t;
  } else if (t<=kasoku_t+tousoku_t) { //等速運動
    x += max_vx;
    y += max_vy;
  } else if (t<=kasoku_t+tousoku_t+gensoku_t){//等加速度運動(減速)
    x += max_vx - max_vx*( t-kasoku_t-tousoku_t ) / gensoku_t;
    y += max_vy - max_vy*( t-kasoku_t-tousoku_t ) / gensoku_t;
  } else {
    x=target_x;
    y=target_y;
    moving=0;
  }
}

/* 移動中なら1、停止中なら0を返す */
function is_moving() {
  return moving; 
}

/************************

なめらか移動モジュール(?)終わり

************************/

randomize();

/* メインループ */
while(1) {
  if (is_moving()==0) target_set(rnd($screenWidth),rnd($screenHeight),rnd(5)-2,rnd(60),rnd(60),rnd(60)); //移動が終わったら次の移動情報を設定
  move(); //実際に移動
  update(); 
}

長くなってすみません。m(_ _)m


Re: 無題 投稿者 : RT(y238088.dynamic.ppp.asahi-net.or.jp)
- 2012/10/07(Sun) 20:54 No.13601
 
↑これだと、target_x,target_yの意味がありませんね。ちょっと改造してみました。

extends SpriteChar;

/* 初期化 */
x=300; //初期位置[px]
y=300; //初期位置[px]

/************************

なめらか移動モジュール(?)始まり

************************/

target_x=0; //目的x座標[px]
target_y=0; //目的y座標[px]
first_vx=0; //x方向の初速度[px/frame]
first_vy=0; //y方向の初速度[px/frame]
max_vx=0; //x方向の最大速度[px/frame]
max_vy=0; //y方向の最大速度[px/frame]
distance_x=0; //(target_setが呼ばれた時の)目標までのx方向距離[px]
distance_y=0; //(target_setが呼ばれた時の)目標までのy方向距離[px]
kasoku_t=0;  //加速する時間[frame]
tousoku_t=0; //等速運動する時間[frame]
gensoku_t=0; //減速する時間[frame]
t=0; //なめらか移動用時間カウンタ[frame]
moving=0; //なめらか移動中フラグ(1…移動中 0…停止中)


/* 移動先、時間を設定(更新)
tx,ty…目的のx座標、y座標[px]
v0…初期速度[px/frame](x方向とy方向に分解されます)
t1…加速する時間(0〜)[frame]
t2…等速運動時間(0〜)[frame]
t3…減速する時間(0〜)[frame]
*/
function target_set(tx,ty,v0,t1,t2,t3) {
  
  //ゼロ除算防止・マイナス時間禁止
  if (dist(tx-x,ty-y)==0) return;
  if (t1<0 || t2<0 || t3<0) return;
  
  //初速度設定
  first_vx = v0 * (tx - x) / sqrt( (tx - x)*(tx - x) + (ty - y)*(ty - y) );
  first_vy = v0 * (ty - y) / sqrt( (tx - x)*(tx - x) + (ty - y)*(ty - y) );
  
  //距離設定(符号付き)
  distance_x = tx-x;
  distance_y = ty-y;
  
  //max速度計算
  max_vx = ( 2*distance_x - t1*first_vx ) / (t1 + 2*t2 + t3);
  max_vy = ( 2*distance_y - t1*first_vy ) / (t1 + 2*t2 + t3);
  
  //加速・等速・減速時間設定
  kasoku_t=t1;
  tousoku_t=t2;
  gensoku_t=t3;

  target_x=tx;
  target_y=ty;
  
  //カウント時間設定
  t=0;
  
  //移動中フラグON
  moving=1;
}

/* target_setで設定したように動く */
function move() {
  t++;
  if (t<=kasoku_t) { //等加速度運動(加速)
    x += first_vx + (max_vx-first_vx) * t / kasoku_t;
    y += first_vy + (max_vy-first_vy) * t / kasoku_t;
  } else if (t<=kasoku_t+tousoku_t) { //等速運動
    x += max_vx;
    y += max_vy;
  } else if (t<=kasoku_t+tousoku_t+gensoku_t){//等加速度運動(減速)
    x += max_vx - max_vx*( t-kasoku_t-tousoku_t ) / gensoku_t;
    y += max_vy - max_vy*( t-kasoku_t-tousoku_t ) / gensoku_t;
  } else {
    x=target_x;
    y=target_y;
    moving=0;
  }
}

/* 移動中なら1、停止中なら0を返す */
function is_moving() {
  return moving; 
}

/************************

なめらか移動モジュール(?)終わり

************************/

randomize();

/* メインループ */
while(1) {
  if (is_moving()==0) target_set(rnd($screenWidth),rnd($screenHeight),rnd(5)-2,rnd(60),rnd(60),rnd(60)); //移動が終わったら次の移動情報を設定
  move(); //実際に移動
  update(); 
}

長くなってすみません。m(_ _)m

キーIDについて 投稿者 : とぇい(softbank126009051062.bbtec.net)
- 2012/09/16(Sun) 00:25 No.13593
 


質問なんですけども、右のシフトキーの横にある_を打つキーのキーIDはいくつでしょうか?
調べても出てこないので・・・よろしければご存知の方教えてください!


Re: キーIDについて 投稿者 : マッキー(p4162-ipbf1204sapodori.hokkaido.ocn.ne.jp)
- 2012/09/16(Sun) 01:11 No.13594
 
226です。

Tonyuを起動 → 画面左上の「ツール」→「レシピ」(フォークとナイフのボタン)を押す
カテゴリで「入力キー」を選択、「getkeyのキーコードを調べる」を選択
下のプログラムを、どっかのクラスのプログラムにコピー&貼り付けして実行すると、あとは押したキーの番号が画面に出るので、簡単に調べられます。
ちなみに、243, 244と表示されますが、それは半角,全角を表しています。


Re: キーIDについて 投稿者 : とぇい(softbank126009051062.bbtec.net)
- 2012/09/30(Sun) 17:56 No.13595
 
おお、こんな物があったとは・・・
ありがとうございました!

1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : ぐりーんげーむ。(p14139-ipngn2101hodogaya.kanagawa.ocn.ne.jp)
- 2012/09/08(Sat) 01:12 No.13587
 


質問では無いのですが、過去ログに情報が見当たらず
この仕様のせいで一時間近く潰されたので書き込みます。
Tonyuのバージョンは1.26です。

まず新しいプロジェクトで下記のオブジェクトを作って実行してください。

//オブジェクトその1
extends SpriteChar;
while(1) {
  print("☆");
  update();
}

//オブジェクトその2
extends SpriteChar;
while(1) {
  j=1;
  for (i=0;i<9999999;i++) {j++;}
  print("★");
  update();
}

コンソールには☆★☆★...と表示される、と思っていたのですが
いざ実行すると☆☆☆☆...となってしまいます。
どうやら、その2はfor文の途中で処理を飛ばされているようです。
これが並列処理……!!
1フレーム1オブジェクトに処理を集中させるのは止めたほうが良さそうです。

特にロードで大量のファイルを読み込むときは
読み込む前に他のオブジェクトが動き出して、予想だにしないバグができたりします。
updateとは何だったのか……
直列処理に慣れてる人は特に忘れやすい仕様だと思うので気をつけましょ〜(^o^


Re: 1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : マッキー(p3063-ipbf1910sapodori.hokkaido.ocn.ne.jp)
- 2012/09/08(Sat) 05:39 No.13588
 
この仕様って厄介な時ありますよねー!

ちょっと補足しに来ました!
一応無理やりな方法ではありますが、1つのオブジェクトに処理を集中させても処理が飛ばされないようにすることができます。

ただ、この処理はめんどくさいところがあるので、
普通にやるなら、大量のファイルを読み込むときは、読み込みオブジェクトが読み終わるまで、
他のオブジェクトが待つような方法を使った方が、やりやすいと思います。
・timeStop()で他のオブジェクトを止めて、読み終わったらreleaseAll()で再開させる
・読み込み完了のフラグをたてる変数を作り、読み込み中は0、読み終わったら1にして、他のオブジェクトはその変数が1になるまで待つ
など

無理やりな方法とは、execメソッドを使った方法のことで、スーパープロセッサのReadMeでも紹介しました。
ttp://hoge1e3.sakura.ne.jp/tonyu/project/pages/viewProject.cgi?mainkey=277&

exec()はそのオブジェクトを実行させるメソッドです。
オブジェクト生成時にappearを使えば、Tonyuが自動的にオブジェクトを実行しますが、それは自動的にexec()を呼び出しているからです。
newだけでオブジェクトを生成すれば、そのオブジェクトは動作しませんが、exec()を使うと手動でオブジェクトを実行します。

ぐりーんげーむ。さんの例をexec()の方法でやるなら、下記のようになります。

//オブジェクトその1 (MainChar.tonyu)
extends SpriteChar;
while(1) {
  print("☆");
  update();
}

//オブジェクトその2 (MainChar2.tonyu)
extends SpriteChar;
if (mode == null) { // メインの処理
  
  obj = new MainChar2(); // オブジェクトを生成
  obj.mode = 1; // exec()で実行されるオブジェクトになる
  proc = new classes.lang.Process(obj, "", 1); // Processオブジェクトを生成
  
  while(1) {
    $MainChar2_j = 1; // カウントリセット
    for (i=0; i<2000; i++) {
      proc.exec(); // 2000回ずつ実行
    }
    print("★");
    update();
  }
  
} else if (mode == 1) { // 分散させる処理
  
  while (1) {
    for (i=0; i<5000; i++) {
      $MainChar2_j ++; // 5000回繰り返す
    }
    update();
  }
  
}

オブジェクトは、MainCharが1つ、MainChar2が2つ作られます。
MainChar2は自分自身をもう1つ作り2つになりますが、1つはオブジェクトを繰り返し実行させ、
もう1つはexec()で呼び出されたとき処理を実行します。
exec()はProcessオブジェクトから出ないと呼び出せないので、
ProcessにMainChar2を関連付けて、Processを生成してから、
exec()を呼び出します。

5000回プラス1するオブジェクトを2000回実行しているので、
10000000回プラス1したことになります。
(回数はバランス良く割り振らないと処理が途中で飛ばされてしまいます)
ただ、処理を途中で飛ばすことがなくなるので、
処理が返ってくるのに時間がかかり、Tonyuウィンドウに応答なしと出ることがあります。

反応が鈍くなるのを避けたいなら、普通の方法で…
どうしても処理が飛ばされないようにしたいなら、exec()の方法
というように使い分けるといいとでしょう!


Re: 1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : リセッタ(ai126213005219.5.tss.access-internet.ne.jp)
- 2012/09/09(Sun) 02:20 No.13589
 
ふむふむ、なるほど。
なかなか興味深い話題ですね。
スーパープロセッサのReadMe を きちんと読めば、
表示結果は、”☆☆☆☆……☆★☆……☆☆☆……”になると。

# 処理を飛ばすを、以降キャンセルしちゃうと解釈しちゃう人もいるかもと

#  スーパープロセッサのReadMeで 少し気になった点
#「オブジェクトの処理量を増やす方法2」
#  while (1) {
#    proc.exec(); // 実行
#    proc.aobj.draw();  // 描画
#    update();
#  }
#  は、
#  function onDraw() {
#    proc.aobj.draw();  // 描画
#  }
#  じゃ、だめなの?


Re: 1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : マッキー(p4117-ipbf805sapodori.hokkaido.ocn.ne.jp)
- 2012/09/10(Mon) 01:23 No.13590
 
>表示結果は、”☆☆☆☆……☆★☆……☆☆☆……”になると。
No.13588 のプログラムは、MainCharとMainChar2のオブジェクトを1つずつ作成して実行すれば
処理が重いながらも、"☆★☆★☆★…" と表示されます。

>処理を飛ばすを、以降キャンセルしちゃうと解釈しちゃう人もいるかもと
そうですね。ReadMeに書いてるように「オブジェクトの処理が後回しにされる」といった方が誤解されないかもしれません。(自分で書いておきながら忘れてた…)

function onDraw() {} で proc.aobj.draw(); を呼び出しても問題なく動きます。
ただ、onDraw()は注意が必要でこのメソッドは設計中にも呼び出されます。
設計中は、procにオブジェクトが入っていない状態で proc.aobj.draw(); が呼び出されるのでエラーが発生してしまいます。
onDraw() で呼び出すときは設計中に真を返す designMode() を使って、実行時にだけ proc.aobj.draw(); を呼び出した方がいいです。

ちなみに、onDraw() でprocにオブジェクトを生成して代入することもできますが、onDraw() は update() の後に呼ばれるので、今度は proc.exec(); でエラーになります。
if (proc) proc.exec(); と書けばエラーは無くなりますが可読性が悪くなるので、onDraw() 内ではオブジェクトを作らない方がいいです。

以下 onDraw() を使った場合の「オブジェクトの処理量を増やす方法2」のプログラム

/* MainChar.tonyu */
extends SpriteChar;

// オブジェクトとプロセスを生成
proc = new classes.lang.Process(new SubChar(100, 100, 7), "", 1);

function onDraw() {
  if (!designMode()) proc.aobj.draw(); // 描画
}

while (1) {
  proc.exec(); // 実行
  update();
}

/* SubChar.tonyu */
extends SpriteChar;

while (1) {
  x++;
  update();
}


処理を後回しにする仕様は厄介なこともありますが、プログラムミス(無限ループとか)したときに Tonyu が固まりにくい(応答なしになりにくい)という長所?もあるんですよねー
(Tonyu自体昔に作られたので、Windows 98 とかの低スペックPCでも固まらないようにそういう仕様が作られたのかも…)
実際、exec()で処理が後回しにされないようにすると、反って重くなってしまうことがあります。それに、ソースの可読性が悪くなります。
まあ、こだわりを持った中級者・上級者向けの方法だと思ってください(^^;


1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : リセッタ(ai126213147065.5.tss.access-internet.ne.jp)
- 2012/09/10(Mon) 14:15 No.13591
 
返信ありがとうございます。
描画は、描画タイミングでやりたかったもので。

キッチリ作るとすると こうかな?

function onDraw() {
// super.onDraw();  // “onDraw()”メソッドが定義済のクラスを継承している場合のみコメントを外す……やりすぎ?
  // デザインモードではなく、かつ、“proc”が定義済なら 描画
  if (!designMode() && proc) proc.aobj.draw();
}


Re: 1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : マッキー(p1070-ipbf908sapodori.hokkaido.ocn.ne.jp)
- 2012/09/11(Tue) 21:57 No.13592
 
>  if (!designMode() && proc) proc.aobj.draw();
なるほど! この条件式の方がエラーになりにくくより安全ですね。

そういえば言い忘れてたことがありました…
ReadMeにも書くの忘れていましたが、appearを使わないで生成したオブジェクトは、
die() を使っても消えてくれません。あと、wait() も無視されます。

生成時にappearを使った時は、Tonyu内部で die(), wait() を呼び出したときの管理を自動的に行ってくれるのですが、
appearを使わないと自動管理の対象外になります。

appearを使わないときは、wait() は updateEx() で代用し、
die() は _pProc.kill(); と呼び出して代用できます。
_pProc はPlainCharクラス(SpriteChar,DxChar,TextChar,PanelChar,SecretChar 等の親クラス)の隠し変数で、自分を動かしてくれるProcessオブジェクトを指しています。

[オブジェクトの待機・削除ができるように]
/* MainChar.tonyu */
extends SpriteChar;

// オブジェクトとプロセスを生成
proc = new classes.lang.Process(new SubChar(100, 100, 7), "", 1);

function onDraw() {
 //super.onDraw();  // “onDraw()”メソッドが定義済のクラスを継承している場合のみコメントを外す……やりすぎ?
  // デザインモードではなく、かつ、“proc”が定義済なら 描画
  // 追加:proc.aobjが死ぬと変数の値が0になりエラーになるので proc.aobjも判断
  if (!designMode() && proc && proc.aobj) proc.aobj.draw();
}

while (1) {
  
  if (proc) proc.exec(); // 実行
  if (getkey(88)) wait(60); // Xキー:1秒待つ
  if (getkey(86)) die();    // Vキー:消す
  update();
}

/* SubChar.tonyu */
extends SpriteChar;

function onDie() {
  _pProc.kill(); // kill()だけだとオブジェクト変数がゼロクリアされないので、一応die()を呼び出すようにする
}

while (1) {
  x++;
  if (getkey(90)) updateEx(60); // Zキー:1秒待つ
  if (getkey(67)) die();        // Cキー:消す
  update();
}


ちなみに、他のオブジェクトのオブジェクト変数やグローバル変数に、消したいオブジェクトが参照されていると、そのオブジェクトは完全には消えません。
://hoge1e3.sakura.ne.jp/tonyu/wiki/index.php?%A5%AC%A5%D9%A1%BC%A5%B8%A5%B3%A5%EC%A5%AF%A5%BF

「ツール」→「オブジェクト一覧」ウィンドウを見ると、オブジェクトが残っているかどうか見れます。
設計中の画面で作られたオブジェクトは「$MyChar, $MyChar_1, $MyChar_2, …」のようにグローバル変数ができてしまうため、
die() を呼び出しても、グローバル変数がオブジェクトを参照しているため、一覧に残りっぱなしになります・・・

ページ切替しても、一覧に残りっぱなしでどんどんたまっていきますし…
何回もページ切替すると一覧から消えることもありますが、その割にはメモリ使用量減らないし…

kill() 使ってたらもしかしてメモリリークを防げるんじゃないかと思い、またスーパープロセッサのように Kernel を改造してたので、返信遅れました… (^^;;
結局、知らない変数からもオブジェクトが参照されているようで、設計中の画面で作られたオブジェクトは完全には消えてくれませんでした…
(やっぱり、メモリリークからは逃れられない・・・(--;) )

終了時エラー 投稿者 : 雲プリン(20.4.87.61.ap.yournet.ne.jp)
- 2012/09/04(Tue) 22:48 No.13580
 


11996
のような
(抜粋)
ランタイムを作成して出来たゲームを起動させ、終了させようとする(或いはウィンドウを閉じようとする)と
「Player.exeのアドレス 004CF67 でアドレス 00000000」というエラーが出てしまいます。

と同じ現象が起きてしまいます。
これはやはり画面サイズを変える以外に対処法はないのでしょうか・・・


自己解決? 投稿者 : 雲プリン(20.4.87.61.ap.yournet.ne.jp)
- 2012/09/05(Wed) 01:05 No.13581
 
ちゃんとした対処法がわからないのですが、
とりあえず、回避ができたので回避方法を記載します
あくまでも11996にあるサイズ変更と別の対処法です。

@画面サイズをコードで固定させない。
A終了後に対象のオブジェクトを殺すように指定する。(実際にどのタイミングで殺してるかは知りませんが…)

Aの手順として かなりめんどくさいかもしれないけど
怪しいオブジェクトを見つける作業に入ります。
逆に考えると、怪しいオブジェクトがいなければ
ランタイムを作成後対象の画面では正常に終了するはずです

もし、怪しいオブジェクトがいれば
そいつを監視してもし死んだらそいつを殺す
って入れました・・・



aクラス(原因)、
while(1){
update();
}

bクラス、
while(1){
if($a.isDead() == 1)$a.die();
}

もしかして最初から配置してあるオブジェクトにだけ起きるのかな?・ω・`


こんなの絶対におかしいよ


Re: 終了時エラー 投稿者 : リセッタ(ai126194007208.1.tss.access-internet.ne.jp)
- 2012/09/07(Fri) 13:35 No.13586
 
記事 11996 ですが、自分の環境では正常終了しました。
・tonyuSystem - Ver. 1.24
・Windows XP Ver. 2002 S.P. 3

ただ、11996の場合ですが幾つか気になる点があります。

・“start”クラスが、初めに実行される事を前提に構成されている。
 フレーム(プロジェクト)マネージャの“onStart()”メソッドで定義するべきでは?
・画面サイズの設定前に“$window.sizeable”に“1”を設定していない。

現象が出ないので効果は不明ですが・・・・・・

推薦記事: 11996

.
[直接移動] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120] [121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140] [141] [142] [143] [144] [145] [146] [147] [148] [149] [150] [151] [152] [153] [154] [155] [156] [157] [158] [159] [160] [161] [162] [163] [164] [165] [166] [167] [168] [169] [170] [171] [172] [173] [174] [175] [176] [177] [178] [179] [180] [181] [182] [183] [184] [185] [186] [187] [188] [189] [190] [191] [192] [193] [194] [195] [196] [197] [198] [199] [200] [201] [202] [203] [204] [205] [206] [207] [208] [209] [210] [211] [212] [213] [214] [215] [216] [217] [218] [219] [220] [221] [222] [223] [224] [225] [226] [227] [228] [229] [230] [231] [232] [233] [234] [235] [236] [237] [238] [239] [240] [241] [242] [243] [244] [245] [246] [247] [248] [249] [250] [251] [252] [253] [254] [255] [256] [257] [258] [259] [260] [261] [262] [263] [264] [265] [266] [267] [268] [269] [270] [271] [272] [273] [274] [275] [276] [277] [278] [279] [280] [281] [282] [283] [284] [285] [286] [287] [288] [289] [290] [291] [292] [293] [294] [295] [296] [297] [298] [299] [300] [301] [302] [303] [304] [305] [306] [307] [308] [309] [310] [311] [312] [313] [314] [315] [316] [317] [318] [319] [320] [321] [322] [323] [324] [325] [326] [327] [328] [329] [330] [331] [332] [333] [334] [335] [336] [337] [338] [339] [340] [341] [342] [343] [344] [345] [346] [347] [348] [349] [350] [351] [352] [353] [354] [355] [356] [357] [358] [359] [360] [361] [362] [363] [364] [365] [366] [367] [368] [369] [370] [371] [372] [373] [374] [375] [376] [377] [378] [379] [380] [381] [382] [383] [384] [385] [386] [387] [388] [389] [390] [391] [392] [393] [394] [395] [396] [397] [398] [399] [400] [401] [402] [403] [404] [405] [406] [407] [408] [409] [410] [411] [412] [413] [414] [415] [416] [417] [418] [419] [420] [421] [422] [423] [424] [425] [426] [427] [428] [429] [430] [431] [432] [433] [434] [435] [436] [437] [438] [439] [440] [441] [442] [443] [444] [445] [446] [447] [448] [449] [450] [451] [452] [453] [454] [455] [456] [457] [458] [459] [460] [461] [462] [463] [464] [465] [466] [467] [468] [469] [470] [471] [472] [473] [474] [475] [476] [477] [478] [479] [480] [481] [482] [483] [484] [485] [486] [487] [488] [489] [490] [491] [492] [493] [494] [495] [496] [497] [498] [499] [500] [501] [502] [503] [504] [505] [506] [507] [508] [509] [510] [511] [512] [513] [514] [515] [516] [517] [518] [519] [520] [521] [522] [523] [524] [525] [526] [527] [528] [529] [530] [531] [532] [533] [534] [535] [536] [537] [538] [539] [540] [541] [542] [543] [544] [545] [546] [547] [548] [549] [550] [551] [552] [553] [554] [555] [556] [557] [558] [559] [560] [561] [562] [563] [564] [565] [566] [567] [568] [569] [570] [571] [572] [573]
- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

- Joyful Note -