触手のようなもの
投稿者 : がり(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
|
|
|
|
ロンドさんありがとうございます。
確かにイメージとは違いますが、 コレを元に色々と試してみたいと思います。
とりあえずは原点から一定距離魔でしか行かないとか・・・
勉強になりました。
|
|