 |
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, время: 21:15.
|