
ダンジョンですが、廊下をつなげる方法を、今までは、一つ前に作った部屋と2つ前に作った部屋につないでいましたが、領域分割の状況によっては、かなり離れた部屋に廊下をつなげてしまう場合があったので、
以下のようにリストを調べて、一番近い部屋に廊下をつなげるようにしました。
void connectRoom(int x1,int y1,int x2,int y2 ,int depth)
{
Vector2 pos0 = new Vector2( (x1+x2)/2 , (y1+y2)/2 );
float min=99999f;
int target=0;
for(int i=0;i<RoomList.Count-1;i++)
{
if(RoomList[i]==null) continue;
prex1=RoomList[i].x1;
prey1=RoomList[i].y1;
prex2=RoomList[i].x2;
prey2=RoomList[i].y2;
Vector2 pos =new Vector2( (prex1+prex2)/2 , (prey1+prey2)/2 );
float dis = Vector2.Distance( pos0,pos);
if(min > dis ) { target=i;min=dis; }
}
if( RoomList[target]==null ) return;;
prex1=RoomList[target].x1;
prey1=RoomList[target].y1;
prex2=RoomList[target].x2;
prey2=RoomList[target].y2;
int pcx=(prex1+prex2)/2;
int pcy=(prey1+prey2)/2;
int cx=(x1+x2)/2;
int cy=(y1+y2)/2;
if(prex2<x1)
{
if( pcy<=cy )
makeRoadH(prex2,pcy,x1,cy,1,1);
else
makeRoadH(prex2,pcy,x1,cy,1,-1);
}
else if(x2<prex1)
{
if( pcy<=cy )
makeRoadH(prex2,pcy,x1,cy,-1,1);
else
makeRoadH(prex2,pcy,x1,cy,-1,-1);
}
else if( prey2<y1 )
{
if( pcx<=cx )
makeRoadV( pcx,prey2,cx,y2,1,1);
else
makeRoadV( pcx,prey2,cx,y2,-1,1);
}
else if(y2<prey1)
{
if( pcx<=cx )
makeRoadV( pcx,prey2,cx,y2,1,-1);
else
makeRoadV( pcx,prey2,cx,y2,-1,-1);
}
}これでtarget要素が一番近い部屋です(部屋の中心と中心の距離で調べています)
(自分の部屋はRoomList.Count-1なので)
例えば、プレイヤー初期位置から、ある部屋までの距離が遠いほど、より強いモンスターを配置したり、より良い財宝を置けば、自動的な難易度設定として望ましいと思います。
でも、なんかLSIの自動配線みたいだな(^_^;)