gpt4 book ai didi

c++ - 如何使用离屏 DC 一次渲染所有位图的汇编?

转载 作者:行者123 更新时间:2023-11-28 07:49:50 25 4
gpt4 key购买 nike

这是一些代码:

PAINTSTRUCT ps;
HDC hidden = CreateCompatibleDC(NULL);
HBITMAP hiddenbmp = CreateBitmap(288,288,1,24,NULL);
HBITMAP hiddenold = (HBITMAP)SelectObject(hidden,hiddenbmp);
HDC other = GetDC(NULL);
HDC otherhdc = CreateCompatibleDC(other);
HBITMAP sprites;
if (color)
sprites = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_COLOR_SPRITES));
else sprites = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BLACKWHITE_SPRITES));
HBITMAP otherold = (HBITMAP)SelectObject(otherhdc, sprites);


// Find x and y coordinate for the top left of the visible screen
int x = game.Player_x, y = game.Player_y, ypos = 0;
if (x < 4) x = 4;
if (x > 27) x = 27;
if (y < 4) y = 4;
if (y > 27) y = 27;
if (modx == -100) modx = x; // modx and mody are initialized to -100
else x = modx;
if (mody == -100) mody = y;
else y = mody;
x -= 4;
y -= 4;

// Draw lower layer
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (game.Layer_Two[x + i][y + j] != 0)
{
int xpos = game.get_pos(game.Layer_Two[x + i][y + j], ypos, false);
BitBlt(hidden, (i * 32), (j * 32), 32, 32, otherhdc, xpos, ypos, SRCCOPY);
}
}
}

// Draw upper layer
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if ((game.Layer_Two[x + i][y + j] != 0 && game.Layer_One[x + i][y + j] >= 64 && game.Layer_One[x + i][y + j] <= 111))
{
int xpos = game.get_pos(game.Layer_One[x + i][y + j], ypos, true);
TransparentBlt(hidden, (i * 32), (j * 32), 32, 32, otherhdc, xpos, ypos, 32, 32, RGB(255, 255, 255));
} else {
int xpos = game.get_pos(game.Layer_One[x + i][y + j], ypos, false);
BitBlt(hidden, (i * 32), (j * 32), 32, 32, otherhdc, xpos, ypos, SRCCOPY);
}
}
}

// Draw the compiled image to the main window
HDC hdc = GetDC(hWnd);
BitBlt(hdc, 32, 32, 288, 288, hidden, 0, 0, SRCCOPY);

SelectObject(hidden,hiddenold);
DeleteDC(hidden);
DeleteObject(hiddenbmp);
SelectObject(other,otherold);
DeleteObject(other);
DeleteDC(otherhdc);

ReleaseDC(hWnd, hdc);

这是在一个名为 DrawMap() 的函数中,它 - 您知道什么 - 绘制 map (由 2 层 9 x 9、32 x 32 像素的图 block 组成)。我想做的是在屏幕外(即不可见的)DC 中编译 9 x 9 的图 block ,然后将其全部渲染到主窗口,这样就不可能看到图 block 的实际绘制方式 -从左到右,从上到下。使用此代码,主窗口不会绘制任何内容。

更奇怪的是,我尝试只使用“其他”hdc(不是“隐藏”的 - 尽管我的意图是隐藏“otherhdc”)。我在第 35、48 和 51 行使用“otherhdc”作为源 hdc,“other”作为目标 hdc 使用 BitBlt() 和 TransparentBlt() 函数。然后“其他”被复制到第 56 行的“hdc”(hWnd 的 DC)。这完全按照我想要的方式工作,除了“其他”在屏幕上呈现为 0、0(屏幕,而不是 WINDOW - 就像0, 0 在实际的物理屏幕上)。诡异的。尽管我想这基本上就是我的目标,但不包括“其他”。

我意识到,由于这将被大量使用,为了最大限度地提高效率,不应该在函数中调用 DC 的析构函数等,而应该在应用程序结束时调用(即只调用一次) .我只是将它们包括在内,以便更好地了解该功能。

最佳答案

我想通了!!

我找到了 this这给了我正确的方法。我只使用了一个 hdc,我将其初始化为 GetDC(hWnd),在向其绘制任何内容之前将其设置为透明。然后我将它设置为不透明。简单易行。

关于c++ - 如何使用离屏 DC 一次渲染所有位图的汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14067047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com