Показать сообщение отдельно
Старый 11.11.2011, 19:02   #58
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Помогите исправить ошибку

// ©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. 
нэ?
---
позволил себе добавить несколько констант. теперь если нужно будет заменить графику (поставить спрайты другого размера, увеличить их количество) или поменять размерность этапов, то не нужно будет переписывать весь код, а достаточно поменять значения нескольких констант. ну, это так, на будущее.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff

Последний раз редактировалось barsunduk, 11.11.2011 в 20:19.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
leonid (11.11.2011)