И так, немного теории:
У нас имеется 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);
Вуаля, прозрачность на месте!
Удачного дня!
|