|
09.11.2011, 21:24
|
#46
|
Оператор ЭВМ
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите исправить ошибку
Вот, держите.
|
(Offline)
|
|
09.11.2011, 22:44
|
#47
|
Разработчик
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений (для 319 пользователей)
|
Ответ: Помогите исправить ошибку
Вот, все исправил...
Начнём по порядку.
Почему висло?
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);
Вроде всё
__________________
Мечта программиста: запрограммировать процесс программирования.
Всё гениальное - просто.
http://passcall.ucoz.com
|
(Offline)
|
|
09.11.2011, 23:49
|
#48
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Помогите исправить ошибку
тема превратилась прямо-таки в 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, и где начинаются/заканчиваются прочие циклы. и не воткнем внутрь цикла что-то левое. для этого, конечно, нужно делать отступы. и желательно писать комментарии. а имена переменных хорошо бы выбирать осмысленные. в таком коде легко разберется посторонний человек, у которого вы попросили помощи. да и вам самим легче будет искать ошибки в упорядоченной структуре. и вообще это считается хорошим тоном и отличает код от говнокода.
рекомендую довести это до автоматизма. лично меня соблюдение общепринятых стандартов всегда выручает, когда поднимаю старые проекты с километрами кода.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
10.11.2011, 15:58
|
#49
|
Оператор ЭВМ
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите исправить ошибку
Со всем разобрался, но как исправить вторую проблему?
|
(Offline)
|
|
10.11.2011, 20:24
|
#50
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Помогите исправить ошибку
Сообщение от leonid
Со всем разобрался, но как исправить вторую проблему?
|
про то, что в конце карты должна быть пустая строка, забыл? нажми интер еще разок в конце текстового файла с картой и сохрани.
1211111111
1211111111
1211111111
1222211111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
// тут должна быть пустая строка
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 begin land_array [i, j] := 1; end; res := openresource('/map.txt'); 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); repeat setcolor(255, 255, 255); fillrect(0, 0, 240, 320); for i := 1 to 10 do for j := 1 to 10 do begin drawimage (land_image[land_array[j, i]], (j - 1) * 30, (i - 1) * 30); end; pers := loadImage('/pers.png'); drawimage(pers, x, y); 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 (40); until (GetKeyPressed = KE_KEY0); end.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
10.11.2011, 21:43
|
#51
|
Оператор ЭВМ
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите исправить ошибку
barsunduk, я вижу, Вы собрали. Дайте, пожалуйста, сборку посмотреть.
|
(Offline)
|
|
10.11.2011, 22:18
|
#52
|
Разработчик
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 419
Написано 100 полезных сообщений (для 182 пользователей)
|
Ответ: Помогите исправить ошибку
Сообщение от barsunduk
... в опциях есть чекрыж "Show indentation guidelines" (3-й сверху). если его установить, то между, скажем, begin и end появится вертикальная линия. очень наглядно показывает начало и конец программных скобок.
|
Это в какой версии? В 3.4 не нашел. Есть "выравнять код", почти то же самое, но без вертикальных линий.
|
(Offline)
|
|
10.11.2011, 23:01
|
#53
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Помогите исправить ошибку
Сообщение от AVL
Это в какой версии? В 3.4 не нашел. Есть "выравнять код", почти то же самое, но без вертикальных линий.
|
да, действительно, это MP2.2 - самая удобная версия из всех, по-моему. троечка меня как-то не вставляет. графический редактор там убитый. и линий после отступов нет. да и привык я к двоечке... короче, каждому своё
Сообщение от leonid
barsunduk, я вижу, Вы собрали. Дайте, пожалуйста, сборку посмотреть.
|
не мог ничего понять в коде, пока не отформатировал ..)
з.ы.: и фон удобно в MP2.2 прозрачным делать, и на выходе самый оптимальный формат png, сделать файл меньше больше нигде не смог
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
|
(Offline)
|
|
11.11.2011, 00:59
|
#54
|
Разработчик
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений (для 319 пользователей)
|
Ответ: Помогите исправить ошибку
Сообщение от barsunduk
сделать файл меньше больше нигде не смог
|
Лови. pngout.exe. Обычно уменьшает размер на 10-20%, но иногда может и в 2 раза сжать (особенно хорошо это получается при работе с png24). Как пользоваться? Открыть с помощью->обзор->png out
__________________
Мечта программиста: запрограммировать процесс программирования.
Всё гениальное - просто.
http://passcall.ucoz.com
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо PassCall за это полезное сообщение:
|
|
11.11.2011, 11:35
|
#55
|
ПроЭктировщик
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений (для 271 пользователей)
|
Ответ: Помогите исправить ошибку
Сообщение от PassCall
|
спасибо! а мне какая-то версия попадалась (старая наверное), никакой компрессии. а, может ее настраивать надо было какими-нибудь ключами, а в этой по умолчанию всё здорово работает.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
Последний раз редактировалось barsunduk, 11.11.2011 в 15:13.
|
(Offline)
|
|
11.11.2011, 15:33
|
#56
|
Оператор ЭВМ
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите исправить ошибку
Как сделать управление цифрами? Вставил вместо GA_DOWN и KE_KEY8 и т.д., не реагирует что-то.
|
(Offline)
|
|
11.11.2011, 16:38
|
#57
|
Оператор ЭВМ
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите исправить ошибку
И если нужно сделать поле не 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.
|
|
(Offline)
|
|
11.11.2011, 19:02
|
#58
|
ПроЭктировщик
Регистрация: 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)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.11.2011, 19:15
|
#59
|
Разработчик
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений (для 319 пользователей)
|
Ответ: Помогите исправить ошибку
И ещё одна подсказка:
"(keytoaction(key) = GA_UP)or(key = KE_KEY2)" keyToAction как бэ реагируент на нажатие кнопки вверх И на кнопку 2.
Пруфкод:
program proof_code; begin repeat delay (10); until (KeyToAction (GetKeyPressed)=GA_UP); drawtext ('ТАДА!!!',0,0); repaint; delay (2012); end.
Если же надо уловить нажатие чисто джойстика, то делать надо так:
if (KeyToAction(GetKeyPressed)=GA_UP) and (GetKeyPressed<>KE_KEY2) then ............
А вообще вот список "кнопок" и их расшифровка:
Для 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 - если вообще никакая кнопка не нажата
Для софт кнопок (слева и справа от джойстика), кнопок "положить/снять трубку", регулирования звука и всех прочих, таких команд не предусмотрено.
__________________
Мечта программиста: запрограммировать процесс программирования.
Всё гениальное - просто.
http://passcall.ucoz.com
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.11.2011, 19:43
|
#60
|
Оператор ЭВМ
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: Помогите исправить ошибку
Спасибо!
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:26.
|