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

Тема в разделе "MS Visual C++", создана пользователем RDN_ResidentS, 28 фев 2007.

  1. RDN_ResidentS

    RDN_ResidentS Гость

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

    Код (Text):
    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) и зацикливается переходом вниз-вверх.
    Может гдето запорол.. подскажите.

    Заранее благодарен.
     
  2. grigsoft

    grigsoft Well-Known Member

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

Поделиться этой страницей