Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Написание игр _ Подпрограмма

Автор: 1234 31.01.2007 21:40

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

Автор: klem4 31.01.2007 21:52


Delay(ms: Word);



Автор: 1234 31.01.2007 23:12

Да, но в моей программе данная проедура не вкатывает:нужно конкретно задержка в 1 секунду. Не всё так просто

Автор: klem4 31.01.2007 23:17

Цитата
проедура не вкатывает


Ну если не вкатывает то это совсем другое дело, {$TELEPATHY ON} ...

Автор: 1234 31.01.2007 23:23

Необходимо использовать процедуру GetTime. Кстати, какую посоветуете подобрать менюшку(самую простую).

Автор: volvo 31.01.2007 23:34

Зачем ты для организации паузы хочешь использовать процедуру, возвращающую системное время - непонятно... Я не говорю, что это невозможно, в принципе, можно и извратиться, например, так:

curr_time := GetTime;
while GetTime - curr_time < 100 do; { время - в сотых долях секунды }

( реализация функции GetTime - здесь: http://forum.pascal.net.ru/index.php?s=&showtopic=8585&view=findpost&p=58499 )

Только нужно ли это? unsure.gif

Автор: TarasBer 1.02.2007 1:28

Цитата(1234 @ 31.01.2007 17:40) *

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


Итак: НИКАКОГО GetTime!
Никаких лишних модулей!
Делаем быстро, ёмко и эффективно.
В разделе переменных пишем:

var
Time: longint absolute $0040: $006C;
T: longint;


Итак, мы завели 2 переменные: Time - это количество 55милисекундных интервалов, прошедших с полуночи (точнее: один такой интервал по времени - это $10000/$1234DC секунд). Значение переменной Time присваивается автоматически железом, потому что она расположена точно по адресу системного времени. А мы можем спокойно её считывать.
Можно, конечно, не заводить вообще этой переменной, и вместо Time писать каждый раз MemL[$0040: $006C], но так по-моему лучше.
Далее, переменная T - вспомогательная.
Если надо, чтобы программа поворяла один и тот же цикл, делая в каждом цикле задержку 55 млс, то в каждом цикле пишем:

repeat
...
while T = Time do; {упаси бог забыть это двоеточие: иначе программа зависнет}
T := Time;
until ...


причём это T должно использоваться ТОЛЬКО в этом участке кода: иначе программа полетит с неимоверной скоростью.
А задержка в одну секунду (приблизительно) делается так:

for i := 0 to 18 do begin {18.2 - число 55млсекундных интервалов в секунде}
while T = Time do;
T := Time;
end;


Это будет задержка не совсем точно в 1сек, но бОльшей точности на Павкале не достичь.
Также с помощью Time можно мерять время.

Автор: klem4 1.02.2007 1:35

Хотелось бы услышать от автора, по какой причине нельзя использовать Delay(1000) ?

Автор: volvo 1.02.2007 1:53

TarasBer,

Цитата
Итак: НИКАКОГО GetTime!
Никаких лишних модулей!
А давай, ТЫ не будешь решать за автора, что ему ДА использовать, а что - НЕТ, договорились? А то слишком самоуверенно получается, вроде как ДО тебя об этом не знали, а ты пришел, и всех научил... Да, кстати, в том, что ты привел, есть одно маленькое НО, которое моментально превращается в ОГРОМНОЕ - ты не знаешь, какой компилятор используется... Попробуй написать программу, работающую по ТВОЕМУ алгоритму, и скомпилировать ее в FPC, например... Получится?

А раздел, я бы хотел напомнить, НЕ чисто Паскалевский, так что решение должно быть по крайней мере переносимо, а не рассчитано ТОЛЬКО на Турбо Паскаль...

Автор: TarasBer 1.02.2007 4:08

Цитата(klem4 @ 31.01.2007 21:35) *

Хотелось бы услышать от автора, по какой причине нельзя использовать Delay(1000) ?

Причина в том, что задержка очень сильно зависит от компьютера. У меня, например, этот делэй даёт отнюдь не секунду, а намного меньше.

Цитата

А давай, ТЫ не будешь решать за автора, что ему ДА использовать, а что - НЕТ, договорились? А то слишком самоуверенно получается, вроде как ДО тебя об этом не знали, а ты пришел, и всех научил... Да, кстати, в том, что ты привел, есть одно маленькое НО, которое моментально превращается в ОГРОМНОЕ - ты не знаешь, какой компилятор используется... Попробуй написать программу, работающую по ТВОЕМУ алгоритму, и скомпилировать ее в FPC, например... Получится?

А раздел, я бы хотел напомнить, НЕ чисто Паскалевский, так что решение должно быть по крайней мере переносимо, а не рассчитано ТОЛЬКО на Турбо Паскаль...

Я на ТЫ не обращался ни к кому... Хамите, молодой человек...
Да, такой метод пригоден только для досовского паскаля. Если у автора темы именно турбо паскаль, то я всё правильно сказал. Если нет - то извините.

Автор: klem4 1.02.2007 16:00

Цитата
Я на ТЫ не обращался ни к кому


Боюсь тебя огорчить, но это интернет, а не деловая встреча ...

Цитата
Причина в том, что задержка очень сильно зависит от компьютера. У меня, например, этот делэй даёт отнюдь не секунду, а намного меньше.


Ну так можно сделать параметр Delay переменной (в разных местах с разными коэффициентами) и позволить пользователю изменять значение этой переменной дабы настроить программу ...

Автор: TarasBer 1.02.2007 17:32

Цитата(klem4 @ 1.02.2007 12:00) *

Боюсь тебя огорчить, но это интернет, а не деловая встреча ...
Ну так можно сделать параметр Delay переменной (в разных местах с разными коэффициентами) и позволить пользователю изменять значение этой переменной дабы настроить программу ...


В таком случае предлагаю такой вариант:

for i := 0 to ms - 1 do {для большего эффекта можно вместо 10 написать r, где r - типа real}
D := sin(cos(arctan(10))); {или включить эмуляцию сопроцессора}


Естественно, выключив оптимизацию.
Даже без цээртэ обошлись.
Параметр ms пусть каждый сам подбирает...

Всё-таки Delay это несерьёзно. Надо смотреть на время. В Паскале для это есть обращение к конкретному адресу, а в дельфе есть функция Time возвращающая значение типа double, причём единица - это 1 год. И меняется это значение чуть ли не каждую тысячную долю секунды (винда такты считает что ли?)

Автор: Altair 1.02.2007 21:44

Цитата
И меняется это значение чуть ли не каждую тысячную долю секунды (винда такты считает что ли?)

Системный таймер наверно...

Автор: 1234 1.02.2007 22:53

Хорошо. Здесь вроде бы понятно. Спасибо за советы. А что насчёт менюшки.

Автор: TarasBer 2.02.2007 0:30

Цитата(1234 @ 1.02.2007 18:53) *

Хорошо. Здесь вроде бы понятно. Спасибо за советы. А что насчёт менюшки.


На такой вопрос могу ответить только вопросом. Что вы называете менюшкой? Если полноценный интерфейс, то: в чём вы пишете? Если в дельфе, то там менюшку без проблем сделать. Паскаль - если программа будет в текстовом режиме - то турбо вижн есть (сам с ним никогда не работал, если честно). А для графического режима... Я, когда мне понадобилось, сам руками всё писал. Довольно увлекательно, между прочим.

А если примитивную менюшку, то не знаю... Ну по центру просто выводишь несколько строчек, и одна из них обведена прямоугольником. А стрелочки прямоугольник двигают. И ентер выбирает то, что нужно. Могу кусок кода написать, если попросите.

Автор: klem4 2.02.2007 0:40

Цитата
А что насчёт менюшки


Поиск -> menu

Выкладывались и текстовые и графические версии

Автор: volvo 2.02.2007 2:49

Цитата(1234)
А что насчёт менюшки.

Смотри в http://forum.pascal.net.ru/index.php?act=Search&f=13, вот здесь: http://forum.pascal.net.ru/index.php?showtopic=15546
или здесь: http://volvo71.narod.ru/menus.htm

Цитата(TarasBer)
Могу кусок кода написать, если попросите.
dry.gif Можешь не писать... Одолжение что-ли делаешь? Спасибо, обойдемся...

Автор: 1234 2.02.2007 20:05

Из любезно предоставленного списка(спасибо volvo) меня более других заинтересовало меню во фрейме(из одноимённого раздела) по кодовым словом asd. Остаётся вопрос: как можно выбирать стрелками "вверх" и "вниз" нужный раздел(прчём, чтобы он высвечивался).

Автор: volvo 2.02.2007 21:02

Цитата
как можно выбирать стрелками "вверх" и "вниз" нужный раздел (прчём, чтобы он высвечивался)
Если ты внимательно читал информацию по приведенным ссылкам, то там (везде, кстати) есть как раз то, что нужно - как ждать нажатия клавиши, как выбирать цвет активной/неактивной строки, и все остальное... Отрисовал то, что тебе очень уж понравилось, и после вызова Bar3D начинай цикл обработки клавиатуры (вместо трех OutTextXY)...

Меню - это такое неблагодарное дело, которое никто от начала и до конца ЗА ТЕБЯ делать не будет, ибо то, что нравится тебе не вызывает у меня ничего, кроме стремления поберечь глаза и закрыть быстро эту программу... Так что... Набросок у тебя есть (и не один, а целых 4) - дорабатывай...

Будут КОНКРЕТНЫЕ вопросы - приходи... А то ты уже и так отклонился от темы топика (не забыл, для чего она создавалась?) - не про меню она была, не надо делать из темы бардак...

Автор: Тём@ 11.02.2007 5:48

Не знаю нужно ли это ещё. Когда-то написал для задержки на определённое время. Не идеально конечно... Попробуйте nea.gif

http://forum.pascal.net.ru/rules.html (пункт 10) - архив не содержащий исходников удален...

Автор: volvo 11.02.2007 5:55

То есть, читать Правила ты не изволишь? Я про пункт №10 - не выкладываются программы без исходников. Это непонятно? Не хочешь показывать - сиди и любуйся на свои исходники... А в TPU я тебе и функцию форматирования диска засуну под видом процедуры сортировки nea.gif

Файл удален...

Автор: st1x 23.03.2012 23:07

задержу можно ещё выполнять командой
sleep(2000) ну место 2000 можно хоть сколько ставить
ну 2000 это вроде милисекунд а не секунд 2000