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 руб./мес


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




 40 - Передвижение по матрице картинок, некоторые тонкости / DirectDraw / Microsoft DirectX

Шаг 40 - Передвижение по матрице картинок, некоторые тонкости

Итак, мы посмотрели, как можно делать последовательности. Все бы хорошо, но вот если мы захотим сделать матрицу объектов, то нам придется двигаться не только вдоль нее, но и опускаться на сроку ниже. Пример такой матрицы есть в шаге "Шаг 38 - Как создают настоящие анимации". Мы сейчас посмотрим, как можно сделать, а в следующем шаге реализуем. Использовать DirectDraw мы пока не будем, а воспользуемся GDI. Итак, у нас 60 объектов 10 объектов в строке и 6 строк. Нам нужно пройтись по всем. Мы можем завести переменную и хранить в ней количество объектов. Скажем, она называется Countobject. Это практически константа и будет она равна 60. Нам нужно будет считать, какой объект текущий. Заведем переменную frame. Можно написать такой псевдокод.

Пока не остановится
повторять
	Если  frame меньше Countobject
            	Frame равно frame плюс 1
            Иначе
           		Frame равно ноль
	Конец если
Конец повтора

Но как мы будем узнавать строку? А тут нам поможет операция получения остатка от деления. Смотрим что будет.

1 поделить на 10 остаток 1
2 поделить на 10 остаток 2
…
10 поделить на 10 остаток 1
11 поделить на 10 остаток 2

Вот первая хитрость меняем наш код:

Пока не остановится
повторять
	Если frame меньше Countobject
		Х равно (остаток от деления Frame на 10) умножим на 64
        Frame равно frame плюс 1
	Иначе
		Frame равно ноль
	Конец если
Конец повтора

И теперь мы будем знать позицию по колонке. А как определить Y. А тут другая хитрость. Мы брали остаток, а теперь будем брать целую часть.

1 поделить на 10 целая часть 0
2 поделить на 10 целая часть 0
...
10 поделить на 10  целая часть 1
11 поделить на 10 целая часть 1
...

Вот и вторая хитрость, чтобы знать колонку нужно брать целую часть. Смотрим код.

Пока не остановится
повторять
	Если  frame меньше Countobject
		Х равно (остаток от деления Frame на 10) умножим на 64
		Y равно (целая часть от деления Frame на 10) умножим на 64
		Frame равно frame плюс 1
	Иначе
		Frame равно ноль
	Конец если
Конец повтора

Вот и все. Пример реализации на конкретном языке ниже:

Visual Basic
Visual C++

Visual Basic

Public Sub Navigate()
If frame < countobject Then
	x = (frame Mod countrows) * 64
	y = Int(frame / countrows) * 64
	frame = frame + 1
Else
frame = 0
End if

Visual C++

void CPictureNavigate::Navigate()
{
	if  (frame < countobject) 
	{
		x = (frame % countrows) * 64;
		y = (frame / countrows) * 64;
		frame = frame + 1;
	} else {
		frame = 0;
	}
}

| |
Автор Каев Артем.
[AD]