Шаг 35 - Создаем анимацию

Мы с Вами создадим почти анимацию. Почти потому, что объект будет передвигаться с помощью стрелок курсора. Но стоит заменить нажатия на события таймера, как получится анимация. Мы немного поменяем класс DirectDraw, чтобы вся необходимая инициализация проводилась в конструкторе класса. В этом шаге мы напишем код формы, в следующем сам класс. Пока функции класса нужно создавать как пустышки. Итак, приступим.

Visual Basic
Visual C++

Visual Basic

Создаем обычное приложение. И пустой пока класс DirectDraw. Импортируем две картинки. Фон и объект.

35_1.gif (1945 b)

Разбираемся, что нужно от формы. Так как у нас есть класс нужно описать переменную класса. Так как мы будем накладывать изображение нам нужно знать координаты его местонахождения. И еще понадобится одна переменная. Мы будем производить переключение поверхностей. Рисовать нужно на поверхности, которая не видна на экране. Поэтому нужно знать какая поверхность на экране. Заводим переменные:

Dim a As Boolean
Dim x, y As Integer
Dim dr As DirectDraw

При запуске формы задаем начальные значения и создаем объект формы.

Private Sub Form_Load()
	Set dr = New DirectDraw
	x = 0
	y = 0
	a = True
End Sub

При закрытии формы удаляем класс:

Private Sub Form_Terminate()
	Set dr = Nothing
End Sub

Теперь самое интересное, когда будет нажата клавиша, мы будем перемещать объект. Значит, нам нужно реагировать на нажатие стрелок и изменять положения рисунка на фоне.

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyEscape Then End

If KeyCode = vbKeyDown Then
	If y < 480 Then
		y = y + 1
		Moves
	End If
End If

If KeyCode = vbKeyUp Then
	If y > 0 Then
		y = y - 1
		Moves
	End If
End If

If KeyCode = vbKeyRight Then
	If x < 640 Then
		x = x + 1
		Moves
	End If
End If

If KeyCode = vbKeyLeft Then
	If x > 0 Then
		x = x - 1
		Moves
	End If
End If
End Sub

Вы видите неизвестную Moves, это процедура. Смотрим ее.

Private Sub Moves()
If a = False Then
	dr.FonToPrimary
	dr.ChipToPrimary x, y
	dr.Flip
	a = False
Else
	dr.FonToSecond
	dr.ChipToSecond x, y
	dr.Flip
	a = True
End If
End Sub

В зависимости от того, какая сейчас поверхность активна, производится вывод фона и корабля по координатам и в последствии переключение поверхности, естественно изменения переменной.

Visual C++

Создаем обычное приложение на базе диалогового окна. И пустой пока класс DirectDraw. Импортируем две картинки. Фон и объект.

35_2.gif (3465 b)

Разбираемся, что нужно для диалога. Так как у нас есть класс нужно описать переменную класса. Так как мы будем накладывать изображение нам нужно знать координаты его местонахождения. И еще понадобится одна переменная. Мы будет производить переключение поверхностей. Рисовать нужно на поверхности, которая не видна на экране. Поэтому нужно знать какая поверхность на экране. Заводим переменные.

class CMy35Dlg : public CDialog
{
// Construction
public:
	void Moves();
	CDirectDraw* dr;
	int y;
	int x;
	BOOL a;
.............
};

При запуске диалога задаем начальные значения и создаем объект класса.

BOOL CMy35Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	dr = new CDirectDraw();
	x=0;
	y=0;
	a=TRUE;
.............
}

При закрытии диалога удаляем класс.

void CMy35Dlg::OnDestroy() 
{
	delete dr;
	CDialog::OnDestroy();
}

Теперь самое интересное, когда будет нажата клавиша, мы буде перемещать объект. Значит, нам нужно реагировать на нажатие стрелок и вызывать изменять положения рисунка на фоне. Для обработки стрелок нужно удалить все элементы из диалога, и настроить получение сообщений.

UINT CMy35Dlg::OnGetDlgCode() 
{
	return DLGC_WANTARROWS|DLGC_WANTALLKEYS|DLGC_WANTCHARS;
}

Подробнее в разделе MFC.

void CMy35Dlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default


if (nChar==VK_ESCAPE) DestroyWindow();

if (nChar == VK_DOWN)
{
	if  (y < 480) 
	{
		y=y + 1;
		Moves();
	}
}

if  (nChar == VK_UP)
{
	if (y > 0) 
	{
		y = y - 1;
		Moves();
	}
}

if  (nChar == VK_RIGHT)
{
	if (x < 460) 
	{
		x = x + 1;
		Moves();
	}
}

if  (nChar == VK_LEFT)
{
	if (x > 0) 
	{
		x = x - 1;
		Moves();
	}
}
	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

Вы видите неизвестную Moves, это функция. Смотрим ее.

void CMy35Dlg::Moves()
{
	if (a==FALSE){
		dr->FonToPrimary();
		dr->ChipToPrimary(x,y);
		dr->Flip();
		a=FALSE;
	} else {
		dr->FonToSecond();
		dr->ChipToSecond(x,y);
		dr->Flip();
		a=TRUE;
	}
}

В зависимости от того, какая сейчас поверхность активна, производится вывод фона и корабля по координатам и в последствии переключение поверхности, естественно изменения переменной.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 08.05.2002