Плавное перемещение юнита по матрице. - Игростроение и развлечение

Форма входа

Приветствую Вас Гость!

Логин:
Пароль:

Наш опрос

Зачем нужны парни?
Всего ответов: 44


    Случайное фото

    Статистика


Поддержите наш проект

WebMoney:
R309699065243
U292079291240
Z373355457648

Счётчики


Rambler's Top100
Рейтинг@Mail.ru

Плавное перемещение юнита по матрице. - Игростроение и развлечение

[ Новые сообщения · Участники · Правила форума · RSS ]

WWW Site Forum
Страница 1 из 11
Игростроение и развлечение » Программинг » Алгоритмика, Математика, Физика » Плавное перемещение юнита по матрице. (как я это реализовывал)
Плавное перемещение юнита по матрице.
quadrathellДата: Понедельник, 11.11.2013, 16:44 | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 1018
Репутация: 23
Статус: Offline
Такой способ у меня был реализован в игре Новогодний хоровод и Магический квадрат
Я не буду описывать операции на языке программирования, напишу сам принцип словами чтобы было понятно любому программисту.

У нас есть массив в котором указаны объекты на игровом поле:

К примеру Dim unit(0,5); массив для примера и состоит из одного объекта, в игре их может быть сколько угодно.

unit(0,0) = наличие объекта на поле (0 - удалён, 1 - присутствует)
unit(0,1) = тип объекта (0 - фон, 1 - персонаж, 2 - стена.. и.т.д.)
unit(0,2) = координата объекта по х
unit(0,3) = координата объекта по у
unit(0,4) = направление объекта (0 - стоп, 1 - влево, 2 - вправо, 3 - вверх, 4 вниз)
unit(0,5) = счётчик смещения направления.

У нас так же имеется матрица к примеру 10 х 10 клеток, размер клетки 16 х 16 пикселов.

Устанавливаем объект в матрицу:

unit(0,0) = 1 ; наличие объекта на поле
unit(0,1) = 1 ; тип объекта - персонаж
unit(0,2) = 64 ; координата х
unit(0,3) = 80 ; координата у
unit(0,4) = 0 ; направление объекта "стоп"
unit(0,5) = 0 ; счётчик в нуле.



Ниже приведённый код обрабатывается в цикле:

Описываем опрос клавиатуры:


Если нажата клавиша влево и unit(0,4) при этом = 0
то
unit(0,4) = 1; устанавливаем направление влево
unit(0,5) = 16; Устанавливаем счётчик 16


Если нажата клавиша вправо и unit(0,4) при этом = 0
то
unit(0,4) = 2; устанавливаем направление вправо
unit(0,5) = 16; Устанавливаем счётчик 16


Если нажата клавиша вверх и unit(0,4) при этом = 0
то
unit(0,4) = 3; устанавливаем направление вверх
unit(0,5) = 16; Устанавливаем счётчик 16


Если нажата клавиша вниз и unit(0,4) при этом = 0
то
unit(0,4) = 4; устанавливаем направление вниз
unit(0,5) = 16; Устанавливаем счётчик 16


Обрабатываем полученные данные:

Если unit(0,4) = 1
то unit(0,3) = unit(0,3) - 1; сдвигаем объект на пиксел влево
и unit(0,5) = unit(0,5) - 1; уменьшаем счётчик на 1
Если unit(0,5) = 0; счётчик = 0
то unit(0,4) = 0; останавливаем объект


Если unit(0,4) = 2
то unit(0,3) = unit(0,3) + 1; сдвигаем объект на пиксел вправо
и unit(0,5) = unit(0,5) - 1; уменьшаем счётчик на 1
Если unit(0,5) = 0; счётчик = 0
то unit(0,4) = 0; останавливаем объект


Если unit(0,4) = 3
то unit(0,2) = unit(0,2) - 1; сдвигаем объект на пиксел вверх
и unit(0,5) = unit(0,5) - 1; уменьшаем счётчик на 1
Если unit(0,5) = 0; счётчик = 0
то unit(0,4) = 0; останавливаем объект


Если unit(0,4) = 4
то unit(0,2) = unit(0,2) + 1; сдвигаем объект на пиксел вниз
и unit(0,5) = unit(0,5) - 1; уменьшаем счётчик на 1
Если unit(0,5) = 0; счётчик = 0
то unit(0,4) = 0; останавливаем объект


Что у нас получается?
При нажатии клавиши, объект сместится в нужное направление на 16 пикселов и остановится, причём пока объект перемещается управление им будет недоступно.

Этот способ можно применить так же для автоматического перемещения без клавиатуры, программа посылает код направления и объект будет послушно перемещаться по матрице.
Прикрепления: 6992963.jpg(11Kb)


 
quadrathellДата: Понедельник, 11.11.2013, 17:17 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 1018
Репутация: 23
Статус: Offline
Проверка на столкновение не используя map массив

Делается это просто, путём коллизии объекта.

Перед тем как переместить объект в указанное направление, мы бросаем проверочный объект в нужное нам направление.
Например мы хотим сместиться вправо. Если проверочный объект совершил коллизию с другим объектом, то обнуляем unit(0,4) = 0 в режим "стоп"
Если коллизии не произошло или была коллизия с прозрачным или проходимым объектом, то даём добро и присваиваем unit(0,4) нужное действие.

Так же, если эта игра платформенная и предусмотрен пол под нонами, то в цикле делаем проверку проверочным объектом под героя и если коллизии не было - независимо от нажатой клавиши, присваиваем unit(0,4) = 4 код смещения вниз и до тех пор пока не появится коллизия.

Прикрепления: 5073668.jpg(12Kb)


 
quadrathellДата: Понедельник, 11.11.2013, 21:04 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 1018
Репутация: 23
Статус: Offline
Для тех кто не понял что такое массив, объясняю простым языком.
При создании массива, мы организуем участок памяти под хранения данных (числа или текст) всё зависит от организации массива.
Массивы бывают простыми, двумерными и трёхмерными.

Так можно представить простой массив:
Dim unit(5)
или
Array unit(5)



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

Объявляем новый массив:
Dim unit(3, 5)
или
Array unit(3, 5)

получается матрица из 4 рядов и в каждом ряду по 6 шкафчиков.
потому как в программировании нулевая ячейка тоже считается.


Для того чтобы положить в шкафчик информацию, мы указываем координату:
В ячейку unit(2, 4) = 36; кладём число 36
Чтобы достать число из ячейки, достаточно присвоить переменной координату массива
Например:
a = unit(2, 4)
Print a; напечатать переменную а на экране, результат будет 36

Трёхмерный массив будет выглядеть как двумерный, только в каждом ящике будут храниться дополнительные ячейки:



Выглядит это так:
Dim unit(4, 6, 10)

То есть, у нас есть шкаф из 5 рядов и в каждом ряду по 7 шкафчиков, а в каждом шкафчике по 11 ячеек... в которые мы и будем складывать информацию.

Записываем число 49 в массив, к примеру unit(2, 4, 3) = 49
В третем ряду в пятом шкафчике, в четвёртой ячейке, хранится число 49

Есть вопросы? Спрашивайте B)
Прикрепления: 5642109.jpg(14Kb) · 7014944.jpg(10Kb) · 7696618.jpg(15Kb)


 
mobipakДата: Понедельник, 25.11.2013, 13:13 | Сообщение # 4
Construct
Группа: Проверенные
Сообщений: 6
Репутация: 2
Статус: Offline
такое чувство, что это слишком громодзко. Лучше использовать отдельные переменные, массив не слишком подходит для этой цели.
 
quadrathellДата: Понедельник, 25.11.2013, 14:49 | Сообщение # 5
Admin
Группа: Администраторы
Сообщений: 1018
Репутация: 23
Статус: Offline
Цитата mobipak ()
такое чувство, что это слишком громодзко. Лучше использовать отдельные переменные, массив не слишком подходит для этой цели.


Ну к примеру у тебя игровое поле 20 х 20 клеток и каждая клетка имеет 15 свойств.
Dim array(399, 14)
20 * 20 = 400 * 15 = 6000 переменных. %)
У меня фантазии не хватит столько переменных создать.
А из массива это удобно. Вытягиваем содержимое указывая всего лишь координату ячейки.
И к тому же можно автоматизировать, например.

For i = 0 to 399
For y = 0 to 14
print array(i, y)
Next y
Next i

Распечатает на экране весь массив.


 
Игростроение и развлечение » Программинг » Алгоритмика, Математика, Физика » Плавное перемещение юнита по матрице. (как я это реализовывал)
Страница 1 из 11
Поиск: