• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Игра Арканоид

  • Автор темы RDN_ResidentS
  • Дата начала
R

RDN_ResidentS

Народ! Тут такая проблема, тоже связанная с игрой арканоид...
Начинаю писать игру, и появилась одна загвоздка.
Вот текст

Код:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;


HBRUSH hBrush, hOldBrush;
HRGN RoundBall;
BOOL Down = false;
BOOL Up = false;
POINT point[2] = {{20, 20},{60, 60}};
RECT RoundBallRect = {point[0].x, point[0].y, point[1].x, point[1].y};
RECT RectangleField = {20, 20, 350, 450};



switch (message)
{
case WM_COMMAND:
wmId	= LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case IDC_BUTTON1:
SetTimer(hWnd, 1, 250, NULL);
break;
case IDC_BUTTON2:
KillTimer(hWnd, 1);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);

hBrush = CreateSolidBrush(RGB(255, 200, 255));
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

Rectangle(hdc, 20, 20, 350, 450);
SelectObject(hdc,hOldBrush);
DeleteObject(hBrush);

hBrush = CreateHatchBrush(HS_DIAGCROSS,RGB(0, 255, 128));
hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

RoundBall = CreateEllipticRgnIndirect(&RoundBallRect);
FillRgn(hdc, RoundBall, hBrush);
SelectObject(hdc,hOldBrush);
DeleteObject(hBrush);

EndPaint(hWnd, &ps);
break;
case WM_TIMER:

if (Down)
{
Down = true;
}

else
{

while (Down);
{
if (RoundBallRect.top == 100)
{
Down = true;
Up = false;
}

else
{
RoundBallRect.top+=10;
RoundBallRect.bottom+=10;
Up = true;
}
}
}
if (Up)
{
Up = true;
}

else
{
while (Up);
{
if (RoundBallRect.bottom == 20)
{
Up = true;
Down = false;
}
else
{
RoundBallRect.top-=10;
RoundBallRect.bottom-=10;
Down = true;
//Up = false;
}
}
}


InvalidateRect(hWnd, &RoundBallRect, TRUE);
InvalidateRect(hWnd, &RectangleField, TRUE);
break;
Шарик двигается вниз, доходит до RoundBallRect.top == 100 , потом поднимается вверх на один шаг (RoundBallRect.top == 90) и зацикливается переходом вниз-вверх.
Может гдето запорол.. подскажите.

Заранее благодарен.
 
G

grigsoft

Код рулит.
Код:
if (Down)
{
Down = true;
}
else
{
while (Down);
Совет - не надо тебе 2 переменные отвечающие за направление: шарик летит либо вверх, либо вниз, вот и оставь только bDown. И перепиши функцию таймера думая о том что тебе надо делать. Она выполняет одну(!) итерацию - так что цикл там не нужен. Блок-схему, что-ли, нарисуй.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!