Шаг 41 - Реализуем передвижение по матрице

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

Visual Basic
Visual C++

Visual Basic

Мы воспользуемся функцией PaintPicture для рисования на форме. В проекте нам нужна форма, класс в котором логика навигации и картинка в ресурсах.

41_1.gif (3950 b)

На форме элемент Picture для хранения картинки и таймер. При запуске формы создаем объект класса и инициализируем начальные параметры. Только единицы формы (Scale Mode) нужно поставить пиксели (Pixel).

Private Sub Form_Load()
	Set cNavigate = New CPictureNavigate
	cNavigate.countobject = 60
	cNavigate.witch = 64
	cNavigate.height = 64
	cNavigate.countrows = 10
	Picture1.Picture = LoadResPicture(101, vbResBitmap)
	Set pic = Picture1.Picture
End Sub

А при событии таймера будем рисовать следующую картинку.

Private Sub Timer1_Timer()
	Form1.PaintPicture pic, 0, 0, 64, 64, cNavigate.x, _ 
		cNavigate.y, cNavigate.witch, cNavigate.height, vbSrcCopy
	cNavigate.Navigate
End Sub

По нажатию на кнопку Start запускать таймер:

Private Sub Command1_Click()
	Timer1.Interval = 200
	Timer1.Enabled = True
End Sub

В результате у Вас будет вполне приличная анимация. Вот один кадр.

41_2.gif (4707 b)

Полный код в проекте.

Visual C++

Создаем приложение на базе диалогового окна и класс для навигации.

41_3.gif (2817 b)

В ресурсы помещаем картинку.

41_4.gif (2503 b)

В момент запуска диалога производим инициализацию.

BOOL CVCDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	hBMP=LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP1),
		IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
	VERIFY(hBMP!=NULL);

	cNavigate.countobject = 60;
	cNavigate.witch = 64;
	cNavigate.height = 64;
	cNavigate.countrows = 10;

	// Add "About..." menu item to system menu.
	....
}

Включаем обработку события таймера. По нажатию на кнопку запускаем таймер.

void CVCDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	SetTimer(ID_TIMER_1,200,NULL);  
}

А в момент события таймера рисуем кадр:

void CVCDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDC* dc;
	CDC dcTemp;

	dc=GetDC();
	dcTemp.CreateCompatibleDC(dc); 
	dcTemp.SelectObject(hBMP); 
	dc->BitBlt(0 ,0,64,64,&dcTemp,cNavigate.x,cNavigate.y,SRCCOPY);
	cNavigate.Navigate(); 
	CDialog::OnTimer(nIDEvent);
}

В результате у Вас будет вполне приличная анимация. Вот один кадр:

41_5.gif (2153 b)

Полный код в проекте.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 13.05.2002