| 
 | 触手のようなもの
  投稿者 : がり(1-154-93-120.mexne.jp) - 2009/11/20(Fri) 01:55 
  No.12590
 |  | 
 |  | 
 
 | 
 | 数珠繋ぎのようにして作ってみようと思うのですが ---------------------------------
 test
 ---------------------------------
 extends DxChar;
 kobun++;
 m=this;
 appear(new testA(x,y,$pat_testbox+0,m,kobun));
 
 while (1) {
 getX=$Joystick.getX();
 getY=$Joystick.getY();
 
 getY-=32768;
 getX-=32768;
 
 if(getX>30000 || getX<-30000 || getY>30000 || getY<-30000)
 angle=$math.angle(getX,getY);
 
 if(getkey(37)>0) x--;
 if(getkey(39)>0) x++;
 if(getkey(38)>0) y--;
 if(getkey(40)>0) y++;
 
 $Math.roll(x,y-getHeight(p)/2,angle,x,y);
 angle+=a;
 cx=$math.rx;
 cy=$math.ry;
 
 update();
 }
 
 ---------------------------------
 testA
 ---------------------------------
 extends DxChar;
 constructor test(x,y,p,m,kobun) { //m=this;と元のほうで記述、
 super(x,y,p,m,kobun);
 t=m;
 this.kobun=kobun;
 this.kobun++;
 if(kobun<5){
 m=this;
 appear(new testA(x,y,$pat_testbox+0,m,this.kobun));
 }
 }
 while(1) {
 cx=t.cx;
 cy=t.cy;
 x=cx;
 y=cy-getHeight(p)/2;
 $Math.roll(x,y,angle,cx,cy);
 if(angleDiff(angle,t.angle)<0)a+=5;
 if(angleDiff(angle,t.angle)>0)a-=5;
 a=a*0.99;
 angle=a;
 x=$math.rx;
 y=$math.ry;
 update();
 }
 
 とすると、kobun<5の分だけ作られるのですが、
 tやm(要するに作り出す元自体の代入)が上手くいかないばかりか、なぜかスケールが変化します。
 
 コレには回転による加速度とかは考えていないのですが、
 ためしの段階でつまずいています。
 
 解りにくい説明ですが
 実際、触手のように動く物を作るにはどうしたらよいのでしょうか?
 | 
 
 
 | Re: 触手のようなもの
  投稿者 : ロンド(fl1-125-197-70-26.iba.mesh.ad.jp) - 2009/11/20(Fri) 18:12 
  No.12591
 |  | 
 |  | 
 
 
 | ちょっと作ってみました って、触手じゃなくて別の多関節物体を作ってしまった・・(根元も動く) せっかくなので貼っておきます。参考になるかは分かりませんが。
 
 「触手 アルゴリズム」で検索すれば分かると思いますが、かなり複雑な処理になります。
 自分で考えて作ると難しいので、アルゴリズムを理解してから作った方が近道かも知れません。
 ただ、アルゴリズムが理解できなければ諦めるのも選択肢かなと。
 | 
 
 
 | Re: 触手のようなもの
  投稿者 : ロンド(fl1-125-197-70-26.iba.mesh.ad.jp) - 2009/11/20(Fri) 18:14 
  No.12592
 |  | 
 |  | 
 
 
 | これが例の多関節物体です。多分、がりさんのイメージしているのもとは違うと思いますが・・。 DXスプライト型のオブジェクトを新規作成して↓をコピペすれば動きます。
 ★の部分の移動先座標だけ書き換えてください。
 
 extends DxChar;
 
 ALL_RANGE = 160;  // 触手全体の長さ
 JOINT_NUM = 12;	  // 関節の数
 zOrder = -1;
 
 // 関節移動用の配列を生成
 xLog = new Array();
 yLog = new Array();
 aLog = new Array();
 
 // 関節移動用の配列を初期化
 for (i=0; i<=ALL_RANGE; i++){
 xLog.add(x);
 yLog.add(y);
 aLog.add(angle);
 }
 
 // 関節パーツ用配列
 joint = new array();
 
 // 関節パーツ生成
 for(i=0; i<JOINT_NUM; i++) {
 joint.add(appear(new DxChar(x,y,13)));
 joint.get(i).zOrder=i+1;
 }
 
 while(1) {
 
 // 移動先指定
 targetX = $MyChar.x;  // ★ 要修正
 targetY = $MyChar.y;  // ★ 要修正
 
 // 本体(先端)の移動
 aDiff = angleDiff(angle,angle(targetX - x, targetY - y) + 180);
 if(aDiff<0) angle -= 2.3;
 if(aDiff>0) angle += 2.3;
 x += cos(angle) * 1.5;
 y += sin(angle) * 1.5;
 
 // 関節の移動座標更新
 xLog.delete(0);
 yLog.delete(0);
 aLog.delete(0);
 xLog.add(x);
 yLog.add(y);
 aLog.add(angle);
 
 // 関節の移動
 for(i=0; i<joint.size(); i++) {
 joint.get(i).x = xLog.get((ALL_RANGE / joint.size()) * i);
 joint.get(i).y = yLog.get((ALL_RANGE / joint.size()) * i);
 joint.get(i).angle = aLog.get((ALL_RANGE / joint.size()) * i);
 }
 
 update();
 }
 | 
 
 
 | Re: 触手のようなもの
  投稿者 : がり(1-154-93-120.mexne.jp) - 2009/11/21(Sat) 22:12 
  No.12594
 |  | 
 |  | 
 
 
 | ロンドさんありがとうございます。 
 確かにイメージとは違いますが、
 コレを元に色々と試してみたいと思います。
 
 とりあえずは原点から一定距離魔でしか行かないとか・・・
 
 勉強になりました。
 | 
 |