forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   MidletPascal (http://forum.boolean.name/forumdisplay.php?f=46)
-   -   Помогите исправить ошибку (http://forum.boolean.name/showthread.php?t=15748)

leonid 02.11.2011 13:38

Помогите исправить ошибку
 
Здрасте. Я в МП совсем салага. Хотел сделать что-то наподобие полосы загрузки, но она не продвигается. Почему?

Цитата:

program Load;

var
progress,i:Integer;

begin
SetColor(0,0,0);
DrawRect(10,10,100,10);
for i:=0 to 100 do

begin
progress:=1;
FillRect(12,12,progress,7);
repaint;
progress:=progress+1;
repaint;
end;

end.

FireOwl 02.11.2011 18:51

Ответ: Помогите исправить ошибку
 
У тебя progress приравнивается к единице в самом начале цикла.
Вынеси наружу.
И repaint чем меньше вызываешь - тем лучше. В идеале - один раз в конце цикла. А тут он непонятно зачем два раза вызван.

leonid 02.11.2011 19:06

Ответ: Помогите исправить ошибку
 
Спасибо, "загрузка" идет :)

FireOwl 02.11.2011 19:07

Ответ: Помогите исправить ошибку
 
Можно прибавлять по два (или больше). :-)

leonid 02.11.2011 20:05

Ответ: Помогите исправить ошибку
 
Я знаю)

leonid 02.11.2011 20:36

Ответ: Помогите исправить ошибку
 
Цитата:

program loadcar;

var
progress,i,S:Integer;

begin
progress:=1;
S:=1;
SetColor(0,0,0);
FillRect(1,1,240,320);
SetColor(200,170,0);
DrawText('Loading',100,130);
DrawRect(70,155,100,10);
for i:=0 to 96 do

begin
FillRect(72,157,progress,7);
progress:=progress+1;
drawImage(loadImage('/car.png')S,200);
S:=S+2;
repaint;
delay(20);
end;

end.
Должна идти загрузка и ехать внизу машина, но при компиляции выскакивает "error, parameter list is too short"
Что на этот раз не так?

DIMMON4IK 02.11.2011 20:54

Ответ: Помогите исправить ошибку
 
drawImage(loadImage('/car.png')S,200); замени на drawImage(loadImage('/car.png'),S,200);

leonid 02.11.2011 21:18

Ответ: Помогите исправить ошибку
 
Вот блин. Из-за какой-то запятой) Спасибо.
Как сделать, чтобы она не оставляла след?

Igor 02.11.2011 22:39

Ответ: Помогите исправить ошибку
 
заполнять экран белым чёрным цветом
Setcolor(0,0,0);
fillrect(getwidth,getheight);

А вообще лучше сделать
var car:image;
car:=loadImage('/car.png');
а потом рисовать
drawImage(car,S,200);

barsunduk 02.11.2011 23:39

Ответ: Помогите исправить ошибку
 
Вложений: 1


вот примерчик для любого разрешения

PHP код:

// progress sample for leonid
// (c) barsunduk
// 02.11.2011

program carload;

var
    
carimage;
    
iscrWscrHinteger;

// на входе состояние прогресса
// от 0 до scrW (ширина экрана)
procedure progress(xinteger);
var
    
whyinteger;
    
sstring;
begin
    w 
:= GetImageWidth(car);
    
:= GetImageHeight(car);
    
:= scrH h;
    
// очищается полоса с машинкой
    
SetColor(000);
    
FillRect(0yscrWh);
        
// это можно удалить
        // тут полоска зеленая рисуется с процентами
        
SetColor(01700);
        
FillRect(0yxh);
      
SetColor(240255240);
        
:= 'loading... ' + (100 scrW) + '% ';
        
DrawText(sGetStringWidth(s), GetStringHeight(s));
        
// для жирности
        
DrawText(sGetStringWidth(s), GetStringHeight(s));
    
// рисуется машинка    
    
DrawImage(carxy);
end;

begin
    car 
:= loadImage('/car.png');
    
scrW := GetWidth;
    
scrH := GetHeight;
    
SetColor(000);
    
FillRect(00scrWscrH);
    
// цикл с шагом в 2 пиксела
    
for := 0 to scrW do
    
begin
        progress
(2);
        
repaint;
        
delay(40);
    
end;
    
// очищаем память от ненужной картинки
    
car := loadImage('');
    
delay(2000);
end

в архиве тот же код

barsunduk 03.11.2011 00:44

Ответ: Помогите исправить ошибку
 


вариант со снятием огрызка скриншота вместо рисования одноцветных прямоугольников, затирающих нашу машинку и ее какашки в виде надписи "loading N%"

PHP код:

// progress sample for leonid
// (c) barsunduk
// 02.11.2011

program carload;

var
    
carbackimage;
    
iwwscrWscrHinteger;

// на входе состояние прогресса
// от 0 до scrW (ширина экрана)
procedure progress(xinteger);
var
    
whyinteger;
    
sstring;
begin
    w 
:= GetImageWidth(car);
    
:= GetImageHeight(car);
    
:= scrH h;
    
// восстанавливаем содержимое экрана из скриншота - стираем прогрессбар
    
DrawImage(back0y);
        
:= 'loading... ' + (100 scrW) + '% ';
      
SetColor(000);
        
DrawText(sGetStringWidth(s), GetStringHeight(s));
      
SetColor(240255240);
        
DrawText(sGetStringWidth(s) - 1GetStringHeight(s) - 1);
    
// рисуется машинка    
    
DrawImage(carxy);
end;

begin
    car 
:= loadImage('/car.png');
    
scrW := GetWidth;
    
scrH := GetHeight;
    
SetColor(000);
    
FillRect(00scrWscrH);
    
// тут рисуется всякое... ну там реклама, лого, заставка, хз
    // ...
    // например завалим экран мусором:
    
ww := scrW;
    if 
ww 255 then
            ww 
:= 255;
    for 
:= 0 to ww do
    
begin
        SetColor
(ww iww iww i);
        
DrawLine(i0iscrH);
    
end;
    
// берем кусок скриншота
    
back := ImageFromCanvas(0scrH GetImageHeight(car) * 2,  GetWidthGetImageHeight(car));
    
// цикл с шагом в 2 пиксела
    
for := 0 to scrW do
    
begin
        progress
(2);
        
repaint;
        
delay(40);
    
end;
    
// очищаем память от ненужных картинок
    
delay(2000);
end


baton4ik 03.11.2011 01:06

Ответ: Помогите исправить ошибку
 
И зачем? Судя по его проблемам, он в твоей коде ничего не поймёт. Поощряешь бездумный копипаст.
leonid, почитай встроенную справку, и перед тем, как задавать вопросы, пользуйся поиском.

barsunduk 03.11.2011 01:44

Ответ: Помогите исправить ошибку
 
Цитата:

Сообщение от baton4ik (Сообщение 208092)
И зачем? Судя по его проблемам, он в твоей коде ничего не поймёт. Поощряешь бездумный копипаст.
leonid, почитай встроенную справку, и перед тем, как задавать вопросы, пользуйся поиском.

мне все же кажется, что на примерах с комментариями человеку легче будет разобраться. до некоторых вещей своим ходом доберешься нескоро, а заметив незнакомую функцию в чужом коде, обратишь на нее внимание. в следующий раз уже будешь знать, что искать, какой раздел хелпа штудировать в первую очередь.
а советы типа "читай справку" лично у меня убивают веру в сапиенсов.

leonid 03.11.2011 13:56

Ответ: Помогите исправить ошибку
 
Большое спасибо, вроде разобрался.

leonid 03.11.2011 17:28

Ответ: Помогите исправить ошибку
 
Вложений: 1
Цитата:

program wormshow;

var
scrW,scrH,xworm1,yworm1,i:integer;
title,worm1,box,map,worm,wormInfo,wormEnemy:image;

begin
scrW:=getWidth;
scrH:=getHeight;
title:=loadImage('/title.png');
box:=loadImage('/box.png');
worm1:=loadImage('/worm1.png');
xworm1:=230;
yworm1:=237;
SetColor(100,190,255);
FillRect(0,0,scrW,scrH);
drawImage(title,25,10);
drawImage(box,20,240);
if xworm1=60 then
box:=loadImage('');

for i:=0 to 60 do

begin
drawImage(worm1,xworm1,yworm1);
xworm1:=xworm1-4;
repaint;
delay(100);
end;
title:=loadImage('');
box:=loadImage('');

begin
map:=loadImage('/map.png');
wormEnemy:=loadImage('/wormEnemy.png');
wormInfo:=loadImage('/wormInfo.png');
worm:=loadImage('/worm.png');
DrawImage(map,0,0);
DrawImage(wormEnemy,1,184);
DrawImage(worm,210,12);
DrawImage(wormInfo,210,1);
repaint;
delay(3000);
end;

end.
Когда цикл заканчивается, все зависает. Почему?

leonid 03.11.2011 17:29

Ответ: Помогите исправить ошибку
 
Если надоело искать ошибки в моем коде, посоветуйте какую-нибудь литературу :)

Igor 03.11.2011 19:17

Ответ: Помогите исправить ошибку
 
зависает из-за того, что где-то неправильно указан путь к изображению.
В данном случае заглавные и строчные буквы не являются эквивалентными.

leonid 03.11.2011 19:37

Ответ: Помогите исправить ошибку
 
Убрал
"title:=loadImage('');
box:=loadImage('');",
и всё заработало.
А в коде barsunduk'а почти то же самое работало...
"// очищаем память от ненужных картинок
car := loadImage('');
back := loadImage('');"
Что не так?

PassCall 03.11.2011 20:03

Ответ: Помогите исправить ошибку
 
Незнаю как в другой версии, но в midletpascal 2.0 car := loadImage(''); приводит к ступору приложения.

Для очистки памяти от "мусора" можно сделать так:
1. сделать "пустую" картинку (null_image:image; ), по сути являющуюся изображением с разрешением 1х1 пиксель (что занимает около 4-х байт)
2. применить её к ненужной в данный момент картинке (car:=null_image; )

Я бы дал тебе некторые советы относительно программинга на мидлетпаскале, но тут существует раздел F.A.Q.

Думаю, стоит его посетить (хотя можеш спросить и тут, как хочеш).

P.S. только что с удивлением обнаружил, что мидлетпаскаль совершенно спокойно загружает ресурсы с именем, содержащее русские буквы, лол =0

leonid 03.11.2011 20:22

Ответ: Помогите исправить ошибку
 
Спасибо за советы :)

PassCall 03.11.2011 21:28

Ответ: Помогите исправить ошибку
 
Да незачто. Спрашивай почаще, будем рады ответить =)

barsunduk 03.11.2011 23:11

Ответ: Помогите исправить ошибку
 
прошу меня извинить за то, что ввел в заблуждение. действительно в MP2 функция loadImage('') вешает мидлет. сорри.

кстати, а зачем нужна имитация полосы загрузки в данном примере? я думал, прогрессбар показывает, сколько процентов данных загружено. т.е. в цикле вместо паузы нужно загружать данные (картинки, карты и.д.). тогда полоса будет служить не только декоративным целям

leonid 04.11.2011 13:34

Ответ: Помогите исправить ошибку
 
Цитата:

Сообщение от barsunduk (Сообщение 208212)
кстати, а зачем нужна имитация полосы загрузки в данном примере? я думал, прогрессбар показывает, сколько процентов данных загружено. т.е. в цикле вместо паузы нужно загружать данные (картинки, карты и.д.). тогда полоса будет служить не только декоративным целям

Да это я просто так, ознакомиться. А вообще спасибо, учту :)

leonid 04.11.2011 14:17

Ответ: Помогите исправить ошибку
 
Что-то до меня не доходит, как в MP 3.4 добавить ресурс?

leonid 04.11.2011 18:23

Ответ: Помогите исправить ошибку
 
И, если Вас не затруднит, покажите как пользоваться repaint'ом для перерисовки заданной области.

barsunduk 04.11.2011 20:11

Ответ: Помогите исправить ошибку
 
Цитата:

Сообщение от leonid (Сообщение 208331)
И, если Вас не затруднит, покажите как пользоваться repaint'ом для перерисовки заданной области.

прорисовка определенной области не поддерживается. но есть функция setClip(x, y, w, h), которая определяет область вывода графики.

PHP код:

program clipTest;
begin
    
// выводим текст и рисунки только в заданный прямоугольник
    
setClip(0050120);
    
setColor(000);
    
FillRect(00GetWidthGetHeight);
    
setColor(255255255);
    
drawImage(loadImage('/icon.png'), 4010);
    
drawText('Hello world!'00);
    
// возвращаем возможность рисовать на всем экране
    
setClip(00GetWidthGetHeight);
    
// рисуем на всем экране
    
setColor(01270);
    
drawLine(00GetWidthGetHeight);
    
repaint;
    
delay(2000);
end


PassCall 04.11.2011 20:21

Ответ: Помогите исправить ошибку
 
Кажется меня опередили насчет setclip =)

P.S. Небольшое пояснение принципа работы repaint:
При вызове любой "рисовальной" процедуры (буть то рисование квадрата, изображения и т.д.) "рисунок" не выводится сразу на экран, а записывается в специальный графический буфер (в память).
А вот Repaint выводит содержимое этого самого буфера на экран.

leonid 05.11.2011 13:33

Ответ: Помогите исправить ошибку
 
barsunduk, вот как. Спасибо.

leonid 09.11.2011 16:45

Ответ: Помогите исправить ошибку
 
Цитата:

program map;

var
land:array[1..2] of image;
land_array:array[1..30,1..30] of integer;
i,j:integer;
gg:image;

begin
land[1]:=loadImage('/simple.png');
land[2]:=loadImage('/green.png');
for i:=1 to 30 do
for j:=1 to 30 do
land_array[i,j]:=random(2)+1;

for i:=1 to 10 do
for j:=1 to 8 do
drawimage (land[land_array[j,i]],(j-1)*30,(i-1)*30);
gg:=loadImage('/gg.png');
drawImage(gg,60,90);
repaint;
delay(5000);
end.

Программа, которая создаёт поле из двух видов поверхности (спасибо PassCall'ю за урок с его сайта). Допустим, я не хочу рандомного создания поля, а хочу, чтобы поле создавалось с помощью текстового ресурса. Как это осуществить?

PassCall 09.11.2011 18:06

Ответ: Помогите исправить ошибку
 
Цитата:

Сообщение от leonid (Сообщение 209024)
(спасибо PassCall'ю за урок с его сайта).

Незачто, пользуйся на здоровье

Цитата:

Сообщение от leonid (Сообщение 209024)
Допустим, я не хочу рандомного создания поля, а хочу, чтобы поле создавалось с помощью текстового ресурса. Как это осуществить?

Ну само по себе надо этот ресурс создать.
Допустим, мы хотим с помощью ресурса "создать" карту размером 10х10.

Так как единица отвечает за землю, а двойка - за "песок", то и в ресурсе надо так и писать. Строка должны быть 10 символов (единиц или нулей), а самих строк тоже должно быть 10.

Вот пример
1122112211
1122112211
1122112211
1122112211
2222222222
2222222222
1122112211
1122112211
1122112211
1122112211



В конце надо поставить еще 1 строку (можно и пустую), иначе при прочтении ресурса игра зависнет.


Итак, сохраняем этот текст под именем, например, map.txt.
Загружаем его в проект (зеленый плюсик в мидлетпаскале).
ПРОЦЕСС КОДИНГА
Для начала нужно ввести переменную res (или любое другое имя), назначив её как resource. В общем выглядит это так:
res: resource; (добавлять это надо после слова var)

Теперь сам код:
Код:

res:=openresource('/map.txt');//прежде чем что-то прочитать из ресурса, его необходимо открыть
for i:=1 to 10 do//читаем строку из ресурса
begin
S:=readline (res);//берем из ресурса строку и присваиваем (запоминаем) её к S. При каждом вызове readln номер читаемой строки увеличивается на 1. То есть в первый раз будет прочитана первая строчка, потом вторая и т.д.
for j:=1 to 10 do
land_array[j,i]:=stringtointeger(GetChar(S,j-1));//итак, что мы делаем? для начала при помощи GetChar выковыриваем из длинной строки S один символ. j-1 - это номер символа из строки. Первый символ имеет номер 0 (а не 1!), поэтому отнимаем единичку. Получили символ ("1" или "2"). Но так как символ это совсем не число, необходимо "превратить" символ в число. Делается это с помощью stringtointeger
end;
closeresource (res);//

Не забудь описать текстовую переменную S (S:string;), если её нет, иначе МидлетПаскаль начнет "ругаться".

Всё. Если надо готовый пример, скажи.

P.S. Для создания всяческих карт (как в данном случае) и прочих игровых данных, не помешает подучить Delphi (тоже имеет паскалеподобный синктансис (какое заумное слово =) ). Он позволит облегчить и без того тяжелую жизнь программиста. Если интересно, могу создать и залить на свой сайт небольшую статью про него.

leonid 09.11.2011 18:22

Ответ: Помогите исправить ошибку
 
Да, неплохо бы готовый пример, если не затруднит.

PassCall 09.11.2011 18:24

Ответ: Помогите исправить ошибку
 
Вложений: 1
Минутку...

Вот. Пользуйся.
Вложение 15408

leonid 09.11.2011 19:11

Ответ: Помогите исправить ошибку
 
Цитата:

program lol;

var
i,j,x,y,key,:integer;
S:string;
res:resource;
land_image:array [1..2] of image;
land_array:array [1..30,1..30] of integer;
pers:image;

begin

land_image[1]:=loadimage('/land1.png');
land_image[2]:=loadimage('/land2.png');
for i:=1 to 30 do
for j:=1 to 30 do
land_array [i,j]:=1;
res:=openresource('/map.txt');
for i:=1 to 10 do

begin
S:=readline (res);
land_array[j,i]:=stringtointeger(GetChar(S,j-1));
end;
closeresource (res);
REPEAT

setcolor(255,255,255);
fillrect(0,0,240,320);

for i:=1 to 11 do
for j:=1 to 9 do
begin
drawimage (land_image[land_array[j+,i+]],(j-1+)*30-,(i-1)*30);
end;

drawimage (pers,50,40);
key:=GetKeyPressed;

if keytoaction(key)=GA_UP then
begin
y:=y-1;
end;

if keytoaction(key)=GA_DOWN then
begin
y:=y+1;
end;

if keytoaction(key)=GA_LEFT then
begin
x:=x-1;
end;

if keytoaction(key)=GA_RIGHT then
begin
x:=x+1;
end;

repaint;
delay (20);

UNTIL (GetKeyPressed=KE_KEY0);

end.
Немного упростил под себя. Но при компиляции тычет в строку с "var" и на ту, где рисуется белый прямоугольник на весь экран.

PassCall 09.11.2011 20:24

Ответ: Помогите исправить ошибку
 
"i,j,x,y,key,:integer;" убери лишнюю запятую - она вводит МидлетПаскаль в заблуждение

"drawimage (land_image[land_array[j+,i+]],(j-1+)*30-,(i-1)*30);" лишние минусы и плюсы. нет такого числа как "5+" или "3-" =)

leonid 09.11.2011 20:34

Ответ: Помогите исправить ошибку
 
Ах да, невнимательность =)
Но почему-то всё равно белый экран...

PassCall 09.11.2011 20:35

Ответ: Помогите исправить ошибку
 
А ты персонажа в память загрузил?

leonid 09.11.2011 20:36

Ответ: Помогите исправить ошибку
 
Конечно.

leonid 09.11.2011 20:37

Ответ: Помогите исправить ошибку
 
А, и правда не загрузил. Я думал, ты про ресурс.

leonid 09.11.2011 20:40

Ответ: Помогите исправить ошибку
 
Да даже с персом виснет

PassCall 09.11.2011 20:45

Ответ: Помогите исправить ошибку
 
Регистр соблюден?

"Pers.png" и "pers.png" это два разных файла

И вставь вот это

for i:=1 to 30 do
for j:=1 to 30 do
land_array[i,j]:=1;

перед S:=readline (res);

Так как по умолчанию значения этого массива ноль, то движок пытается вывести картинку ландшафта под номером ноль. А у нас есть только 1 и 2.

leonid 09.11.2011 20:47

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

PassCall 09.11.2011 20:54

Ответ: Помогите исправить ошибку
 
а код вставил?

секунду, а зачем в коде вот это (выделено жирным)?

program lol;

var
i,j,x,y,key,:integer;
S:string;
res:resource;
land_image:array [1..2] of image;
land_array:array [1..30,1..30] of integer;
pers:image;

begin

land_image[1]:=loadimage('/land1.png');
land_image[2]:=loadimage('/land2.png');
for i:=1 to 30 do
for j:=1 to 30 do
land_array [i,j]:=1;
res:=openresource('/map.txt');
for i:=1 to 10 do

begin
S:=readline (res);
land_array[j,i]:=stringtointeger(GetChar(S,j-1));
end;
closeresource (res);
REPEAT

setcolor(255,255,255);
fillrect(0,0,240,320);

for i:=1 to 11 do
for j:=1 to 9 do
begin
drawimage (land_image[land_array[j+,i+]],(j-1+)*30-,(i-1)*30);
end;

drawimage (pers,50,40);
key:=GetKeyPressed;

if keytoaction(key)=GA_UP then
begin
y:=y-1;
end;

if keytoaction(key)=GA_DOWN then
begin
y:=y+1;
end;

if keytoaction(key)=GA_LEFT then
begin
x:=x-1;
end;

if keytoaction(key)=GA_RIGHT then
begin
x:=x+1;
end;

repaint;
delay (20);

UNTIL (GetKeyPressed=KE_KEY0);

end.

PassCall 09.11.2011 20:59

Ответ: Помогите исправить ошибку
 
Чтото ты намудрил.
Должно быть так

for i:=1 to 10 do
begin
S:=readline (res);
for j:=1 to 10 do
land_array[j,i]:=stringtointeger(GetChar(S,j-1));
end;
closeresource (res);

То, что красным выделено, ты пропустил

leonid 09.11.2011 21:12

Ответ: Помогите исправить ошибку
 
Исправил, но всё равно белый экран =(

PassCall 09.11.2011 21:15

Ответ: Помогите исправить ошибку
 
Скинь короче мне свой проект, счас посмотрю, в чем дело

leonid 09.11.2011 21:24

Ответ: Помогите исправить ошибку
 
Вложений: 1
Вот, держите.

PassCall 09.11.2011 22:44

Ответ: Помогите исправить ошибку
 
Вот, все исправил...

Начнём по порядку.

Почему висло?
1. for i:=1 to 30 do
for j:=1 to 30 do
begin
land_array [i,j]:=1;
res:=openresource('/map.txt');
end;

команда res:=openresource('/map.txt'); тут совершенно не уместна. То есть Вы пытальсь загрузить этот ресурс... 900 раз (30*30), что естественно занимает много времени. Переместить в другое место.

2. for i:=1 to 10 do
begin
S:=readline (res);
for i:=1 to 10 do
land_array[j,i]:=stringtointeger(GetChar(S,j-1));
end;

тут 2 раза используется i. но ошибка в принципе не в этом (хотя так делать тоже нельзя) обратите внимание на land_array[j,i]. j по умолчанию равен нулю. а пределы массива 1..30. тоесть число ноль ну никак не принадлежит отрезку 1-30. поэтому игра висла.

3. я немного затупил с примером. вместо нуля (в ресурсе) должна быть единица, а вместо единицы - двойка. извините.

Так. Еще замечания
1. delay (8000);

задержка у Вас стоит 8 секунд (8000 миллисекунд). То есть 1 кадр в 8 секунд, из-за чего игра превращается в слайд-шоу. Зачем? Чем меньше задежка, тем лучше (в разумных пределах, конечно. советую ставить 40)

2. drawimage(pers,50,40);

координата керсонажа равняется 50,40. То есть Вы ввели КОНСТАНТЫ, и они совершенно не зависят от значения x и y. То есть двигаться он никак не будет. Измените на drawimage(pers,x,y);

Вроде всё

barsunduk 09.11.2011 23:49

Ответ: Помогите исправить ошибку
 
тема превратилась прямо-таки в FAQ для новичков. учит следить за всем, что ты делаешь.

кстати о FAQ, хочу вставить свои пять копеек. чтобы легче было отслеживать все свои циклы и вхождения в них, очень рекомендую использовать предусмотренные для этого инструменты MP. например, в опциях есть чекрыж "Show indentation guidelines" (3-й сверху). если его установить, то между, скажем, begin и end появится вертикальная линия. очень наглядно показывает начало и конец программных скобок.

Код:

  while GetKeyClicked <> KE_STAR do
  begin
  | // закрашиваем экран
  | FillRect(0, 0, GetWidth, GetHeight);
  | // рисуем спрайты
  | for iy := 1 to 10 do
  | | for ix := 1 to 10 do
  | | begin
  | | | // sprW, sprH - ширина/высота спрайтов. если захочу поменять,
  | | | // то не надо будет переписывать всю программу
  | | | drawImage(sprites[ix, iy], ix * sprW, iy * sprH);
  | | | // тут что-то еще делаем
  | | | // ...
  | | end;
  | repaint;
  | delay(20);
  end;

в результате мы видим, где начинается и заканчивается цикл while, и где начинаются/заканчиваются прочие циклы. и не воткнем внутрь цикла что-то левое. для этого, конечно, нужно делать отступы. и желательно писать комментарии. а имена переменных хорошо бы выбирать осмысленные. в таком коде легко разберется посторонний человек, у которого вы попросили помощи. да и вам самим легче будет искать ошибки в упорядоченной структуре. и вообще это считается хорошим тоном и отличает код от говнокода.
рекомендую довести это до автоматизма. лично меня соблюдение общепринятых стандартов всегда выручает, когда поднимаю старые проекты с километрами кода.

leonid 10.11.2011 15:58

Ответ: Помогите исправить ошибку
 
Со всем разобрался, но как исправить вторую проблему?

barsunduk 10.11.2011 20:24

Ответ: Помогите исправить ошибку
 
Цитата:

Сообщение от leonid (Сообщение 209165)
Со всем разобрался, но как исправить вторую проблему?

про то, что в конце карты должна быть пустая строка, забыл? нажми интер еще разок в конце текстового файла с картой и сохрани.

Код:

1211111111
1211111111
1211111111
1222211111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
// тут должна быть пустая строка



PHP код:

program lol;

var
    
ijxykeyinteger;
    
Sstring;
    
resresource;
    
land_image: array [1..2of image;
    
land_array: array [1..301..30of integer;
    
persimage;

begin
    land_image
[1] := loadimage('/land1.png');
    
land_image[2] := loadimage('/land2.png');
    for 
:= 1 to 30 do
    for 
:= 1 to 30 do
    
begin
        land_array 
[ij] := 1;
    
end;
    
res := openresource('/map.txt');
    for 
:= 1 to 10 do
    
begin
        S 
:= readline(res);
        for 
:= 1 to 10 do
            
land_array[ji] := stringtointeger(GetChar(S1));
    
end;
    
closeresource(res);
    
repeat
        setcolor
(255255255);
        
fillrect(00240320);
        for 
:= 1 to 10 do
        for 
:= 1 to 10 do
        
begin
            drawimage 
(land_image[land_array[ji]], (1) * 30, (1) * 30);
        
end;
        
pers := loadImage('/pers.png');
        
drawimage(persxy);
        
key := GetKeyPressed;
        if 
keytoaction(key) = GA_UP then
        begin
            y 
:= 1;
        
end;
        if 
keytoaction(key) = GA_DOWN then
        begin
            y 
:= 1;
        
end;
        if 
keytoaction(key) = GA_LEFT then
        begin
            x 
:= 1;
        
end;
        if 
keytoaction(key) = GA_RIGHT then
        begin
            x 
:= 1;
        
end;
        
repaint;
        
delay (40);
    
until (GetKeyPressed KE_KEY0);
end


leonid 10.11.2011 21:43

Ответ: Помогите исправить ошибку
 
barsunduk, я вижу, Вы собрали. Дайте, пожалуйста, сборку посмотреть.

AVL 10.11.2011 22:18

Ответ: Помогите исправить ошибку
 
Цитата:

Сообщение от barsunduk (Сообщение 209102)
... в опциях есть чекрыж "Show indentation guidelines" (3-й сверху). если его установить, то между, скажем, begin и end появится вертикальная линия. очень наглядно показывает начало и конец программных скобок.

Это в какой версии? В 3.4 не нашел. Есть "выравнять код", почти то же самое, но без вертикальных линий.

barsunduk 10.11.2011 23:01

Ответ: Помогите исправить ошибку
 
Вложений: 1
Цитата:

Сообщение от AVL (Сообщение 209203)
Это в какой версии? В 3.4 не нашел. Есть "выравнять код", почти то же самое, но без вертикальных линий.

да, действительно, это MP2.2 - самая удобная версия из всех, по-моему. троечка меня как-то не вставляет. графический редактор там убитый. и линий после отступов нет. да и привык я к двоечке... короче, каждому своё

Цитата:

Сообщение от leonid (Сообщение 209196)
barsunduk, я вижу, Вы собрали. Дайте, пожалуйста, сборку посмотреть.

не мог ничего понять в коде, пока не отформатировал ..)

з.ы.: и фон удобно в MP2.2 прозрачным делать, и на выходе самый оптимальный формат png, сделать файл меньше больше нигде не смог

PassCall 11.11.2011 00:59

Ответ: Помогите исправить ошибку
 
Вложений: 1
Цитата:

Сообщение от barsunduk (Сообщение 209210)
сделать файл меньше больше нигде не смог


Лови. Вложение 15453. Обычно уменьшает размер на 10-20%, но иногда может и в 2 раза сжать (особенно хорошо это получается при работе с png24). Как пользоваться? Открыть с помощью->обзор->png out

barsunduk 11.11.2011 11:35

Ответ: Помогите исправить ошибку
 
Цитата:

Сообщение от PassCall (Сообщение 209220)
Лови. pngout.exe...

спасибо! а мне какая-то версия попадалась (старая наверное), никакой компрессии. а, может ее настраивать надо было какими-нибудь ключами, а в этой по умолчанию всё здорово работает.

leonid 11.11.2011 15:33

Ответ: Помогите исправить ошибку
 
Как сделать управление цифрами? Вставил вместо GA_DOWN и KE_KEY8 и т.д., не реагирует что-то.

leonid 11.11.2011 16:38

Ответ: Помогите исправить ошибку
 
И если нужно сделать поле не 10х10, а 8х9? Пробовал менять значения i и j на 8 и 9, затем сделал в тхт-карте поле 8х9. Виснет.

Цитата:

program lol;

const
STP = 30; // величина шага в пикселах для перемещения курсора

var
i, j, x, y, key,scrW,scrH: integer;
S: string;
res: resource;
land_image: array [1..2] of image;
land_array: array [1..30, 1..30] of integer;
cursor: image;

begin
land_image[1] := loadimage('/land1.png');
land_image[2] := loadimage('/land2.png');
// заполнение массива тайлов
// 1 - первая картинка - земля
for i := 1 to 30 do
for j := 1 to 30 do
begin
land_array [i, j] := 1;
end;
// загрузка карты
res := openresource('/map.txt');
// преобразование символов карты в целочисленный массив
for i := 1 to 8 do
begin
S := readline(res);
for j := 1 to 9 do
land_array[j, i] := stringtointeger(GetChar(S, j - 1));
end;
closeresource(res);
// загрузка спрайта курсора
// (больше не надо ставить такое в циклы :)
//(спасибо, постараюсь :)
cursor := loadImage('/cursor.png');
// основной цикл
repeat
// очистка экрана
setcolor(255, 255, 255);
fillrect(0, 0, 240, 320);
// отрисовка тайлов
for i := 1 to 8 do
for j := 1 to 9 do
begin
drawimage (land_image[land_array[j, i]], (j - 1) * 30, (i - 1) * 30);
end;

drawimage(cursor, x, y);//отрисовка курсора

// изменение координат курсора в зависимости от того,какая кнопка нажата

key := GetKeyClicked;

if keytoaction(key) = GA_UP then
begin
y := y - STP;
end;
if keytoaction(key) = GA_DOWN then
begin
y := y + STP;
end;
if keytoaction(key) = GA_LEFT then
begin
x := x - STP;
end;
if keytoaction(key) = GA_RIGHT then
begin
x := x + STP;
end;

//перенос курсора, если он уходит за экран

scrW:=getWidth;//получаем ширину экрана
scrH:=getHeight;//высоту

if x=scrW then //если курсор уходит вправо за экран, переносим в левый край
begin
x:=0;
end;
if x<0 then //если курсор уходит влево за экран, переносим в правый край
begin
x:=scrW-STP;
end;
if y>STP*9 then //если курсор уходит в нижнюю нецелую клетку, переносим в верхний край
begin
y:=0;
end;
if y<0 then //если курсор уходит вверх за экран, переносим его в нижнюю целую клетку
begin
y:=scrH*9;
end;

// вывод результата на экран
repaint;
// пауза в 20 мс (1 секунда = 1000 мс)
delay (20);
until (GetKeyPressed = KE_KEY0); // выход из цикла по нажатию кнопки "0"
end.


barsunduk 11.11.2011 19:02

Ответ: Помогите исправить ошибку
 
PHP код:

// ©leonid© 2011
// проба пера :)

program lol;

const
    
STP 4// величина шага в пикселах для перемещения героя
    
AREAW 8// ширина карты в тайлах
    
AREAH 9// высота карты в тайлах
    
sW 30// ширина спрайта в пикселах
    
sH 30// высота спрайта в пикселах
    
LandCount 2// количество тайлов

var
    
iixiyxykeyscrWscrHinteger;
    
Sstring;
    
resresource;
    
land_image: array [1..LandCountof image;
    
land_array: array [1..AREAW1..AREAHof integer;
    
persimage;

begin
    
// размеры экрана
    
scrW := GetWidth;
    
scrH := GetHeight;
    for 
:= 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 [ixiy] := 1;
    
// загрузка карты
    
res := OpenResource('/map.txt');
    
// преобразование символов карты в целочисленный массив
    
for iy := 1 to AREAH do
    
begin
        S 
:= ReadLine(res);
        for 
ix := 1 to AREAW do
            
land_array[ixiy] := StringToInteger(GetChar(Six 1));
    
end;
    
CloseResource(res);
    
// загрузка спрайта перса
    // (больше не надо ставить такое в циклы :)
    
pers := LoadImage('/pers.png');
    
// основной цикл
    
repeat
        
// изменение координат перса,
        // в зависимости от того, какая кнопка нажата
        
key := GetKeyPressed;
        if (
keytoaction(key) = GA_UP)or(key KE_KEY2then
            y 
:= STP;
        if (
keytoaction(key) = GA_DOWN)or(key KE_KEY8then
            y 
:= STP;
        if (
keytoaction(key) = GA_LEFT)or(key KE_KEY4then
            x 
:= STP;
        if (
keytoaction(key) = GA_RIGHT)or(key KE_KEY6then
            x 
:= STP;
        
// проверки на границы этапа
        
if (AREAW sWthen
            x 
:= STP sW;
        if (
<= -sWthen
            x 
:= AREAW sW STP;
        if (
AREAH sHthen
            y 
:= STP sH;
        if (
<= -sHthen
            y 
:= AREAH sH STP;
        
// очистка экрана
        
SetColor(255255255);
        
FillRect(00scrWscrH);
        
// отрисовка тайлов
        
for iy := 1 to AREAH do
        for 
ix := 1 to AREAW do
            if (
land_array[ixiy] > 0)and(land_array[ixiy] <= LandCountthen
                DrawImage 
(land_image[land_array[ixiy]], (ix 1) * sW, (iy 1) * sH);
        
// отрисовка перса по новым координатам
        // и только на территории этапа
        
SetClip(00AREAW sWAREAH sH);
        
DrawImage(persxy);
        
SetClip(00scrWscrH);
        
// вывод результата на экран
        
Repaint;
        
// пауза в 20 мс (1 секунда = 1000 мс)
        
Delay (20);
    
until (key KE_KEY0); // выход из цикла по нажатию кнопки "0"
end

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

PassCall 11.11.2011 19:15

Ответ: Помогите исправить ошибку
 
И ещё одна подсказка:
"(keytoaction(key) = GA_UP)or(key = KE_KEY2)" keyToAction как бэ реагируент на нажатие кнопки вверх И на кнопку 2.

Пруфкод:
PHP код:

program proof_code;
begin
   repeat
   delay 
(10);
   
until (KeyToAction (GetKeyPressed)=GA_UP);
drawtext ('ТАДА!!!',0,0);
repaint;
delay (2012);
end

Если же надо уловить нажатие чисто джойстика, то делать надо так:
PHP код:

if (KeyToAction(GetKeyPressed)=GA_UP) and (GetKeyPressed<>KE_KEY2then ............ 

А вообще вот список "кнопок" и их расшифровка:
Для KeyToAction(GetKeyPressed):
GA_UP (2 или джойстик вверх)
GA_LEFT (4 или джойстик влево)
GA_RIGHT (6 или джойстик вправо)
GA_DOWN (8 или джойстик вниз)
GA_FIRE (5 или джойстик (центральный))

Для GetKeyPressed:
KE_KEY? (вместо "?" цифра от нуля до девятки) - соответствующая цифровая кнопка
KE_STAR - звёздочка
KE_POUND -решётка
KE_NONE - если вообще никакая кнопка не нажата

Для софт кнопок (слева и справа от джойстика), кнопок "положить/снять трубку", регулирования звука и всех прочих, таких команд не предусмотрено.

leonid 11.11.2011 19:43

Ответ: Помогите исправить ошибку
 
Спасибо!

leonid 12.11.2011 13:45

Ответ: Помогите исправить ошибку
 
PHP код:

//
if (x=unit1x) and (y=unit1ythen //если коорд. курсора совпадают с коорд. юнита,то...
         
begin
         facewindow
:=loadImage('/face1.png'); //загружаем рожу юнита(будет отображаться на нижнем баре)
         
nameOnBar:='О Р К'//присваиваем имя юнита, которое будет около рожи
         
end else //иначе (это когда курсор не на юнете, а на земле)
         
nameOnBar:='З Е М Л Я'//присваиваем другое имя        
         
facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку
         
         
drawImage(facewindow,scrW-sW-3,scrH-SH-3); //размещаем ее на баре
         
SetColor(180,250,0); 
         
DrawText(nameOnBar,scrW-getStringWidth(nameOnBar)-35,scrH-getStringHeight(nameOnBar)-4); //и текст 

Проблема в том, что если строка

"nameOnBar:='З Е М Л Я'; //присваиваем другое имя"

ставится выше

"facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку",

то выполняется только верхняя строка. Если же поменять их местами, будет опять же выполняться та, которая выше. Как сделать так, чтобы выполнялись сразу обе?

leonid 12.11.2011 14:18

Ответ: Помогите исправить ошибку
 
А, всё. Ввёл еще условие.

PassCall 12.11.2011 14:21

Ответ: Помогите исправить ошибку
 
Было бы хорошо иметь весь код, а то я смутно понимаю предназначение кода.

Но в общем я догадываюсь о сути ошибки

PHP код:

end else //иначе (это когда курсор не на юнете, а на земле) 
         
nameOnBar:='З Е М Л Я'//присваиваем другое имя         
         
facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку 

объясняю:
видиш ли, если не указаны begin и end, то выполняется одна, следующая команда. Давай разберем пошагово

if (x=unit1x) and (y=unit1y) then
Если в выделенной клетке монстр, то...

begin
facewindow:=loadImage('/face1.png'); //загружаем рожу юнита(будет отображаться на нижнем баре)
nameOnBar:='О Р К'; //присваиваем имя юнита, которое будет около рожи
end;

Загружаем в память иконку орка (и причем это сделано очень неправильным образом, иконки следует загрузить заранее), и меняем текст на "орк"

else //иначе (это когда курсор не на юнете, а на земле)
nameOnBar:='З Е М Л Я'; //присваиваем другое имя

Иначе делаем текст "земля"
так как сдесь нет begin и end, выполнятсмя будет только nameOnBar:='З Е М Л Я'; Все, условие закончилось.

facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку
А вот эта штука будет выполняться в ЛЮБОМ случае, так как не относиться к условию. Тоесть даже если в клетке стоит орк, и мы загрузим его иконку, то вот эта команда загрузит землю.

Правильно будет так:
PHP код:

if (x=unit1x) and (y=unit1ythen //если коорд. курсора совпадают с коорд. юнита,то... 
         
begin 
         facewindow
:=loadImage('/face1.png'); //загружаем рожу юнита(будет отображаться на нижнем баре) 
         
nameOnBar:='О Р К'//присваиваем имя юнита, которое будет около рожи 
         
end else
begin //иначе (это когда курсор не на юнете, а на земле) 
         
nameOnBar:='З Е М Л Я'//присваиваем другое имя         
         
facewindow:=loadImage('/land1face.png'); // и загружаем другую картинку 
end;
          
         
drawImage(facewindow,scrW-sW-3,scrH-SH-3); //размещаем ее на баре 
         
SetColor(180,250,0);  
         
DrawText(nameOnBar,scrW-getStringWidth(nameOnBar)-35,scrH-getStringHeight(nameOnBar)-4); //и текст 


leonid 12.11.2011 14:43

Ответ: Помогите исправить ошибку
 
"видиш ли, если не указаны begin и end, то выполняется одна, следующая команда."

В принципе, можно было сказать только это, я понял =)


Часовой пояс GMT +4, время: 08:39.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot