Среда, 23.05.2018, 17:34
Приветствую Вас Посетитель

Форма входа
Меню сайта
Категории раздела
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » MidletPascal » Примеры и обучение

Создание РПГ. Часть 2 - ландшафт.
И так, немного теории:

У нас имеется 2 изображения: земля и трава.
Сделаем для них одномерный массив (land_image:array [1..2] of image) размером 2.
Загружаем в него картинки (я очень надеюсь что вы умеете это делать). Пусть трава будет под индексом (номером) 1, а земля - под номером 2. С изображениями разобрались

Теперь нужно сделать двумерный числовой массив, который указывает, что рисовать - траву или землю. То есть единица указывает на то, что надо рисовать траву, а двойка - что землю. (честно говоря, никто не мешает вам сделать хоть 100 вариаций ландшафта, не ограничиваясь травой и землёй. Но для пущей простоты возьмем два).
Обзовем его land_array:array [1..30,1..30] of integer;

Заполним массив индекса ландшафта случайными числами (если не хотите вбивать их вручную). Делаем так:
For i:=1 to 30 do
For j:=1 to 30 do
land_array[i,j]:=random (2)+1;//случайное число от 1 до 2

Для прорисовки ландшафта делаем так:
for i:=1 to 10 do//ширина картинки 30 пикселей, высота экрана обычно 320.
//поэтому по высоте вместиться 10 картинок (а внизу останется кусочек высотой 20 пикс)
for j:=1 to 8 do//ширина картинки 30 пикселей, ширина экрана обычно 240. поэтому по ширине вместиться 8 картинок
drawimage (land_image[land_array[j,i]],(j-1)*30,(i-1)*30);//рисуем изображение ландшафта под номером "land_array[j,i]".

Вы не забыли, что land_array - это числовой массив? А число, как уже писалось, указывает индекс (или номер) изображения ландшафта.

Итак, кажется все готово. Ландшафт рисуется, однако работа не закончена 

Теперь перейдем к другой части: работа с "камерой".
Суть такая: при приближении к краю экрана ландшафт (вместе с игроком) смещается в определенную сторону.
введем 2 переменные: movx_pixel (для смещения вправо) и movy_pixel (для смещения вниз).

При приближении к соответствующему краю увеличиваем или уменьшаем смещение. Тоесть если персонаж подошел к левому краю, то необходимо уменьшать смещение вправо.

Теперь нам нужно смещать ландшафт в соответствии со значениями movx_pixel и movy_pixel.
Кажется все просто - вместо
drawimage (land_image[land_array[j,i]],(j-1)*30,(i-1)*30);
написать
drawimage (land_image[land_array[j,i]],(j-1)*30+movx_pixel,(i-1)*30)+movy_pixel);

Однако ничего хорошего не выйдет. По бокам просто будут белые поля.

Первая мысль как это исправить - рисовать не 8 квадратов в ширину, а сразу все 30. Конечно, это будет работать, но за скорость работы такого приложения я не ручаюсь. Проще говоря, вместо 8*10=80 изображений мы будем рисовать 30*30=900, что сильно нагружает систему.

Гораздо правильнее смещать индексы (номера) изображений. Каждые 30 пикселей смещаем индекс прорисовки. 
"Каждые 30 пикселей" - это деление на 30 без остатка.

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

Поэтому приходиться шаманить во так (создайте заранее пременные movx_block и movy_block):
movx_block:=trunc(movx_pixel/30.0-frac(movx_pixel/30.0));
movx_block:=trunc(movx_pixel/30.0-frac(movx_pixel/30.0));

и модифицируем процедуру прорисовки ландшафта:
drawimage (land_image[land_array[j+movx_block,i+movy_block]],(j-1)*30,(i-1)*30);


Итак, вроде бы все хорошо. Пытаемся уйти за пределы экрана - ландшафт перемещается. Однако смещение происходит рывками по 30 пикселей. Хотелось бы поплавнее.

Поэтому модифицируем процедуру прорисовки еще раз.
drawimage (land_image[land_array[j+movx_block,i+movy_block]],(j-1+movx_block)*30-movx_pixel,(i-1+movy_block)*30-movy_pixel);

Достаточно длинно, не так ли?

Напоследок нужно не забыть смещать и самого персонажа, иначе он убегит за пределы экрана.
drawimage (player_img[r,temp],x-12-movx_pixel,y-24-movy_pixel);//рисуем персонажа

P.S. Стоит заметить, что стандартная "вырезалка" imagefromimage неадекватно работает с прозрачностью. Поэтому вокруг персонажа будет белый квадрат. Во избежании этого используется библиотека Lib_picker (спасибо Odd за неё).
Как ей пользоваться?

Скармливаем библиотеке картинку:
picker.load(loadimage('/char.png'));

Затем вместо 
ImageFromImage (temp_image,(j-1)*24,(i-1)*24,24,24);
пишем это
GetArea ((j-1)*24,(i-1)*24,24,24);

Вуаля, прозрачность на месте!

Не забудьте скачать пример!

Удачного дня!

Категория: Примеры и обучение | Добавил: PassCall (19.08.2011)
Просмотров: 1180 | Комментарии: 3 | Рейтинг: 5.0/2
Всего комментариев: 2
2  
не обращайте внимания

1  
скопировал ту часть кода отвечающую за ландшафт, а у меня ландшафт только на 1/7 часть экрана(в эмуляторе) при подходе к краю экрана продвинается(постепенно) на пикселей 20 и всё, дальше не двигается!!!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Мини-чат
200
Друзья сайта