函数编写】 棋子位图的原始像素放在全局数组unsigned char *g_pRawChessBmpBits中, 棋盘位图的原始像素放在全局数组unsigned char *g_pRawBoardBmpBits中, 函数的功能是,利用这两个原始像素数组,根据参数传下来的尺寸、坐标和透明度,计算新的半透明效果的玻璃棋子位图的像素值,并放在第一个参数指定的数组中。(不得修改两个全局数组) */ //--------------------------------------------------------------------------------------------------------------------------------------------------------- void ModifyChessBmp( unsigned char *pPixel, //将修改后的像素RGB值放在这个数组中 int iChessBmpWidth, //棋子位图的宽度(以像素为单位) int iChessBmpHeight, //棋子位图的高度(以像素为单位) int iBoardBmpWidth, //棋盘位图的宽度(以像素为单位) int iDrawingX, //棋子位图被贴到棋盘位图的X坐标(水平向右为正向)(以像素为单位) int iDrawingY, //棋子位图被贴到棋盘位图的Y坐标(垂直向下为正向)(以像素为单位) float fTransparency //透明度,值为0.0-1.0 ) { }
时间: 2023-08-15 07:36:29 浏览: 132
C语言编程-编写函数fun求1!+2!+3!+ …… +n!的和,在main函数中由键盘输入n值,并输出运算结果;
5星 · 资源好评率100%
以下是一种可能的实现方式:
```
void ModifyChessBmp(unsigned char *pPixel, int iChessBmpWidth, int iChessBmpHeight, int iBoardBmpWidth, int iDrawingX, int iDrawingY, float fTransparency)
{
// 计算棋子在棋盘上的实际位置
int iChessX = iDrawingX;
int iChessY = iDrawingY;
// 遍历棋子位图的每个像素
for (int i = 0; i < iChessBmpWidth * iChessBmpHeight; i++) {
// 计算当前像素在棋子位图中的坐标
int x = i % iChessBmpWidth;
int y = i / iChessBmpWidth;
// 计算当前像素在棋盘位图中的坐标
int boardX = iChessX + x;
int boardY = iChessY + y;
// 计算当前像素在全局数组中的偏移量
int offset = 3 * (boardY * iBoardBmpWidth + boardX);
// 计算新的半透明像素值
unsigned char r = g_pRawChessBmpBits[3 * i];
unsigned char g = g_pRawChessBmpBits[3 * i + 1];
unsigned char b = g_pRawChessBmpBits[3 * i + 2];
unsigned char boardR = g_pRawBoardBmpBits[offset];
unsigned char boardG = g_pRawBoardBmpBits[offset + 1];
unsigned char boardB = g_pRawBoardBmpBits[offset + 2];
r = fTransparency * r + (1 - fTransparency) * boardR;
g = fTransparency * g + (1 - fTransparency) * boardG;
b = fTransparency * b + (1 - fTransparency) * boardB;
// 存储新的像素值到指定的数组中
pPixel[3 * i] = r;
pPixel[3 * i + 1] = g;
pPixel[3 * i + 2] = b;
}
}
```
这个函数首先计算出棋子在棋盘上的实际位置,然后遍历棋子位图的每个像素。对于每个像素,它先计算出在棋盘位图中的坐标,然后根据透明度和棋盘位图的像素值计算出新的半透明像素值,最后将其存储在指定的数组中。注意,这个函数并没有修改全局数组中的像素值,而是在函数内部进行计算后直接存储到指定的数组中。
阅读全文