トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     複雑な図形の当たり判定
投稿するにはまず登録を

フラット表示 前のトピック | 次のトピック
投稿者 スレッド
mnacko
Åê¹ÆNo.14754
投稿日時: 2005-2-3 18:43
新米
居住地:
投稿: 3
使用環境:
複雑な図形の当たり判定
はじめまして。

世界地図上に、それぞれの国が持つデータ数に比例した円を作成する、
というものを作っています。
円はその国(MCにしてある)の中心に表示されます。
中心が海になっている場合もあるのですが、これはとりあえず考えないでおきます。

地図を拡大縮小できるようにしたため、
拡大したときにステージの外に円が作成されることがあり、
その国のステージに表示されている部分の中心に表示させたいのですが、
なかなかうまい方法が見つからないでいます。

思いついたのは小さな正方形のブロックを敷き詰め、
このブロック群のうち、その国と重なっているものだけを配列にして、
その真ん中のブロックと同じ位置に円を作成するという風にしました。


//ヒットガイド(20*20の正方形)の作成
//guide_mcはステージと同じ
function createHitGuide(){
    gw = 20;
    gh = 20;
    g_num_x = Math.ceil(guide_mc._width/gw);
    g_num_y = Math.ceil(guide_mc._height/gh);
    for(i=0;i<g_num_x;i++){
        for(j=0;j<g_num_y;j++){
            hg = guide_base.attachMovie("hit_guide","hit_guide_"+i+"_"+j,i*g_num_y+j);
            hg._x = gw*i;
            hg._y = gh*j;
        }
    }
}



//アイテム数に応じて円を作成
function createCircle(){
    //o_arrayはアイテムの多い国の順に並んでいる("アイテム数","国番号")
    //c_arrayにはguide_mcにヒットした国だけ入れる。
    c_array = new Array();
    for(i=0;i<o_array.length;i++){
        map_num = o_array[i].split(",")[1];
        if(m_array[map_num].hitTest(guide_mc)){
            c_array.push(o_array[i]);
        }
    }

    //largestは全体で最多のアイテム数
    //msは地図の拡大率
    largest = o_array[0].split(",")[0];
    ms = map_mc._xscale;

    //createHitGuide();
    for(m=0;m<c_array.length;m++){
        size = c_array[m].split(",")[0];

        c_number = c_array[m].split(",")[1];
        map = "map_mc.m"+c_number;		
        map_loc = eval(map);

        pre_circle = circle_base.attachMovie("circle", "circle"+c_number,m);
        pre_circle._xscale = pre_circle._yscale = size/largest*ms;
        pre_circle._x = map_mc._x+map_loc._x*ms/100;
        pre_circle._y = map_mc._y+map_loc._y*ms/100;

        //円がguide_mcの外にある場合、その国とヒットガイドブロックとの当たり判定
        if(pre_circle.hitTest(guide_mc)==false){
            hit_array = new Array();
            for(i=0;i<g_num_x;i++){
                for(j=0;j<g_num_y;j++){
                    hg = eval("guide_base.hit_guide_"+i+"_"+j);
                    if(map_loc.hitTest(hg._x,hg._y,true)==true){
                        //hg_loc=[X座標,Y座標,インスタンス名]
                        hg_loc = hg._x+","+hg._y+","+hg;
                        hit_array.push(hg_loc);
                    }
                }
            }
            hit_array.sort(orderSort0);//項目[0]の大きい順に並び替え
            hit_array.sort(orderSort1);//項目[1]の大きい順に並び替え
            hit_mid = Math.round(hit_array.length/2);//配列の真ん中(ちょっとなげやり)
            centering = eval(hit_array[hit_mid].split(",")[2]);
            pre_circle._x = centering._x;
            pre_circle._y = centering._y;
        }
    }
}


うまく説明できているか分かりませんが、
ヒットガイドのブロックの大きさを小さくしていけば、
より厳密な当たり判定になるのでしょうが、その分、処理もかなり重くなります。
guide_mcと国が重なっている領域が分かって、
なおかつ、その中心が求められれば良いのですが、
どなたか、良いアイデアはないでしょうか?
フラット表示 前のトピック | 次のトピック

題名 投稿者 日時
 » 複雑な図形の当たり判定 mnacko 2005-2-3 18:43
     Re: 複雑な図形の当たり判定 sorano 2005-2-3 20:06
       Re: 複雑な図形の当たり判定 mnacko 2005-2-3 22:23
       Re: 複雑な図形の当たり判定 knagai 2005-2-3 22:24
         Re: 複雑な図形の当たり判定 knagai 2005-2-3 22:40
         Re: 複雑な図形の当たり判定 mnacko 2005-2-3 23:39
           Re: 複雑な図形の当たり判定 knagai 2005-2-4 0:18
             Re: 複雑な図形の当たり判定 sorano 2005-2-4 1:19

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops