Помощь - Поиск - Пользователи - Календарь
Полная версия: Подпрограмма
Форум «Всё о Паскале» > Pascal, Object Pascal > Написание игр
1234
Кто знает, как создать подпрграмму по созданию задержки(скажем в 1 секунду). Так, например, в игре она необходима для того, чтобы объект с определённой скорстью совершал движение. Cпасибо за внимание.
klem4

Delay(ms: Word);


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


Ну если не вкатывает то это совсем другое дело, {$TELEPATHY ON} ...
1234
Необходимо использовать процедуру GetTime. Кстати, какую посоветуете подобрать менюшку(самую простую).
volvo
Зачем ты для организации паузы хочешь использовать процедуру, возвращающую системное время - непонятно... Я не говорю, что это невозможно, в принципе, можно и извратиться, например, так:

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

( реализация функции GetTime - здесь: Quicksort )

Только нужно ли это? unsure.gif
TarasBer
Цитата(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
Хотелось бы услышать от автора, по какой причине нельзя использовать Delay(1000) ?
volvo
TarasBer,
Цитата
Итак: НИКАКОГО GetTime!
Никаких лишних модулей!
А давай, ТЫ не будешь решать за автора, что ему ДА использовать, а что - НЕТ, договорились? А то слишком самоуверенно получается, вроде как ДО тебя об этом не знали, а ты пришел, и всех научил... Да, кстати, в том, что ты привел, есть одно маленькое НО, которое моментально превращается в ОГРОМНОЕ - ты не знаешь, какой компилятор используется... Попробуй написать программу, работающую по ТВОЕМУ алгоритму, и скомпилировать ее в FPC, например... Получится?

А раздел, я бы хотел напомнить, НЕ чисто Паскалевский, так что решение должно быть по крайней мере переносимо, а не рассчитано ТОЛЬКО на Турбо Паскаль...
TarasBer
Цитата(klem4 @ 31.01.2007 21:35) *

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

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

Цитата

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

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

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


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

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


Ну так можно сделать параметр Delay переменной (в разных местах с разными коэффициентами) и позволить пользователю изменять значение этой переменной дабы настроить программу ...
TarasBer
Цитата(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
Цитата
И меняется это значение чуть ли не каждую тысячную долю секунды (винда такты считает что ли?)

Системный таймер наверно...
1234
Хорошо. Здесь вроде бы понятно. Спасибо за советы. А что насчёт менюшки.
TarasBer
Цитата(1234 @ 1.02.2007 18:53) *

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


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

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


Поиск -> menu

Выкладывались и текстовые и графические версии
volvo
Цитата(1234)
А что насчёт менюшки.

Смотри в поиске, вот здесь: Меню в Паскале
или здесь: http://volvo71.narod.ru/menus.htm

Цитата(TarasBer)
Могу кусок кода написать, если попросите.
dry.gif Можешь не писать... Одолжение что-ли делаешь? Спасибо, обойдемся...
1234
Из любезно предоставленного списка(спасибо volvo) меня более других заинтересовало меню во фрейме(из одноимённого раздела) по кодовым словом asd. Остаётся вопрос: как можно выбирать стрелками "вверх" и "вниз" нужный раздел(прчём, чтобы он высвечивался).
volvo
Цитата
как можно выбирать стрелками "вверх" и "вниз" нужный раздел (прчём, чтобы он высвечивался)
Если ты внимательно читал информацию по приведенным ссылкам, то там (везде, кстати) есть как раз то, что нужно - как ждать нажатия клавиши, как выбирать цвет активной/неактивной строки, и все остальное... Отрисовал то, что тебе очень уж понравилось, и после вызова Bar3D начинай цикл обработки клавиатуры (вместо трех OutTextXY)...

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

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

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

Файл удален...
st1x
задержу можно ещё выполнять командой
sleep(2000) ну место 2000 можно хоть сколько ставить
ну 2000 это вроде милисекунд а не секунд 2000
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.