目標地点への移動アルゴリズムと左上に集まる原因

このQ&Aのポイント
  • 目標地点への移動アルゴリズムは角度=atan2(目標y-キャラy,目標x-キャラx)、キャラx=cos(角度)*移動速度、キャラy=sin(角度)*移動速度です。
  • しかし、現在のプログラムではキャラクターが左上に集まってしまいます。
  • この原因は特定の要素が欠けていることによるものですが、具体的な原因はわかりません。
回答を見る
  • ベストアンサー

目標地点への移動

void Charcter_Access::Charcter_Move(void){ int i; double radian; int Tx,Ty; for(i=0;i<CNUM;i++){ if(Ch[i].NowNode != Ch[i].GoalNode){ //まだゴールに到達していない if( Ch[i].root.empty() ){ //ルートがまだ決まってない時,ルートを格納 Node.Node_dijkstra(Ch[i].NowNode,Ch[i].GoalNode,&Ch[i].root); Ch[i].RnodeNum=Ch[i].root.size(); } Tx=Node.ReNode_x(Ch[i].RnodeNum); Ty=Node.ReNode_y(Ch[i].RnodeNum); //目標まで移動した時 if( ( sqrt((Tx-Ch[i].x)*(Tx-Ch[i].x)+(Ty-Ch[i].y)*(Ty-Ch[i].y))) < 1.0){ Ch[i].NowNode= Ch[i].root.at(Ch[i].RnodeNum); Ch[i].RnodeNum--; Ch[i].x=Tx; Ch[i].y=Ty; } radian = atan2( (double)Ty-Ch[i].y , (double)Tx-Ch[i].x ); Ch[i].x=cos(radian)*Ch[i].speed; Ch[i].y=sin(radian)*Ch[i].speed; } Tx=Ty=radian=0; } } rootは目標地点へのルートをvector <int>型でルートとなるノードの番号を格納しています。 今は現在地が0番目のノードで目標地点は4番めのノードなっています。 root は[4 , 3 , 2]となっています。現在地の次のノードから目標ノードまでを格納しています。 このプログラムを起動した所全部のキャラクターが左上に集まってしまい、思ったようなプログラムにはなりませんでした。 そこで質問なのですが目標地点へ向かうアルゴリズムは 角度=atan2(目標y-キャラy,目標x-キャラx) キャラx=cos(角度)*移動速度 キャラx=sin(角度)*移動速度 であってますか? もしあっているならばなにが原因で左上に集まるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • honor
  • ベストアンサー率35% (25/71)
回答No.1

>Ch[i].x=cos(radian)*Ch[i].speed; >Ch[i].y=sin(radian)*Ch[i].speed; +=にしないと中心(0,0)で半径Ch[i].speedの円周上しか動けなくなる気がします。

who_ray_sis
質問者

お礼

ありがとうございます。 結構単純なことだったようで・・・すいません。 実装したかった動きになりました!!

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

>角度=atan2(目標y-キャラy,目標x-キャラx) この「角度」というのは、どこを中心としたどこの角度ですか? >キャラx=cos(角度)*移動速度 >キャラy=sin(角度)*移動速度 これは、どこを中心に新キャラx,新キャラyを求めてますか?

関連するQ&A

  • ユニタリ変換に関する質問です

    「線形代数入門/斎藤正彦」のp125に次のような記述がありました。 (一部修正してます) [定義] 「ユニタリ空間VからV自身への計量同型写像をVのユニタリ変換という。」 Vの線形変換Tがベクトルの長さを変えなければ、すなわち、Vの任意の元に対して|Tx|=|x|が成り立つならばTはVのユニタリ変換である。 実際、容易にわかるように、TはVからVへの上への一対一線形変換、すなわち同型写像である。また、 |x+y|^2=|x|^2+(x,y)+(x,y)~+|y|^2 |T(x+y)|^2=|Tx|^2+(Tx,Tx)+(Tx,Tx)~+|Ty|^2 ※(x,y)~は(x,y)の共役な複素数の意です。 今、|Tx|=|x|により (x,y)+(x,y)~=(Tx,Ty)+(Tx,Ty)~ したがって(x,y)と(Tx,Ty)との実数部分は互いに等しい。 一方、xの代わりにix(iは虚数単位)を代入すれば、 i{(x,y)-(x,y)~}=i{(Tx,Ty)-(Tx,Ty)~} により、(x,y)と(Tx,Ty)とは虚数部分も互いに等しい。 すなわち、Tは内積を変えないことがわかる。 この記述に関する質問なのですが TはVからVへの上への一対一線型変換、すなわち同型写像である ということが、安易にわからないのですが・・。 どのようにして単射性と全射性を示すのでしょうか? 以前に、コチラで ​http://oshiete1.goo.ne.jp/qa4831777.html​ 同じような質問をして、納得したつもりですが、 コチラの質問で ​http://oshiete1.goo.ne.jp/qa4840212.html​ どうやらまだ解決してなさそうだと思い、今回質問させていただきました。 どなたか詳しい方がいらっしゃいましたら 回答よろしくお願いしますm(_ _)m ※Vは有限次元です

  • 偏微分の問題です

    f(tx,ty)=t^nf(x,y)の等式を証明する問題なのですが、左辺をtで偏微分する際に{∂f(tx,ty)/∂(tx)}のtx,tyの部分を,改めてx,yとおくらしいのですが、それってx=tx y=ty となっておかしくなってしまう気がするのですが、これであっているのでしょうか?

  • 偏微分

    偏微分の問題です。 f(x,y)をR^2上のC^1級関数とします。また、nを非負整数とし、f(tx,ty)=(t^n)f(x,y)が任意の実数tに対して成り立つとき、x∂f/∂x+y∂f/∂y=nfとなることをしめしたいです。 微分連鎖律より、  ∂f(tx,ty)/∂t=(∂f(tx,ty)/∂x)(∂x/∂t)+(∂f(tx,ty)/∂y)(∂y/∂t)           =x(∂f(tx,ty)/∂x)+y(∂f(tx,ty)/∂y) ここで、f(tx,ty)=(t^n)f(x,y)より  (左辺)=n(t^(n-1))f(x,y)  (右辺)=(t^n){x(∂f(x,y)/∂x)+y(∂f(x,y)/∂y)} となり、最終的に、  (t^n){x(∂f(x,y)/∂x)+y(∂f(x,y)/∂y)}=n(t^(n-1))f(x,y) となり、t^n≠0より、  x∂f(x,y)/∂x+y∂f(x,y)/∂y=n(t^(-1))f(x,y) という形まではいけたのですが、ここからがわかりません。やりかたがおかしいのでしょうか?どなたかご教授ください。よろしくお願いします。

  • 命題「Y⊂X:Txを位相とする位相空間の時、X:Hausdorff⇒Y:Hausdorff」

    『位相空間(X,T)がHausdorff空間 ⇔ X∋∀x,y:相異なる, ∃S1,S2 such that S1∈NS(x,T),S2∈NS(y,T),S1∩S2=φ NS(x,T):={S∈T;x∈S}:近傍系』 という定義の元に 命題 「Y⊂X:Txを位相とする位相空間 の時、 X:Hausdorff⇒Y:Hausdorff」 を示したいのです。 これは厳密に述べると 「XがHaudorff空間をなすならばYも独自の位相Tyを持ち、位相空間(Y,Ty)は 『Y∋∀x,y:相異なる, ∃S1,S2 such that S1∈NS(x,Ty),S2∈NS(y,Ty),S1∩S2=φ NS(x,Ty):={S∈Ty;x∈S}』をなす」 という事ですよね。 で、実際に示してみますと もし、Y=φの時は勿論、Y:Hausdorff Y≠φの時は Y∋∀x1,x2:相異なる ∃S1∈NS(x1,Tx),S2∈NS(x2,Tx) such that S1∩S2=φ S1':=S1/Y,S2':=S2/Yと置くと、S1'∩S2'=φ 、、、とここまでは分かるのですが 更に S1',S2'∈Ty(:集合Yにおける位相) でなければHausdorff空間をなしませんよね。 Tyはどのように定義すればいいのでしょうか?

  • 軌跡(媒介変数)

    tがすべての実数値をとって変わるとき、2直線tx-y+t=0(ⅰ),x+ty-1=0 (ⅱ)の交点Pの軌跡を求めます。 x,yをtであらわしたらとけましたが、 別解としてtを消去する方法が紹介されてました。 (x+1)t=y (ⅰより) (I)x+1≠0 のとき、~ x^2+y^2=1 (II)x+1=0 のとき 0・t=y 実数tが存在することから、y=0 ところが、x=-1,y=0 のとき、0・t-2=0 となり不適 (-1,0)が除かれる点。 しかし、ここで、僕は(ⅱ)から解こうとしていました、 -x+1=ty でyが0のとき 同様にx=1でこれと(ⅰ)よりt(x+1)=0 よってt・2=0 よって、tは条件を満たす。。あれ!??? ひたすら、考えましたがわかりませんでした。 (-1,0)が除かれる点としてでないのです。。 なぜ、yから攻めた場合はちゃんとしたこたえが出ないのでしょう?? y≠0のときは普通に答えがでましたが・・・・ 円すべてになってしまうんです。 ややこしく、なりましたがどなたか教えてください。。 きになって夜も眠れません 笑

  • 連立方程式

    次の連立方程式は、x,yについて解くことができるのでしょうか? tx-(s+2)y=-2y (s-2)x+ty=2s-3 (s-2)^2+t^2=1 〔t^2 はtの2乗です〕

  • 斜方投射の初速度計算

    以下の式1と式2を解いて斜方投射の初速度Vを求めたいと思っています。 式1 x = V*t*cos(θ) - 1/2 * a * t^2 式2 y = V*t*sin(θ) - 1/2 * g * t^2 x:目標地点までの水平方向の距離 y:目標地点までの高さ θ:投射角度 a:x水平方向の加速度 g:重力加速度 t:時間 として、tとV以外が既知(全て定数)のときにVを求めることは出来るのでしょうか。 投射角度と目標地点とx軸方向に働く加速度(定数)が分かれば初速度も一意に定まりそうな気がするのですが、代入法でtを消してもVについて解くことができません。

  • C言語 線形探索

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXBUFFERSIZE 256 struct LinkedListNode{ int data; struct LinkedListNode *next; }; struct LinkedList{ int node_num; struct LinkedListNode *head; }; LinkedList *LinkedListMake(char *filename) { FILE *fp; LinkedList *list; char buffer[MAXBUFFERSIZE]; /* ファイル有無のチェック */ if ((fp = fopen(filename, "r")) == NULL) { fprintf(stderr, "No Such File : %s\n", filename); exit (1); } list = LinkedListAlloc(); if (list == NULL) { /* 領域確保失敗 */ exit (0); /* 終了 */ } while (fgets(buffer, MAXBUFFERSIZE, fp)) { /* ファイル終端に到達するまでループ */ buffer[strlen(buffer) - 1] = '\0'; /* 改行文字を削除 */ LinkedListDataAdd(list, atoi(buffer)); } fclose(fp); return (list); } LinkedList *LinkedListAlloc(void) { LinkedList *list; list = (LinkedList *)malloc(sizeof(LinkedList)); if (list == NULL) { /* 領域確保失敗 */ return (NULL); } list->node_num = 0; list->head = NULL; return (list); } LinkedListNode *LinkedListDataAdd(LinkedList *list, int x) { LinkedListNode *ptr; /* 注目するノードへのポインタ */ LinkedListNode *prev; LinkedListNode *new_node; ptr = list->head; prev = NULL; while (ptr) { /* 終端ノードに到達するまでループ */ if (ptr->data < x) { prev = ptr; /* 直前ノードの更新 */ ptr = ptr->next; /* 注目ノードの更新 */ } else if (ptr->data == x) { /* x は登録済み */ return (NULL); } else { /* x を注目ノードの直前に追加 */ new_node = LinkedListNodeAlloc(); if (new_node == NULL) { /* 領域確保失敗 */ exit (0); /* 終了 */ } new_node->data = x; new_node->next = ptr; /* ポインタの付け替え(注目ノードの直前) */ if (prev != NULL) { /* 連結リストの先頭以降に追加 */ prev->next = new_node; /* ポインタの付け替え */ } else { /* 連結リストの先頭に追加 */ list->head = new_node; } list->node_num++; /* ノード総数の更新 */ return (new_node); } } /* 終端ノードに到達 */ /* x を終端に追加 */ new_node = LinkedListNodeAlloc(); if (new_node == NULL) { /* 領域確保失敗 */ exit (0); /* 終了 */ } new_node->data = x; new_node->next = NULL; /* new_node は新たな終端ノード */ if (prev != NULL) { /* list は少なくともひとつのノードを有している */ prev->next = new_node; /* 更新前の終端ノードの直後が new_node となる */ } else { /* list は空(ノードがひとつも含まれない) */ list->head = new_node; } list->node_num++; /* ノード総数の更新 */ return (new_node); } LinkedList *LinkedListSearch(LinkedList *list, int x)←ここがわかりません★ { for(i = 0; i < node_num)      ??? int main(int argc, char *argv[]) { int a, i, x; printf("xの値を入力"); scanf("%d", &x); LinkedListMake(argv[1]); LinkedListSearch(list, x); 連結リストに格納されたint型データから目的の値を線形探索するプログラムをつくってます。 連結リスト作成関数まではできたので、あと連結リストにおいて目的の値を線形探索する関数LinkedListSearchをつくればだいたい完成だと思うのですが、関数LinkedListSearchの作り方がわかりません。 引数で連結リストのポインタと目的値をとって、目的値が存在すればそのノードのポインタ、存在しない場合はNULLを返すようにするつもりです。 わかる方、是非とも教えてください! お願いいたします。

  • 楕円の軌道に傾斜をつける方法を教えてください

    ActionScriptでボールを楕円に動かすスクリプトを作成しています。 x軸、y軸に平行に動くスクリプトはできるのですが、斜め45度に動くやり方がわかりません。 ↓x軸y軸に平行運動する楕円スクリプト。 //-------------------------------------------- //長軸100、短軸50の楕円形にボールを動かす r = 100;//半径 onClipEvent (enterFrame) { ang += 10; //角度を10ずつ追加 radian = Math.PI/180*ang; //ラジアンに変換(1度=pai割る180で計算) X = Math.cos(radian)*r; //コサイン×半径 でx座標を計算 Y = Math.sin(radian)*r; //サイン×半径 でy座標を計算 this._x = X; //Xを座標に反映 this._y = Y/2; //Yの半分を座標に反映 } //-------------------------------------------- なんとか傾斜した動きを作りたくていろんなサイトを見ましたが、どうしても式がわかりません。 ぜひ教えてもらえませんでしょうか。 どうぞよろしくお願いします。

    • ベストアンサー
    • Flash
  • 計算のやり方をわかりやすく教えて下さい。

    672+168x(←エックス)=168y×3+168z×8 672+21x(←エックス)=21y×6+21z×4 672+6x(←エックス)=6y×8+6z×9 672+tx(←エックス)=ty×14+tz×1 以上の連立方程式のそれぞれx y z tの値を求めたいのですが、計算がややこしくて答えが出せません。どなたかわかりやすく教えていただけませんでしょうか。 ちなみに左辺のxは「エックス」で、右辺のxは「かける」です。

専門家に質問してみよう