Итак, мы посмотрели, как можно делать последовательности. Все бы хорошо, но вот если мы захотим сделать матрицу объектов, то нам придется двигаться не только вдоль нее, но и опускаться на сроку ниже. Пример такой матрицы есть в шаге "Шаг 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;
}
}