创建一个简单的2D精灵引擎与跨平台,抽象的API演示应该是完全跨平台的,没有平台特定的头部跨平台的代码是完全独立于平台的代码,因为在任何平台独立的文件中没有任何包含平台特定的头部的痕迹。
我有这个任务,但我对如何做一些跨平台的东西感到非常困惑。我已经有一个引擎能够做它必须做的事情,但我需要它是跨平台的。我主要想知道我可以包含哪些东西(或者,我如何知道某些东西是否使用特定于平台的代码),如果我不能包含某些东西,因为它们是特定于平台的,我不知道如何使用不包含它的功能。根据一位同学的说法,解决方案在抽象和Pimpl中,但我找不到它。
发布于 2013-04-06 20:44:24
除了像@ddriver建议的那样,在多平台库之上简单地构建你的2d引擎之外,你还可以为像素颜色分配一个大的缓冲区,并编写代码来渲染你所有的基元(单独的像素,线,框,圆,椭圆,圆弧,纹理/位图/图像,文本字符)。一旦你在这个缓冲区中完成了帧的渲染,你就可以调用那里的任何库来在屏幕或窗口中将这个缓冲区显示为图像。或者,如果您的代码运行在没有任何支持库的裸硬件上,您可以简单地将此缓冲区复制到显卡的视频缓冲区中。
您的API可能如下所示:
typedef struct
{
unsigned BitsPerPixel; // 8,16,32
unsigned ColorScheme; // something that tells the order of the R, G and B components and how many bits are in each or if there's a palette used instead of RGB
unsigned Width; // in pixels
unsigned Height; // in pixels
size_t Size; // buffer size in bytes
void* Buf; // pointer to the beginning of the buffer itself
// extra info
} tBuffer;
int BufferInit(tBuffer* Buf, unsigned BitsPerPixel, unsigned ColorScheme, unsigned Width, unsigned Height)
{
Buf->BitsPerPixel = BitsPerPixel;
Buf->ColorScheme = ColorScheme;
Buf->Width = Width;
Buf->Height = Height;
Buf->Size = Buf->Width * Buf->Height * Buf->BitsPerPixel / 8;
Buf->Buf = malloc(Buf->Size);
if (Buf->Buf != NULL)
{
memset(Buf->Buf, 0, Buf->Size);
return 1;
}
return 0;
}
void BufferDone(tBuffer* Buf)
{
free(Buf->Buf);
Buf->Buf = NULL;
}
unsigned FindClosest8BitPaletteIndex(unsigned R, unsigned G, unsigned B)
{
// find the palette element that's closest to the given R, G and B
// and return its index
}
unsigned BufferRgbToColor(tBuffer* Buf, unsigned R, unsigned G, unsigned B)
{
switch (Buf->BitsPerPixel)
{
case 8:
return FindClosest8BitPaletteIndex(R, G, B);
case 16:
return ((R & 0x1F) << 11) | ((G & 0x3F) << 6) | (B & 0x1F); // 5-6-5
case 32:
return ((R & 0xFF) << 16) | ((G & 0xFF) << 8) | (B & 0xFF); // (8)-8-8-8
default:
return 0; // error
}
}
void BufferSetPixel(tBuffer* Buf, unsigned X, unsigned Y, unsigned Color)
{
switch (Buf->BitsPerPixel)
{
case 8:
*((unsigned char*)Buf->Buf + Buf->Width * Y + X) = Color;
break;
case 16:
*((unsigned short*)Buf->Buf + Buf->Width * Y + X) = Color;
break;
case 32:
*((unsigned*)Buf->Buf + Buf->Width * Y + X) = Color;
break;
}
}然后你可以像这样使用它:
tBuffer buf;
if (BufferInit(&buf, 32, 0, 1024, 768))
{
BufferSetPixel(&buf, 512, 384, BufferRgbToColor(&buf, 0xFF, 0xFF, 0xFF));
// make the contents of buf.Buf visible in some way
BufferDone(&buf);
}这应该会给你一些想法。
发布于 2013-04-06 18:56:25
好吧,如果你想要一个独立于平台的引擎,那么你需要一个可移植的库。
首先,也是最重要的是Qt,它本身提供了OpenGL图形的抽象(仅仅在几个不同的平台上打开OpenGL上下文可能是底层领域的主要痛苦,但Qt使其可移植,灵活,并且只需几行代码)。它还具有QML,这是一种开发速度更快的声明性语言。有许多围绕Qt构建的2d和3d引擎(查看V-Play)。使用QtQuick2,您可以获得硬件加速的图形。甚至可以在运行时期间在2d对象上键入run fragment和vector shaders。
然后还有像Allegro和SDL这样的库--它们是相当可移植的,尽管对移动平台的支持还处于相当原始的阶段。这些库本身比Qt要基础得多。两者都支持OpenGL,但它们自己的图形功能微不足道。
还有JUCE,它提供了一些图形功能,尽管你几乎必须依赖于原始的OpenGL,但没有高级抽象。
然后是像MoSync或Marmalade这样的库,它们专注于移动平台,而桌面支持似乎不存在,所以可能不是一个很好的选择。
我开始使用Qt的原因是,到目前为止,它是最强大、最灵活、与所有替代方案无关的平台。更不用说有很多书,大量的教程,非常详细的文档和一个重要的社区。这是我经常使用和推荐的。你甚至可以用它免费开发商业应用程序,唯一的条件是你可以动态链接。
https://stackoverflow.com/questions/15849921
复制相似问题