2016-08-14 4 views
3

現在、私のタイルベースのアイソメトリックエンジン用のタイルエディタを開発中で、現在はオートタイル機能を使っています。タイルベースのエディタのアルゴリズムが必要です

この時点では、マーチングスクエアアルゴリズムに基づいて、ビットマスクを使用して、正しいコーナーアセットを計算してタイルタイプを配置することができました。

私はしばらくの間、特定のタイルタイプをより低いレベルのマッチするタイルタイプで囲みようとしていました。 Starcraftのエディタ(Staredit)が、一致するアセットの低いタイルタイプを自動的に囲む方法を考えてみましょう。高い草がより高い資産高い汚れがどのようにstareditからこの画像の

お知らせ:たとえば

1

私は、それぞれの高さが注文した3つの資産を持っています。アセット3が高い壁を表し、低い資産が低い壁を表すと考えてください。これらの資産はメタデータに配置されます。 0はメタデータ内の空のタイルを表します。

(3,2,1)

最初の3つの資産は、ユーザによって選択された位置にメタデータ内に配置されることになります。

0,0,0,0,0,0,0,0,0 
0,0,0,0,0,0,0,0,0 
0,0,0,0,0,0,0,0,0 
0,0,0,0,3,0,0,0,0 
0,0,0,0,0,0,0,0,0 
0,0,0,0,0,0,0,0,0 
0,0,0,0,0,0,0,0,0 

そして3資産は、最後2資産が1つの資産に囲まれることになる2資産

0,0,0,0,0,0,0,0,0 
0,0,0,0,0,0,0,0,0 
0,0,0,2,2,2,0,0,0 
0,0,0,2,3,2,0,0,0 
0,0,0,2,2,2,0,0,0 
0,0,0,0,0,0,0,0,0 
0,0,0,0,0,0,0,0,0 

に囲まれることになります。最終的な結果は次のようになります。

0,0,0,0,0,0,0,0,0 
0,0,1,1,1,1,1,0,0 
0,0,1,2,2,2,1,0,0 
0,0,1,2,3,2,1,0,0 
0,0,1,2,2,2,1,0,0 
0,0,1,1,1,1,1,0,0 
0,0,0,0,0,0,0,0,0 

このプロセスの後、各メタデータ値の正しいアセット/コーナーを計算するために、オートティリングアルゴリズムが実行されます。

これの別の例は、このHTML5アプリケーションのものです。壁がどのように最高の資産であるのか、草、土、そして最後に水が続きます。各資産は低い資産で囲まれています。 Marching Squares HTML5 Demo

私はフラッドフィルアルゴリズムを調べましたが、達成しようとしているものには当てはまりません。

誰かがこのタスクを達成するためにどのアルゴリズムを使用すべきかについての解答または助言があれば、この質問にお答えください。

私のエンジンに使用している言語はFlash As3です。

答えて

1

この問題は、特定のタイルインデックスの順序で解決しています。私が使用するタイルセットを見てみましょう:

指数もそれぞれ使用される材料のためのタイルの回転/角を決定します。だからインデックスからあなたはどのマテリアルであるか、どのポジション/ローテーションであるかを知っています。この情報は、不足しているコーナー(スムージングエッジ)の自動塗りつぶしに使用されます。参照:

最初のリンクからデモを試してみて、いくつかの地形タイル上の滑らかなエッジボタンで遊ぶ本のよりよい感覚を得るために。

アルゴリズムは、どのコーナーが欠落しているかを検出する必要があるため、少し混乱します。たとえば、地形のための私のコードでは、それはこのようになります滑らか:

int isometric::str_cmp(const AnsiString &a,const AnsiString &b) // wildcard string compare a="01 01" with b="0? 11" for filtering edges in map_random. 
    { 
    int i; char aa,bb; 
    for (i=1;i<=11;i++) 
     { 
     aa=a[i]; 
     bb=b[i]; 
     if ((aa!=bb)&&(aa!=' ')&&(bb!='?')) return 0; 
     } 
    return 1; 
    } 
//--------------------------------------------------------------------------- 
void isometric::str_map_diamond (AnsiString &s,int x,int y,int z) 
    { 
    s="000 000 000"; 
    if (y>0) 
     { 
     if ((x> 0)&&(map[z][y-1][x-1]==16)) s[ 1]='1'; 
     if (   map[z][y-1][x ]==16) s[ 2]='1'; 
     if ((x<gxs-1)&&(map[z][y-1][x+1]==16)) s[ 3]='1'; 
     } 
     if ((x> 0)&&(map[z][y ][x-1]==16)) s[ 5]='1'; 
     if (   map[z][y ][x ]==16) s[ 6]='1'; 
     if ((x<gxs-1)&&(map[z][y ][x+1]==16)) s[ 7]='1'; 
    if (y<gys-1) 
     { 
     if ((x> 0)&&(map[z][y+1][x-1]==16)) s[ 9]='1'; 
     if (   map[z][y+1][x ]==16) s[10]='1'; 
     if ((x<gxs-1)&&(map[z][y+1][x+1]==16)) s[11]='1'; 
     } 
    } 
//--------------------------------------------------------------------------- 
void isometric::str_map_staggered(AnsiString &s,int x,int y,int z) 
    { 
    s="000 000 000"; 
    if ((y> 1)  &&(map[z][y-2][x ]==16)) s[ 1]='1'; 
    if (y>0)                
     {                 
     if (int (y&1)==0){             
     if ((x> 0)&&(map[z][y-1][x-1]==16)) s[ 5]='1'; 
     if    (map[z][y-1][x ]==16) s[ 2]='1';     
     }else{                
     if    (map[z][y-1][x ]==16) s[ 5]='1';     
     if ((x<gxs-1)&&(map[z][y-1][x+1]==16)) s[ 2]='1';     
     }}                 
     if ((x> 0)&&(map[z][y ][x-1]==16)) s[ 9]='1';     
     if    (map[z][y ][x ]==16) s[ 6]='1';     
     if ((x<gxs-1)&&(map[z][y ][x+1]==16)) s[ 3]='1';     
    if (y<gys-1) 
     {                 
     if (int (y&1)==0){             
     if ((x> 0)&&(map[z][y+1][x-1]==16)) s[10]='1';     
     if    (map[z][y+1][x ]==16) s[ 7]='1';     
     }else{                
     if    (map[z][y+1][x ]==16) s[10]='1';     
     if ((x<gxs-1)&&(map[z][y+1][x+1]==16)) s[ 7]='1';     
     }} 
    if ((y<gys-2) &&(map[z][y+2][x ]==16)) s[11]='1'; 
    } 
//--------------------------------------------------------------------------- 
void isometric::map_smooth() 
    { 
    int x,y,z,r; 
    AnsiString s; 
    map_solid(); // do not work properly on hollow surfaces 
    // tile + 8 neighbors -> string "000 000 000" 
    void (__closure *_compute_s)(AnsiString &s,int x,int y,int z)=NULL; 
    if (map_mode==_isometric_map_mode_diamond ) _compute_s=str_map_diamond ; 
    if (map_mode==_isometric_map_mode_staggered) _compute_s=str_map_staggered; 
    if (_compute_s==NULL) return; 
    for (z=gzs-1;z>=0;z--) 
     { 
     // filter out too small holes 
     for (r=1;r;) 
     for (r=0,y=0;y<gys;y++) 
      for (x=0;x<gxs;x++) 
      { 
      _compute_s(s,x,y,z); 
       if (str_cmp(s,"??? 101 ???")) { map[z][y][x]=16; s[6]='1'; r=1; } 
      else if (str_cmp(s,"?1? ?0? ?1?")) { map[z][y][x]=16; s[6]='1'; r=1; } 
      else if (str_cmp(s,"1?? ?0? ??1")) { map[z][y][x]=16; s[6]='1'; r=1; } 
      else if (str_cmp(s,"??1 ?0? 1??")) { map[z][y][x]=16; s[6]='1'; r=1; } 
      } 
     // smooth edges 
     for (y=0;y<gys;y++) 
     for (x=0;x<gxs;x++) 
      { 
      _compute_s(s,x,y,z); 
       if (str_cmp(s,"?1? ?01 ???")) map[z][y][x]= 9; 
      else if (str_cmp(s,"??? ?01 ?1?")) map[z][y][x]=10; 
      else if (str_cmp(s,"??? 10? ?1?")) map[z][y][x]=11; 
      else if (str_cmp(s,"?1? 10? ???")) map[z][y][x]=12; 
      else if (str_cmp(s,"??? ?01 ???")) map[z][y][x]= 5; 
      else if (str_cmp(s,"??? ?0? ?1?")) map[z][y][x]= 6; 
      else if (str_cmp(s,"??? 10? ???")) map[z][y][x]= 7; 
      else if (str_cmp(s,"?1? ?0? ???")) map[z][y][x]= 8; 
      else if (str_cmp(s,"?01 ?00 ???")) map[z][y][x]= 1; 
      else if (str_cmp(s,"??? ?00 ?01")) map[z][y][x]= 2; 
      else if (str_cmp(s,"??? 00? 10?")) map[z][y][x]= 3; 
      else if (str_cmp(s,"10? 00? ???")) map[z][y][x]= 4; 
      } 
     // fill space below slopes to avoid artifacts 
     if (z) 
     for (y=0;y<gys;y++) 
     for (x=0;x<gxs;x++) 
      if (map[z][y][x]>0) 
      map[z-1][y][x]=16; 
     } 
    _redraw=true; 
    } 
//--------------------------------------------------------------------------- 
16は地形レンガで

{ 0,..,11 }は回転しているとレンガに参加。コードは単に0空の位置を意味し、1地形レンガを意味する文字列に加工マップ位置(タイル)の8件の近隣に変換

:ここでよりrefferenceためoldersourceコードは、これをもとにしていたです(16)が存在する。次に、マスクされた比較が適用されて、コーナー/ジョイン・タイルが欠落している各ケースを検出します。

これは、サポートされている素材ごとに同様に行うことができます。

関連する問題