Winapi Win32应用程序中的冲突处理
在我画了很多圈之后,我想处理一个圈之间的碰撞,但我不知道怎么做。我希望圆圈的颜色是随机的。我使用函数RGB(),但它不起作用。请帮帮我。谢谢 我的代码Winapi Win32应用程序中的冲突处理,winapi,win32gui,Winapi,Win32gui,在我画了很多圈之后,我想处理一个圈之间的碰撞,但我不知道怎么做。我希望圆圈的颜色是随机的。我使用函数RGB(),但它不起作用。请帮帮我。谢谢 我的代码 int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; HBRUSH brush; HBRUSH hBrush; HPEN hPen; static int dX[10] , dY[10] ; static int x[10], y[10], oldX[10], oldY[10]; switch (message
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HBRUSH brush;
HBRUSH hBrush;
HPEN hPen;
static int dX[10] , dY[10] ;
static int x[10], y[10], oldX[10], oldY[10];
switch (message)
{
case WM_CREATE:
SetTimer(hWnd, 1, 3, NULL);
Beep(750, 300);
for (int i = 0; i < 10; i++){
dX[i] = rand() % 15 + 0;
dY[i] = rand() % 15 + 0;
x[i] = rand() % 15 + 0;
y[i] = rand() % 15 + 0;
oldX[i] = x[i];
oldY[i] = y[i];
}
break;
case WM_TIMER:
hdc = GetDC(hWnd);
brush = (HBRUSH)SelectObject(hdc, GetStockObject(WHITE_BRUSH));
RECT temp[10];
RECT rect;
GetClientRect(hWnd, &rect);
brush = (HBRUSH)SelectObject(hdc, GetStockObject(RGB(rand() % 255 + 0, rand() % 255 + 0, rand() % 255 + 0)));
for (int i = 0; i <10; i++){
temp[i].left = oldX[i];
temp[i].top = oldY[i];
temp[i].right = oldX[i] + 30;
temp[i].bottom = oldY[i] + 30;
FillRect(hdc, &temp[i], brush);
Ellipse(hdc, x[i], y[i], 30 + x[i], 30 + y[i]);
oldX[i] = x[i];
oldY[i] = y[i];
x[i] += dX[i];
y[i] += dY[i];
if (x[i] + 30 > rect.right || x[i] < 0)
{
dX[i] = -dX[i];
}
if (y[i] + 30 > rect.bottom || y[i] < 0)
{
dY[i] = -dY[i];
}
}
SelectObject(hdc, brush);
ReleaseDC(hWnd, hdc);
break;
intwmid,wmEvent;
PAINTSTRUCT-ps;
HDC-HDC;
HBRUSH刷;
HBRUSH-HBRUSH;
HPEN-HPEN;
静态int-dX[10],dY[10];
静态整数x[10],y[10],oldX[10],oldY[10];
开关(信息)
{
案例WM_创建:
设置计时器(hWnd,1,3,空);
嘟嘟声(750300);
对于(int i=0;i<10;i++){
dX[i]=rand()%15+0;
dY[i]=rand()%15+0;
x[i]=rand()%15+0;
y[i]=rand()%15+0;
oldX[i]=x[i];
古老的,古老的;
}
打破
案例WM_计时器:
hdc=GetDC(hWnd);
画笔=(HBRUSH)选择对象(hdc,GetStockObject(白色画笔));
直肠温度[10];
RECT-RECT;
GetClientRect(hWnd和rect);
笔刷=(HBRUSH)选择对象(hdc,GetStockObject(RGB(rand()%255+0,rand()%255+0,rand()%255+0));
for(int i=0;i rect.right | | x[i]<0)
{
dX[i]=-dX[i];
}
如果(y[i]+30>矩形底部| | y[i]<0)
{
dY[i]=-dY[i];
}
}
选择对象(hdc、画笔);
释放DC(hWnd、hdc);
打破
我的图片演示在这里
迭代每个圆,比较其中心与其他圆中心之间的距离,如果该距离小于半径之和,则它们发生碰撞。
GetStockObject
采用枚举值(COLOR…
)不是一个RGB
值。@bruce965我不明白,你可以解释更多。@user1793036如何修复它。请帮帮我。我希望颜色是随机的。您正在尝试通过查找具有不同颜色的像素来检测碰撞,但在您的情况下,这不是必需的。假设你有两个球体,你知道它们的大小(半径)和它们在空间中的位置。如果它们重叠,则两者之间的距离小于2*半径,并且当两者之间的距离小于2*半径时,它们重叠。只要在你的申请表中检查一下。你可以在维基百科或任何你喜欢的地方找到2D距离的公式。