小球和窗口边框碰撞的问题。

cryinghawk 2008-12-08 06:39:58
请问各位大虾。。用C++写的
画一个圆形,圆形自由移动。圆形可以和窗口边框碰撞然后反弹。。。。
主要是碰撞反弹的问题。。
麻烦各位解决下。。。。。
O(∩_∩)O


我下课来看贴,,,结贴。。。。。。。。。


先谢谢了。。。。。
...全文
212 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
icesky_ff 2008-12-09
  • 打赏
  • 举报
回复
星羽还是很强悍啊
Felix.Peng 2008-12-08
  • 打赏
  • 举报
回复
楼上的牛人呀!顶一个!
星羽 2008-12-08
  • 打赏
  • 举报
回复
帮你写了个,自己改改吧

win32程序


// win32.cpp : Defines the entry point for the application.
//


#include <windowsx.h>
#include <tchar.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HPEN gPen1;
HPEN gPen2;
HBRUSH gBrush;

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
MSG msg;
WNDCLASSEX wcex;

ZeroMemory(&wcex, sizeof(wcex));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszClassName = TEXT("Win32");

RegisterClassEx(&wcex);

HWND hWnd = CreateWindow(
TEXT("Win32"),
TEXT("Win32"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);

if (!hWnd)
return FALSE;

gPen1 = CreatePen(PS_SOLID, 1, RGB(198, 198, 198));
gPen2 = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
gBrush = CreateSolidBrush(RGB(198, 198, 198));

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

SetTimer(hWnd, 1, 10, NULL);

while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

DeletePen(gPen1);
DeletePen(gPen2);
DeleteBrush(gBrush);

return (int) msg.wParam;
}

long gx = 100;
long gy = 100;
long gSpeedx = 10;
long gSpeedy = 10;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;

switch (message)
{
case WM_PAINT:
{
RECT rectClient;
GetClientRect(hWnd, &rectClient);

hdc = BeginPaint(hWnd, &ps);

SelectBrush(hdc, gBrush);
SelectPen(hdc, gPen1);

Ellipse(hdc, gx, gy, gx + 50, gy + 50);

gx += gSpeedx;
gy += gSpeedy;

if (gx < rectClient.left || gx + 25 > rectClient.right)
{
gSpeedx = -gSpeedx;
break;
}

if (gy < rectClient.top || gy + 25 > rectClient.bottom)
{
gSpeedy = -gSpeedy;
break;
}

SelectPen(hdc, gPen2);
Ellipse(hdc, gx, gy, gx + 50, gy + 50);

EndPaint(hWnd, &ps);
}
break;
case WM_ERASEBKGND :
{
RECT rect;
hdc = (HDC)wParam;
GetClipBox(hdc, &rect);
FillRect(hdc, &rect, gBrush);
return 0;
}
break;
case WM_TIMER :
{
if (wParam == 1)
{
InvalidateRect(hWnd, NULL, FALSE);
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

cryinghawk 2008-12-08
  • 打赏
  • 举报
回复
为什么没人理我呢,,,,,
郁闷啊。。。
shyli 2008-12-08
  • 打赏
  • 举报
回复
设置一个Vx, Vy,表明X和Y轴方向的速度。
碰到左或右边框则Vx=-Vx;
碰到上或下边框则Vy=-Vy;
碰到4个角则Vx=-Vx,Vy=-Vy。
三文鱼也会飞 2008-12-08
  • 打赏
  • 举报
回复
设置好边际,当小球的圆心距离边际一个半径的时候,计算角度,反弹

64,678

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧