Есть программа, делающа непрерывную отрисовку с помощью repeat. Если используется структура
.... repeat .... until Keypressed;
на экраине идет непрерывная отрисовка, до нажатия любой клавиши. Но если поменять на
.... repeat .... until Readkey='q';
Программа выходит по нажатию клавиши q, но работает только при нежатии любой другой клавиши(нажал и не отпускаешь). Как совместить непрерывность отрисовки с управлением с клавиатуры?
andriano
6.01.2008 3:57
readkey ждет нажатия клавиши, поэтому работа программы приостанавливается. Проще всего организовать примерно так:
repeat ch := #0; // забываем предшествующее состояние if keypressed then begin ch := readkey; case ch of ... // обработка нужных клавиш - изменение состояния end; //case end; DrawScreen; // отрисовка нового состояния с учетом нажатых клавиш и прошедшего времени until (ch = 'q') or (ch = 'Q'); // заботимся, чтобы работа программы не зависела от состояния Caps Lock
Чужак
6.01.2008 4:29
Спасибо, работает.
Чужак
9.01.2008 3:52
Еще один вопрос. Я сделал-переменные меняются по нажатию клавиши, изменяя параметры отрисовки в непрерывном режиме. Но как вывести текущее значение переменной на экран в режиме Graph?/ Либо как вообще выводятся переменные на экран в этом режиме?
volvo
9.01.2008 3:59
Цитата
как вообще выводятся переменные на экран в этом режиме?
Переменные или их значения? Значения - переводятся в строку и печатаются (outtext/outtextxy)
Чужак
9.01.2008 4:03
Цитата(volvo @ 8.01.2008 23:59)
Переменные или их значения? Значения - переводятся в строку и печатаются (outtext/outtextxy)
Их значения. И все происходит при непрерывной отрисовке на экране. При этом значения переменных меняются с клавиатуры (соответственно меняются параметры отрисовки).
Чужак
15.01.2008 4:58
to adriano-был по твоей ссылке. Спрайтовая анимация-интересно, но ли это самый простой способ вывести значения переменных на экран в режиме Graph?
Цитата(volvo @ 8.01.2008 23:59)
Переменные или их значения? Значения - переводятся в строку и печатаются (outtext/outtextxy)
Как это сделать? Как значение переменной типа Integer или Real перевести в строку и вывести на экран в ходе цикла (оно ведь меняется при нажатии кнопки)?
volvo
15.01.2008 13:11
Цитата
Как значение переменной типа Integer или Real перевести в строку и вывести на экран в ходе цикла
Показать кусок кода, что именно у тебя там происходит, КАК собственно меняется значение и КОГДА ты хочешь его выводить (и перестать делать заключение, что вокруг тебя находятся одни телепаты)...
Ну, и посмотреть доки неплохо было бы: Str + F1 получаешь готовую реализацию IntToStr. С вещественными - аналогично...
Чужак
16.01.2008 1:16
Цитата(volvo @ 15.01.2008 9:11)
Показать кусок кода, что именно у тебя там происходит, КАК собственно меняется значение и КОГДА ты хочешь его выводить (и перестать делать заключение, что вокруг тебя находятся одни телепаты)...
Сейчас покажу. В теме "Графика. Двужущаяся точка. Точка совершает колебания" я приводил программу
program VisualSinusoid; Uses Crt, Graph; Const r = 80; Label 1; Var gd, gm: Integer; t,X,Y: Real; Begin InitGraph(gd,gm,''); t:=0; 1: X:=280; SetColor(15); Circle(120,240,r); SetColor(2); Line(120, 240, Round(120+r*cos(t)), Round(240+r*sin(t))); Line(Round(120+r*cos(t)), Round(240+r*sin(t)), 280, Round(240+r*sin(t)) ); X:=X+1; Y:=240+r*sin(t); PutPixel(Round(X), Round(Y), 11); Delay(300); SetColor(0); Line(120, 240, Round(120+r*cos(t)), Round(240+r*sin(t))); Line(Round(120+r*cos(t)), Round(240+r*sin(t)), 280, Round(240+r*sin(t))); t:=t+0.05; if X>600 then begin ClearDevice; goto 1; end until KeyPressed; CloseGraph End.
теперь её усложняю. Вместо
program VisualSinusoid; Uses Crt, Graph; Const r = 80; Label 1; Var gd, gm: Integer; t,X,Y: Real; Begin InitGraph(gd,gm,''); t:=0;
r становится переменной:
program VisualSinusoid; Uses Crt, Graph; Label 1; Var gd, gm,r: Integer; t,X,Y: Real; ch:char; Begin InitGraph(gd,gm,''); t:=0; r = 80;
и появляется процедура:
Procedure Upravlenie; Begin {procedure} ch:=#0; if keypressed then begin ch:=readkey; case ch of 'i': r:=r+1; 'e': r:=r-1; .... end; {case} end; {if} End;{procedure}
она вызывается из тела программы (из цикла). Все работает, но как выводить на экран значение r?
volvo
16.01.2008 1:29
Цитата
как выводить на экран значение r?
Очень просто: появляется функция
function IntToStr(i: Longint): String; var s: string; begin Str(i, s); IntToStr := s; end;
в конце процедуры Upravlenie делается:
setfillstyle(solidfill, getbkcolor); bar(...); { тут дашь координаты, чтобы затереть старое значение } outtextxy(..., IntToStr®); { <--- выводишь в том же месте новое значение }
Вот и все...
Гость
21.01.2008 0:49
еще 1 способ
var
key : char
begin
if keypressed = true then
begin
key := readkey ;
case ord(key) of .........
end;
end;
andriano
21.01.2008 12:39
Цитата(Гость @ 20.01.2008 20:49)
еще 1 способ ...
И чем этот способ отличается от приведенного в посте №2? Только наличием безграмотной конструкции keypressed = true? Почему тогда не ((keypressed = true) = true) = true?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.