É para projetista de níveis ou para o mecanismo?
Para o designer de níveis - você precisará desse código para, por exemplo, combinar objetos estáticos. Pesquise APIs gráficas vetoriais para a solução, a tarefa parece bastante comum para SVG, PostScript, WMF, etc. Primeiro tente usar a API CombineRgn Win32 :-)
Para o mecanismo do jogo - sugiro que você não faça o que deseja. Você gastará uma quantidade enorme de CPU combinando seus objetos. Você gastará uma quantidade enorme de previsões errôneas de ramificações verificando as condições da borda, testando se dois segmentos se cruzam ou não, etc. E esse processo deve ser repetido a cada quadro para a parte visível do seu mapa.
Basta verificar as caixas delimitadoras e colidir objetos individuais. Se as formas do seu objeto forem muito complexas - simplifique-as enquanto exporta dados para o mecanismo e use formas diferentes para colisão e desenho.
Atualização : veja meu código C # GDI + que faz o que você deseja. Você pode escrever facilmente o mesmo em C ++: a classe GraphicsPath é apenas um invólucro fino sobre as funções correspondentes do 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 );
}
}
}