как обойтись без delay?

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
v1nt
Сообщения: 6
Зарегистрирован: 07 июл 2004, 16:26
Откуда: СПб

07 июл 2004, 17:11

Помогите пожалуйста вот с чем.
Никак не могу придумать:
Допустим пишем тетрис (фигурки падают медленно)
допутим напишем что-нибудь вроде:
while (не дно) do begin
фигура1.шаг вниз;
delay(50000);
if KeyPressed = true
then
операторы, действ при нажатии разл. клавишь;
end;

понятно, что при нажатии клавишь <лево>, <право> и т.д.
сдвигаться на 1 шаг влево или вправо фигура будет только одновременно с шагом вниз.
А хочется чтобы, т.к. скорость спуска маленькая, за 1 шаг вниз можно было бы переместить фигуру например от одного края к другому.
Не могу придумать как это сделать... помогите плз...
Я думал нужно delay либо не так использовать, либо совсем не использовать, т.к. как я понимаю он приостанавоивает все процессы.
Наверное слишком длинно написал простой вопрос. )))
Не обессуте если вопрос совсем простой ))

заранее спасибо
to be continue...
v1nt
Сообщения: 6
Зарегистрирован: 07 июл 2004, 16:26
Откуда: СПб

07 июл 2004, 19:53

ну я глупенький )))
уже не нада
to be continue...
GOS
Сообщения: 111
Зарегистрирован: 17 фев 2004, 10:32
Контактная информация:

08 июл 2004, 10:21

Поведай миру о решении! :)
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

08 июл 2004, 14:00

Всё очень просто :) Двигать вниз фигуру нужно таймером, а вправо-влево - по сообщениям WM_KEYDOWN и WM_KEYUP.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
v1nt
Сообщения: 6
Зарегистрирован: 07 июл 2004, 16:26
Откуда: СПб

15 июл 2004, 17:08

Хм... Собственно говоря дело происходит в TP а не в Делфях.

P. S. то что я сделал мне не особо нравиться..так что предложения все еще рассматриваются )))
to be continue...
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

15 июл 2004, 17:29

ТОГДА ТАК:

Delay вызыватеся в цикле и его период очень маленький (например 200-300). После каждого delay'я производится опрос клавиатуры (readkey) и выполняются действия в соответствии с нажатыми клавишами, потом очищается буфер клавиатуры чтобы не было противного писка при зажатой клавише, а затем происходит увеличение некого счётчика итераций и если он (т.е. счётчик) достиг некого порогового значения, то счётчик сбрасывается в ноль, а фигура спускается на одну клеточку вниз.

Получается, что пока фигура ещё висит и не сделала шаг вниз можно её успеть провернуть несколько раз и вволю подвигать, если порогове значение достаточно велико. (Вообще эта величина, как ты наверное заметил, обратно пропорциональна скорости "падения" фигуры)

Я думаю вышеуказанный способ - самый оптимальный из тех, что можно придумать под DOS. С ростом очков, которые начисляются за убранные линии можно уменьшать пороговое значение для счётчика итераций, что приведёт, естественно, к увеличению скорости "падения" фигуры.

Всё - реализуй. Если возникнут вопросы, то пиши - помогу. Я когда только начинал учится прораммировать, то писал по несколько версий игрушек: тетрис, пин-понг, змейка и т.д. на каждом языке прораммирования, который осваивал. Так что я по прежнему полон идей. Если будет интересно - подкину.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

15 июл 2004, 17:42

Я думаю если мы перехватим прерывание клавиатуры и будем двигать фигурки оттуда, то нам delay'и по боку будут.
*provided AS IS
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

15 июл 2004, 17:47

Верно, господин куратор ассемблерного форума, но я думаю, что это не совсем тривиальный способ для начинающих и вообще предпочитаю следовать своему девизу :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
v1nt
Сообщения: 6
Зарегистрирован: 07 июл 2004, 16:26
Откуда: СПб

15 июл 2004, 18:45

пасиба
to be continue...
Ответить