C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 16. Оживляем шарики / Lines / Примеры разработки

Игра Lines (Visual C++. MFC)
Урок 16. Оживляем шарики

В этом уроке мы с вами слегка оживим нашу игру, а именно сделаем так, чтобы при щелчке на шарике он начал пульсировать.

Для начала добавьте в папку res нашего проекта еще 7 файлов (red1.bmp, rose1.bmp, green1.bmp, blue1.bmp, brown1.bmp, yellow1.bmp и black1.bmp). Размеры эти картинок - 24 на 24. На картинках изобразите, скажем, уменьшенные копии шариков соответствующих цветов. Наши новые картинки будут меняться местами с соответствующими оригинальными по таймеру, в результате чего и будет казаться, что наши шарики пульсируют. После добавления файлов с рисунками в папку res вызовите контекстное меню для пункта bitmap вкладки ResourceView, в котором выберите пункт Import:

Импорт картинок

В появившемся диалоге Import Resource в Files of Type укажите все типы файлов, выделите необходимые файлы и нажмите на кнопку Import:

Импорт картинок

Измените идентификаторы картинок на IDB_BLACK1, IDB_BLUE1 и т. д.:

Вкладка ResourceView

Теперь начинаем вносить изменения и дополнения в наш код.

Во-первых, добавьте в класс вида три переменные:

class CLinesView : public CView
{
    ...
public:
    ...
    int m_iBallSize; //Текущий размер шарика (0 или 1)
    int x0, y0; //кординаты текущего выбранного шарика
    ...

Переменной m_iBallSize задаем начальное значение в конструкторе:

CLinesView::CLinesView() { ... m_iBallSize=1; }

Переменные x0 и y0 мы уже завели ранее в методе OnLButtonUp. Теперь мы их перетащили в переменные класса, так как они понадобятся нам еще и в других методах. В методе же OnLButtonUp их надо убрать:

void CLinesView::OnLButtonUp(UINT nFlags, CPoint point) 
{
    ...
    static int x0; //эти две строчки удаляем
    static int y0;
    ...

Далее добавляем в класс CLinesView обработчик для сообщения WM_TIMER. В его заготовке для кода пишем следующие строки:

void CLinesView::OnTimer(UINT nIDEvent) 
{
    // TODO: Add your message handler code here and/or call default
    if(m_iBallSize==0){
        m_iBallSize=1;
    }
    else{
        m_iBallSize=0;
    }
    InvalidateRect(CRect(24*x0,24*y0,24*(x0+1),24*(y0+1)), FALSE);
    MessageBeep(0xFFFFFFFF);
    CView::OnTimer(nIDEvent);
}

В этом обработчике мы просто изменяем значение переменной m_iBallSize на другое и издаем звуковой сигнал.

Далее измените метод OnDraw следующим образом:

void CLinesView::OnDraw(CDC* pDC)
{
            ...
            switch(pDoc->m_field[i][j]){
            case 1:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_BLACK1);
                else
                    bitmap.LoadBitmap(IDB_BLACK);
                break;
            case 2:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_BLUE1);
                else
                    bitmap.LoadBitmap(IDB_BLUE);
                break;
            case 3:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_BROWN1);
                else
                    bitmap.LoadBitmap(IDB_BROWN);
                break;
            case 4:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_GREEN1);
                else
                    bitmap.LoadBitmap(IDB_GREEN);
                break;
            case 5:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_RED1);
                else
                    bitmap.LoadBitmap(IDB_RED);
                break;
            case 6:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_ROSE1);
                else
                    bitmap.LoadBitmap(IDB_ROSE);
                break;
            case 7:
                if(m_iBallSize==1 && i==x0 && j==y0)
                    bitmap.LoadBitmap(IDB_YELLOW1);
                else
                    bitmap.LoadBitmap(IDB_YELLOW);
                break;
            default:
                bitmap.LoadBitmap(IDB_NO_COLOR);
                break;
            }
            ...
        }
    }
}

Далее внесите в метод OnLButtonUp класса CLinesView следующие изменения:

void CLinesView::OnLButtonUp(UINT nFlags, CPoint point) 
{       ...
        x0=x;//запоминем выбраный шарик
        y0=y;
        SetTimer(1,370,0);
    }
    else{//т. е. щелкаем не на шарике
        if(bMove){//если шарик выбран
            if(pDoc->IsPath(x0, y0, x, y)){
                KillTimer(1);
                pDoc->MoveBall(x0, y0, x, y);
        ...
    }

Теперь можно нашу программу в очередной раз запускать. При щелчке на любом шарике он будет пульсировать и издавать звук.