Помощь - Поиск - Пользователи - Календарь
Полная версия: Не двигается(((
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
justix
Мне нужно движение вне массива,так как сам герой у меня больше блоков.Вроде всё прописал а он не двигается.
вот код,подскажите в чём ошибка пожалуйста.


uses graph,crt;

const n=25;
dx=27;
dy=22;
up=#72;
left=#75;
right=#77;
down=#80;
esc=#27;
probel=#32;
enter=#13;
type massiv = array[1..n,1..n] of integer;

const a:massiv=((3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,4,2),
(2,0,0,0,8,0,0,0,0,0,8,0,0,0,0,8,0,0,0,0,0,0,0,4,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2),
(2,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2),
(2,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
(2,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
(2,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
(2,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
(2,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
(2,8,0,4,0,0,7,0,0,0,8,0,0,0,8,0,0,0,0,8,0,0,0,0,2),
(2,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2),
(2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,4,0,2),
(2,0,8,0,8,0,0,0,0,8,0,0,0,8,0,0,0,8,0,0,0,0,4,0,2),
(2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,2),
(2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2));


var p_zem,p_nebo,p_deva,p_dev,p_devs,p_yabloko,p_pulya,p_snaryad,p_yablonya,p_ship,p
_volk1,p_volk2,p_volkk,p_stypen,p_stena:pointer;
x0,y0,gd,gm,x_deva,y_deva,dx_deva,dy_deva:integer;
tab:massiv;
ch:char;

procedure load_image(name_file:string; var p:pointer);
var f:file;
size:word;
begin
assign(f,name_file);
reset(f,1);
size:=filesize(f);
getmem(p,size);
blockread(f,p^,size);
close(f);
end;

procedure initpict;
begin
load_image('zemlya',p_zem);
load_image('nebo',p_nebo);
load_image('stena',p_stena);
load_image('stypen',p_stypen);
load_image('devochka',p_deva);
load_image('volk',p_volk1);
load_image('volk',p_volk2);
load_image('ship',p_ship);
load_image('yabloko',p_yabloko);
load_image('yablonya',p_yablonya);
load_image('volkk',p_volkk);
load_image('devochk',p_dev);
load_image('devochks',p_devs);
load_image('pulya',p_pulya);
load_image('snaryad',p_snaryad);
end;

Procedure upr_move(var x,y:integer;dx,dy:integer;p:pointer);
begin

ch:=readkey;
if ch=#0 then
begin
ch:=readkey;
putimage(x,y,p^,xorput);
Case ch of
left: x:=x-dx;
right: x:=x+dx;
up: y:=y-dy;
down:y:=y+dy;
end;
putimage(x,y,p^,xorput);
end;
end;

procedure initdata;
begin
x_deva:=320;
y_deva:=510;
dx_deva:=20;dy_deva:=20;
putimage (x_deva,y_deva,P_deva^,xorput);
end;

procedure drawlab;
var x,y,i,k:integer;
begin
cleardevice;
x0:=150;
y0:=50;
for i:=1 to n do
for k:=1 to n do
tab[i, k]:=a[i, k];
for i:=1 to n do
for k:=1 to n do
begin
x:=x0+(k-1)*dx;
y:=y0+(i-1)*dy;
case tab[i,k] of
1: putimage(x,y,p_zem^,normalput);
2: putimage(x,y,p_stena^,normalput);
3: putimage(x,y,p_nebo^,normalput);
4: putimage(x,y,p_stypen^,normalput);
{ 5: begin
putimage(x,y,p_deva^,xorput);
i_devochka:=i;
k_devochka :=k;
tab[i, k]:=0;
end;}
6: putimage(x,y,p_volk1^,normalput);
7: putimage(x,y,p_ship^,normalput);
8: putimage(x,y,p_yabloko^,normalput);
9: putimage(x,y,p_volk2^,normalput);
10: putimage(x,y,p_yablonya,xorput);
end;
end;
end;

procedure game;
var x,y:integer;
begin
cleardevice;
drawlab;
initdata;
repeat
if keypressed then
upr_move(x_deva,y_deva,dx_deva,dy_deva,p_deva);
until ch=esc;
end;


begin
gd:=detect;
initgraph(gd,gm,'');
initpict;
game;
readln;
end.
TarasBer
А ты перерисовываешь новые положения? Или один раз нарисовал, а потом координаты меняешь?
justix
Цитата(TarasBer @ 19.12.2011 12:58) *

А ты перерисовываешь новые положения? Или один раз нарисовал, а потом координаты меняешь?

Procedure upr_move(var x,y:integer;dx,dy:integer;p:pointer);
begin

ch:=readkey;
if ch=#0 then
begin
ch:=readkey;
putimage(x,y,p^,xorput); <----стёр в старом положении
Case ch of
left: x:=x-dx;
right: x:=x+dx;
up: y:=y-dy;
down:y:=y+dy;
end;
putimage(x,y,p^,xorput); <---нарисовал уже в новом
end;
end;


Ну вроде рисую

Добавлено через 18 мин.
Цитата(justix @ 19.12.2011 14:21) *

Procedure upr_move(var x,y:integer;dx,dy:integer;p:pointer);
begin

ch:=readkey;
if ch=#0 then
begin
ch:=readkey;
putimage(x,y,p^,xorput); <----стёр в старом положении
Case ch of
left: x:=x-dx;
right: x:=x+dx;
up: y:=y-dy;
down:y:=y+dy;
end;
putimage(x,y,p^,xorput); <---нарисовал уже в новом
end;
end;
Ну вроде рисую

А вроде у меня он просто напросто клавиатуру не отслеживаетОоПотому что другие самые простенькие программы он и там не двигает и даже интер и ескейп не робятОо
TarasBer
Так ты отладку запусти.
Допиши что-нибудь в код обработки нажатия клавиши, чтобы было сразу видно, что это произошло.
Поставь там точку прерывания программы.

И используй же теги! А то неформатированный код читать невозможно.
justix
Цитата(TarasBer @ 19.12.2011 15:10) *

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

И используй же теги! А то неформатированный код читать невозможно.

Извини,как теги использовать не знаю(((
И как отладку делать с чем то дописыванием в код обработки нажатия клавиши,подскажи пожалуйста.
TarasBer
> Извини,как теги использовать не знаю(((

Ну блин, перед кодом пишешь

{code=pas} (только скобочки квадратные, а не круглые)

а после - {/code}

Или выделяешь код и нажимаешь на жирную надпись CODE, что над формой ответа, выбираешь Pascal

> И как отладку делать с чем то дописыванием в код обработки нажатия клавиши,подскажи пожалуйста.

Ну ставишь курсор на нужную строчку и дальше жмёшь Debug->Breakpoints-> Add Breakpoint. Всё, теперь программа будет останавливаться при достижении этой строчки.
justix
Цитата(TarasBer @ 19.12.2011 15:33) *

> Извини,как теги использовать не знаю(((

Ну блин, перед кодом пишешь

{code=pas} (только скобочки квадратные, а не круглые)

а после - {/code}

Или выделяешь код и нажимаешь на жирную надпись CODE, что над формой ответа, выбираешь Pascal

> И как отладку делать с чем то дописыванием в код обработки нажатия клавиши,подскажи пожалуйста.

Ну ставишь курсор на нужную строчку и дальше жмёшь Debug->Breakpoints-> Add Breakpoint. Всё, теперь программа будет останавливаться при достижении этой строчки.

Тааак,и что мне это должно дать?
поставил где в процедуре Upr_move "ch:=readkey;" запустилось и показалась ошибка.ВсёОо
TarasBer
Что за ошибка, что написано?
justix
Цитата(TarasBer @ 19.12.2011 15:48) *

Что за ошибка, что написано?

Run time error 4211795
error addres $00000000
TarasBer
А если убрать точку остановки (то есть сам текст кода не трогать, только само красное выделение убрать), то всё работает нормально?
justix
Цитата(TarasBer @ 19.12.2011 16:02) *

А если убрать точку остановки (то есть сам текст кода не трогать, только само красное выделение убрать), то всё работает нормально?

Да,запускается,рисуется,но не двигается(((
TarasBer
Впервые вижу такое, чтобы точка остановки заставляла программу вылетать.
Короче, я чуть позже попробую запустить твою программу (сейчас не могу), отпишусь.
justix
Цитата(TarasBer @ 19.12.2011 16:11) *

Впервые вижу такое, чтобы точка остановки заставляла программу вылетать.
Короче, я чуть позже попробую запустить твою программу (сейчас не могу), отпишусь.

я думаю это связано с самим паскалем,мб не такой какой то.
Давай я те тогда папку с картинками скину чтоб спокойно запускал?
TarasBer
Папку заархивируй и тоже сюда выложи.
(я не могу запускать, потому что винда блин семёрка)
justix
Цитата(TarasBer @ 19.12.2011 16:19) *

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

-TarasBer-
У тебя какая версия Паскаля?
Потому что у меня на ТП-7 твои файлы читаются неверно, на экране фигня.
justix
Цитата(-TarasBer- @ 19.12.2011 17:47) *

У тебя какая версия Паскаля?
Потому что у меня на ТП-7 твои файлы читаются неверно, на экране фигня.

Free PAscal 2.4.4
IUnknown
justix, скажи, ты когда что-то выкладываешь, ты вообще задумываешься, ответят тебе, или нет? Тебе это важно? Судя по содержимому архива - не очень: ты в первом посте привел код, для которого надо по меньшей мере в ТРИ РАЗА больше картинок, чем есть у тебя в проекте!!! В чем смысл? Выложить EXE-шник, и думать, что кто-то его будет запускать? Толку от этого - ноль, нужно видеть код, чтоб сказать, в чем проблема.

Либо выкладывай ИСХОДНИК (со всеми необходимыми файлами для успешной компиляции и запуска), либо до свидания...

P.S. для того, чтобы при использовании FPC модуль CRT отслеживал нажатие клавиш, фокус ввода должен быть на консольном окне, а не на графическом. Или надо использовать WinGraph + WinCRT.
justix
Цитата(IUnknown @ 20.12.2011 10:37) *

justix, скажи, ты когда что-то выкладываешь, ты вообще задумываешься, ответят тебе, или нет? Тебе это важно? Судя по содержимому архива - не очень: ты в первом посте привел код, для которого надо по меньшей мере в ТРИ РАЗА больше картинок, чем есть у тебя в проекте!!! В чем смысл? Выложить EXE-шник, и думать, что кто-то его будет запускать? Толку от этого - ноль, нужно видеть код, чтоб сказать, в чем проблема.

Либо выкладывай ИСХОДНИК (со всеми необходимыми файлами для успешной компиляции и запуска), либо до свидания...

P.S. для того, чтобы при использовании FPC модуль CRT отслеживал нажатие клавиш, фокус ввода должен быть на консольном окне, а не на графическом. Или надо использовать WinGraph + WinCRT.

да у меня в архиве всё как бе есть....
А как сделать чтоб на консольном был?
IUnknown
Цитата
да у меня в архиве всё как бе есть....
"Как бэ" - это к окулисту. Вот содержимое твоего архива:
Где все выделенные файлы? Где исходник? Отсутствуют.
Нажмите для просмотра прикрепленного файла
Цитата
А как сделать чтоб на консольном был?
На панели задач выбрать окно FPC, а не "Graph Window Application", тогда фокус будет на консольном окне, и кнопки будут читаться (для запуска пришлось закомментировать в коде все, что касается отсутствующих картинок)

Нажмите для просмотра прикрепленного файла

Но лучше все-таки сделать свое приложение графическим (вообще не имеющим консольного окна) и работать с ним через WinGraph/WinCRT...
justix
Цитата(IUnknown @ 20.12.2011 17:18) *

"Как бэ" - это к окулисту. Вот содержимое твоего архива:
Где все выделенные файлы? Где исходник? Отсутствуют.
Нажмите для просмотра прикрепленного файла
На панели задач выбрать окно FPC, а не "Graph Window Application", тогда фокус будет на консольном окне, и кнопки будут читаться (для запуска пришлось закомментировать в коде все, что касается отсутствующих картинок)

Нажмите для просмотра прикрепленного файла

Но лучше все-таки сделать свое приложение графическим (вообще не имеющим консольного окна) и работать с ним через WinGraph/WinCRT...

Ой,извините,не всё закинулось значит(((
Блин,спасибо большое,а то голову сломал уже почему не работает(
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.