これはレベルデザイナー用ですか、それともエンジン用ですか?
レベルデザイナー-静的オブジェクトを組み合わせるなどのコードが必要です。ソリューションのベクターグラフィックAPIを研究すると、タスクはSVG、PostScript、WMFなどでかなり一般的に聞こえます。最初にCombineRgn Win32 APIを使用してみてください:-)
ゲームエンジンの場合-必要なことをしないことをお勧めします。オブジェクトを結合するために大量のCPUを費やすことになります。境界条件をチェックしたり、2つのセグメントが交差するかどうかをテストしたりするなど、膨大な数の分岐予測ミスを費やすことになります。また、このプロセスは、マップの表示部分のフレームごとに繰り返す必要があります。
境界ボックスのチェックを行ってから、個々のオブジェクトを衝突させます。オブジェクトの形状が複雑すぎる場合-エンジンにデータをエクスポートする際にそれらを単純化し、衝突と描画に異なる形状を使用します。
更新:あなたが望むことをする私のC#GDI +コードを見てください。C ++でも同じように簡単に記述できます。GraphicsPathクラスは、対応するgdiplus.dll関数の単なるラッパーです。
static class GraphicsPathExt
{
[DllImport( @"gdiplus.dll" )]
static extern int GdipWindingModeOutline( HandleRef path, IntPtr matrix, float flatness );
static HandleRef getPathHandle( GraphicsPath p )
{
return new HandleRef( p, (IntPtr)p.GetType().GetField( "nativePath", BindingFlags.NonPublic | BindingFlags.Instance ).GetValue( p ) );
}
public static void FlattenPath( this GraphicsPath p )
{
HandleRef h = getPathHandle( p );
int status = GdipWindingModeOutline( h, IntPtr.Zero, 0.25F );
// TODO: see http://msdn.microsoft.com/en-us/library/ms534175(VS.85).aspx and throw a correct exception.
if( 0 != status )
throw new ApplicationException( "GDI+ error " + status.ToString() );
}
}
class Program
{
static void Main( string[] args )
{
PointF[] fig1 =
{
new PointF(-50, 0),
new PointF(0, 50),
new PointF(50, 0),
};
PointF[] fig2 =
{
new PointF(-50, 25),
new PointF(50, 25),
new PointF(0, -25),
};
GraphicsPath path1 = new GraphicsPath();
path1.AddLines( fig1 );
path1.CloseAllFigures();
GraphicsPath path2 = new GraphicsPath();
path2.AddLines( fig2 );
path2.CloseAllFigures();
GraphicsPath combined = new GraphicsPath();
combined.AddPath( path1, true );
combined.AddPath( path2, true );
combined.FlattenPath();
foreach (var p in combined.PathPoints)
{
Console.WriteLine( "<{0}, {1}>", p.X, p.Y );
}
}
}