レス数:4 / 状態:解決済み / No:64 / ATOM
1
名前:おにごっこ作り隊
日付:2010/09/21(火)23:21:42
ID:wf1IFUhrqkY1
はじめまして。
おにごっこ的なゲームを作りたいと思い、まずは鬼1体、逃げる役3体を作って動き回らせたのですが、よく考えてみるとおには誰を追いかけていいのかわかりません。
ここでタイトル通りの質問、『「最も」近いキャラクターを探すには』どうすればいいのでしょうか。
正確な「鬼と逃げる役の距離」の算出方法はわかりませんが(できれば教えてください)、自分流で「鬼と逃げる役のx座標を大きいほうを小さいほうでひいて(x座標での離れている距離を出し)、y座標も同じくやった後、両方足す」という作業を逃げる人数分繰り返し、それらを比べることで対処しようと思ったのですが、2人までは「逃Aとの距離 < 逃Bとの距離」のとき逃げる役A を追って、3人以上になってくるとしんどいので(個人的には30人くらいが夢…)。
他の質問&コメントを見ていると自分のレベルの低さや無駄に長いような文章が気になりますが、今ほしい回答をまとめると、
「複数のキャラクター(?)の中で座標の値が一番○○(大小や長短)なキャラクターを調べる……テキスト(?)」
です。いろいろ大雑把ですがご理解いただける範囲でかまいませんので、よろしくお願いします。
おにごっこ的なゲームを作りたいと思い、まずは鬼1体、逃げる役3体を作って動き回らせたのですが、よく考えてみるとおには誰を追いかけていいのかわかりません。
ここでタイトル通りの質問、『「最も」近いキャラクターを探すには』どうすればいいのでしょうか。
正確な「鬼と逃げる役の距離」の算出方法はわかりませんが(できれば教えてください)、自分流で「鬼と逃げる役のx座標を大きいほうを小さいほうでひいて(x座標での離れている距離を出し)、y座標も同じくやった後、両方足す」という作業を逃げる人数分繰り返し、それらを比べることで対処しようと思ったのですが、2人までは「逃Aとの距離 < 逃Bとの距離」のとき逃げる役A を追って、3人以上になってくるとしんどいので(個人的には30人くらいが夢…)。
他の質問&コメントを見ていると自分のレベルの低さや無駄に長いような文章が気になりますが、今ほしい回答をまとめると、
「複数のキャラクター(?)の中で座標の値が一番○○(大小や長短)なキャラクターを調べる……テキスト(?)」
です。いろいろ大雑把ですがご理解いただける範囲でかまいませんので、よろしくお願いします。
2
日付:2010/09/21(火)23:51:16
ID:JYJaOjE0NUPu
まず2点間の距離ですが、
自分の座標を (ax , ay) 、相手の座標を (bx , by) とすると
直線距離は以下の式で求まります。
var kyori = Math.sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
後は、鬼と逃げる役30人全員の距離を調べて
一番小さくなる逃げる役を調べます。
// 鬼のオブジェクト ------------
var oni = {x:50,y:50};
// 逃げる役のオブジェクト ------
var i;
var nige = new Array();
for(i=0;i<30;i++){
nige[i] = {x:Math.random() * 100,y:Math.random() * 100};
}
// 一番近い逃げる役を調べる ----
var kyori_min = 999999999;
var target = 0;
for(i=0;i<30;i++){
var kyori = Math.sqrt((oni.x- nige[i].x) * (oni.x- nige[i].x) + (oni.y - nige[i].y) * (oni.y- nige[i].y));
// 距離が小さければ保存
if(kyori_min > kyori){
kyori_min = kyori;
target = i;
}
trace("逃げる役:" + i + " x:" + nige[i].x + " y:" + nige[i].y + " 距離:" + kyori);
}
trace("---結果:" + target + " x:" + nige[target].x + " y:" + nige[target].y + " 距離:" + kyori_min);
自分の座標を (ax , ay) 、相手の座標を (bx , by) とすると
直線距離は以下の式で求まります。
var kyori = Math.sqrt((bx - ax) * (bx - ax) + (by - ay) * (by - ay));
後は、鬼と逃げる役30人全員の距離を調べて
一番小さくなる逃げる役を調べます。
// 鬼のオブジェクト ------------
var oni = {x:50,y:50};
// 逃げる役のオブジェクト ------
var i;
var nige = new Array();
for(i=0;i<30;i++){
nige[i] = {x:Math.random() * 100,y:Math.random() * 100};
}
// 一番近い逃げる役を調べる ----
var kyori_min = 999999999;
var target = 0;
for(i=0;i<30;i++){
var kyori = Math.sqrt((oni.x- nige[i].x) * (oni.x- nige[i].x) + (oni.y - nige[i].y) * (oni.y- nige[i].y));
// 距離が小さければ保存
if(kyori_min > kyori){
kyori_min = kyori;
target = i;
}
trace("逃げる役:" + i + " x:" + nige[i].x + " y:" + nige[i].y + " 距離:" + kyori);
}
trace("---結果:" + target + " x:" + nige[target].x + " y:" + nige[target].y + " 距離:" + kyori_min);
3
名前:おにごっこ作り隊
日付:2010/09/22(水)21:05:48
ID:wf1IFUhrqkY1
ありがとうございます!
とても参考になり、
無事、鬼を動かすことができました。
しかもわかりやすかったので助かりました。
本当にありがとうございました!!
とても参考になり、
無事、鬼を動かすことができました。
しかもわかりやすかったので助かりました。
本当にありがとうございました!!
4
名前:状態変更
日付:2010/09/22(水)21:06:01
ID:wf1IFUhrqkY1
この質問の状態を『解決』に変更しました。
このスレッドについて
質問の状態 : | 解決済み |
投稿開始日 : | 2010/09/21(火)23:21:42 |
投稿終了日 : | 2010/09/22(水)21:06:01 |
投稿者 : | おにごっこ作り隊 |
レス総数 : | 4 |
スレッド番号 : | 64 |