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 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 (тоже имеет паскалеподобный синктансис (какое заумное слово =) ). Он позволит облегчить и без того тяжелую жизнь программиста. Если интересно, могу создать и залить на свой сайт небольшую статью про него.


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

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