Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal

Ответ
 
Опции темы
Старый 09.11.2011, 21:24   #46
leonid
Оператор ЭВМ
 
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите исправить ошибку

Вот, держите.
Вложения
Тип файла: rar lol.rar (9.9 Кб, 886 просмотров)
(Offline)
 
Ответить с цитированием
Старый 09.11.2011, 22:44   #47
PassCall
Разработчик
 
Аватар для PassCall
 
Регистрация: 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
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 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
leonid
Оператор ЭВМ
 
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите исправить ошибку

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

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

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


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
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
(Offline)
 
Ответить с цитированием
Старый 10.11.2011, 21:43   #51
leonid
Оператор ЭВМ
 
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите исправить ошибку

barsunduk, я вижу, Вы собрали. Дайте, пожалуйста, сборку посмотреть.
(Offline)
 
Ответить с цитированием
Старый 10.11.2011, 22:18   #52
AVL
Разработчик
 
Регистрация: 27.01.2011
Адрес: Афипский
Сообщений: 419
Написано 100 полезных сообщений
(для 182 пользователей)
Ответ: Помогите исправить ошибку

Сообщение от barsunduk Посмотреть сообщение
... в опциях есть чекрыж "Show indentation guidelines" (3-й сверху). если его установить, то между, скажем, begin и end появится вертикальная линия. очень наглядно показывает начало и конец программных скобок.
Это в какой версии? В 3.4 не нашел. Есть "выравнять код", почти то же самое, но без вертикальных линий.
(Offline)
 
Ответить с цитированием
Старый 10.11.2011, 23:01   #53
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Помогите исправить ошибку

Сообщение от AVL Посмотреть сообщение
Это в какой версии? В 3.4 не нашел. Есть "выравнять код", почти то же самое, но без вертикальных линий.
да, действительно, это MP2.2 - самая удобная версия из всех, по-моему. троечка меня как-то не вставляет. графический редактор там убитый. и линий после отступов нет. да и привык я к двоечке... короче, каждому своё

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

з.ы.: и фон удобно в MP2.2 прозрачным делать, и на выходе самый оптимальный формат png, сделать файл меньше больше нигде не смог
Вложения
Тип файла: zip lol.zip (11.4 Кб, 872 просмотров)
__________________
to be or not to be - it's not a question!
2b or not 2b = ff
(Offline)
 
Ответить с цитированием
Старый 11.11.2011, 00:59   #54
PassCall
Разработчик
 
Аватар для PassCall
 
Регистрация: 07.04.2011
Адрес: Млечный путь, Земля, Европа, Беларусь, Могилев
Сообщений: 391
Написано 94 полезных сообщений
(для 319 пользователей)
Ответ: Помогите исправить ошибку

Сообщение от barsunduk Посмотреть сообщение
сделать файл меньше больше нигде не смог

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

Всё гениальное - просто.

http://passcall.ucoz.com
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо PassCall за это полезное сообщение:
AVL (11.11.2011), barsunduk (11.11.2011), midlet_pascal (28.01.2012)
Старый 11.11.2011, 11:35   #55
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
Ответ: Помогите исправить ошибку

Сообщение от PassCall Посмотреть сообщение
Лови. pngout.exe...
спасибо! а мне какая-то версия попадалась (старая наверное), никакой компрессии. а, может ее настраивать надо было какими-нибудь ключами, а в этой по умолчанию всё здорово работает.
__________________
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
leonid
Оператор ЭВМ
 
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите исправить ошибку

Как сделать управление цифрами? Вставил вместо GA_DOWN и KE_KEY8 и т.д., не реагирует что-то.
(Offline)
 
Ответить с цитированием
Старый 11.11.2011, 16:38   #57
leonid
Оператор ЭВМ
 
Регистрация: 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
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
    
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
нэ?
---
позволил себе добавить несколько констант. теперь если нужно будет заменить графику (поставить спрайты другого размера, увеличить их количество) или поменять размерность этапов, то не нужно будет переписывать весь код, а достаточно поменять значения нескольких констант. ну, это так, на будущее.
__________________
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)
Старый 11.11.2011, 19:15   #59
PassCall
Разработчик
 
Аватар для PassCall
 
Регистрация: 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_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 - если вообще никакая кнопка не нажата

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

Всё гениальное - просто.

http://passcall.ucoz.com
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
leonid (11.11.2011)
Старый 11.11.2011, 19:43   #60
leonid
Оператор ЭВМ
 
Регистрация: 01.11.2011
Сообщений: 35
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Помогите исправить ошибку

Спасибо!
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com