// ©leonid© 2011
// проба пера :)
program lol;
const
STP = 4; // величина шага в пикселах для перемещения героя
AREAW = 8; // ширина карты в тайлах
AREAH = 9; // высота карты в тайлах
sW = 30; // ширина спрайта в пикселах
sH = 30; // высота спрайта в пикселах
LandCount = 2; // количество тайлов
var
i, ix, iy, x, y, key, scrW, scrH: integer;
S: string;
res: resource;
land_image: array [1..LandCount] of image;
land_array: array [1..AREAW, 1..AREAH] of integer;
pers: image;
begin
// размеры экрана
scrW := GetWidth;
scrH := GetHeight;
for i := 1 to LandCount do
land_image[i] := loadImage('/land' + IntegerToString(i) + '.png');
// заполнение массива тайлов
// 1 - первая картинка - земля
for iy := 1 to AREAH do
for ix := 1 to AREAW do
land_array [ix, iy] := 1;
// загрузка карты
res := OpenResource('/map.txt');
// преобразование символов карты в целочисленный массив
for iy := 1 to AREAH do
begin
S := ReadLine(res);
for ix := 1 to AREAW do
land_array[ix, iy] := StringToInteger(GetChar(S, ix - 1));
end;
CloseResource(res);
// загрузка спрайта перса
// (больше не надо ставить такое в циклы :)
pers := LoadImage('/pers.png');
// основной цикл
repeat
// изменение координат перса,
// в зависимости от того, какая кнопка нажата
key := GetKeyPressed;
if (keytoaction(key) = GA_UP)or(key = KE_KEY2) then
y := y - STP;
if (keytoaction(key) = GA_DOWN)or(key = KE_KEY8) then
y := y + STP;
if (keytoaction(key) = GA_LEFT)or(key = KE_KEY4) then
x := x - STP;
if (keytoaction(key) = GA_RIGHT)or(key = KE_KEY6) then
x := x + STP;
// проверки на границы этапа
if (x > AREAW * sW) then
x := STP - sW;
if (x <= -sW) then
x := AREAW * sW - STP;
if (y > AREAH * sH) then
y := STP - sH;
if (y <= -sH) then
y := AREAH * sH - STP;
// очистка экрана
SetColor(255, 255, 255);
FillRect(0, 0, scrW, scrH);
// отрисовка тайлов
for iy := 1 to AREAH do
for ix := 1 to AREAW do
if (land_array[ix, iy] > 0)and(land_array[ix, iy] <= LandCount) then
DrawImage (land_image[land_array[ix, iy]], (ix - 1) * sW, (iy - 1) * sH);
// отрисовка перса по новым координатам
// и только на территории этапа
SetClip(0, 0, AREAW * sW, AREAH * sH);
DrawImage(pers, x, y);
SetClip(0, 0, scrW, scrH);
// вывод результата на экран
Repaint;
// пауза в 20 мс (1 секунда = 1000 мс)
Delay (20);
until (key = KE_KEY0); // выход из цикла по нажатию кнопки "0"
end.
нэ?
---
позволил себе добавить несколько констант. теперь если нужно будет заменить графику (поставить спрайты другого размера, увеличить их количество) или поменять размерность этапов, то не нужно будет переписывать весь код, а достаточно поменять значения нескольких констант. ну, это так, на будущее.