Если Вам нравятся динамические языки, испытывают Pygame? Плюс я думаю, что можно быть нацелены на OpenGL с этим, также... зависит от того, на что Вы смотрите. XNA Game Studio является большой... или u, хотят посмотреть на некоторое программное обеспечение Mac
На вашем месте я бы придерживался мультипликативно-аддитивных операций в функциях упаковки / распаковки. Примерно так
unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return ((iA * 256 + iR) * 256 + iG) * 256 + iB;
}
с функцией симметричной распаковки
RGBA DWORD2RGBA(unsigned long dwColor)
{
RGBA tmp; /* why did you declare it static??? */
tmp.B = dwColor % 256; dwColor /= 256;
tmp.G = dwColor % 256; dwColor /= 256;
tmp.R = dwColor % 256; dwColor /= 256;
tmp.A = dwColor % 256; /* dwColor /= 256; */
return tmp;
}
Обратите внимание, что во всем коде есть только одна «магическая константа».
Конечно, если у вас есть внешняя спецификация, которая написана в терминах битовых шаблонов в упакованных данных, версия, основанная на битовых операциях и операциях сдвига, может быть предпочтительнее. Тем не менее
unsigned long RGBA2DWORD(int iR, int iG, int iB, int iA)
{
return (((((iA << 8) + iR) << 8) + iG) << 8) + iB;
}
RGBA DWORD2RGBA(unsigned long dwColor)
{
RGBA tmp; /* why did you declare it static??? */
tmp.B = dwColor & 0xFF; dwColor >>= 8;
tmp.G = dwColor & 0xFF; dwColor >>= 8;
tmp.R = dwColor & 0xFF; dwColor >>= 8;
tmp.A = dwColor & 0xFF; /* dwColor >>= 8; */
return tmp;
}
имеет гораздо меньше «магических констант».
Теперь вы можете обернуть повторяющиеся действия / подвыражения в макросы или, лучше, встроенные функции и получить очень компактный и читаемый упаковщик / распаковщик.
Если вы не возражаете использовать целые числа байтового размера для RGBA, вы можете использовать объединение. [ edit Это широко используемый подход, и вы вряд ли найдете компилятор, который его не поддерживает, но, строго говоря (как мне сказали), это незаконный взлом. В большинстве случаев лучший подход - выполнить математическое или двоичное преобразование, но я оставлю эту половину своего ответа на месте, потому что это может помочь читателю понять, что люди делают, когда видят этот тип кода в реальной жизни. world]
union RGBA { DWORD dword; unsigned char RGBA[4]; struct RGBAstruct { unsigned char b; unsigned char g; unsigned char r; unsigned char a; } };
Затем вы можете получить доступ к зеленому компоненту как:
RGBA colour; int green = (int) colour.RGBA[2];
или
int green = (int) colour.RGBAstruct.g;
и получить доступ к значению DWORD как
DWORD value = colour.dword;
. Если вам нужно, чтобы значения RGBA были значениями типа int или вы хотите использовать подход преобразования, тогда вам необходимо использовать побитовые операторы.
Вы кодируете их почти правильно, но вам нужно использовать побитовый оператор OR |, а не логический OR || оператор:
DWORD value = (iA << 24) | (iR << 16) | (iG << 8) | iB;
Чтобы пойти в обратном направлении:
int iA = (value >> 24) & 0xff; int iR = (value >> 16) & 0xff; int iG = (value >> 8) & 0xff; int iB = (value) & 0xff;
Вы можете пойти другим путем, например:
iA = rgb >> 24; iR = (0x00FF0000 & rgb) >> 16; iG = (0x0000FF00 & rgb) >> 8; iB = (0x000000FF & rgb);