как обойтись без delay?
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Помогите пожалуйста вот с чем.
Никак не могу придумать:
Допустим пишем тетрис (фигурки падают медленно)
допутим напишем что-нибудь вроде:
while (не дно) do begin
фигура1.шаг вниз;
delay(50000);
if KeyPressed = true
then
операторы, действ при нажатии разл. клавишь;
end;
понятно, что при нажатии клавишь <лево>, <право> и т.д.
сдвигаться на 1 шаг влево или вправо фигура будет только одновременно с шагом вниз.
А хочется чтобы, т.к. скорость спуска маленькая, за 1 шаг вниз можно было бы переместить фигуру например от одного края к другому.
Не могу придумать как это сделать... помогите плз...
Я думал нужно delay либо не так использовать, либо совсем не использовать, т.к. как я понимаю он приостанавоивает все процессы.
Наверное слишком длинно написал простой вопрос. )))
Не обессуте если вопрос совсем простой ))
заранее спасибо
Никак не могу придумать:
Допустим пишем тетрис (фигурки падают медленно)
допутим напишем что-нибудь вроде:
while (не дно) do begin
фигура1.шаг вниз;
delay(50000);
if KeyPressed = true
then
операторы, действ при нажатии разл. клавишь;
end;
понятно, что при нажатии клавишь <лево>, <право> и т.д.
сдвигаться на 1 шаг влево или вправо фигура будет только одновременно с шагом вниз.
А хочется чтобы, т.к. скорость спуска маленькая, за 1 шаг вниз можно было бы переместить фигуру например от одного края к другому.
Не могу придумать как это сделать... помогите плз...
Я думал нужно delay либо не так использовать, либо совсем не использовать, т.к. как я понимаю он приостанавоивает все процессы.
Наверное слишком длинно написал простой вопрос. )))
Не обессуте если вопрос совсем простой ))
заранее спасибо
to be continue...
ну я глупенький )))
уже не нада
уже не нада
to be continue...
Поведай миру о решении! 

- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Всё очень просто
Двигать вниз фигуру нужно таймером, а вправо-влево - по сообщениям WM_KEYDOWN и WM_KEYUP.

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Хм... Собственно говоря дело происходит в TP а не в Делфях.
P. S. то что я сделал мне не особо нравиться..так что предложения все еще рассматриваются )))
P. S. то что я сделал мне не особо нравиться..так что предложения все еще рассматриваются )))
to be continue...
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
ТОГДА ТАК:
Delay вызыватеся в цикле и его период очень маленький (например 200-300). После каждого delay'я производится опрос клавиатуры (readkey) и выполняются действия в соответствии с нажатыми клавишами, потом очищается буфер клавиатуры чтобы не было противного писка при зажатой клавише, а затем происходит увеличение некого счётчика итераций и если он (т.е. счётчик) достиг некого порогового значения, то счётчик сбрасывается в ноль, а фигура спускается на одну клеточку вниз.
Получается, что пока фигура ещё висит и не сделала шаг вниз можно её успеть провернуть несколько раз и вволю подвигать, если порогове значение достаточно велико. (Вообще эта величина, как ты наверное заметил, обратно пропорциональна скорости "падения" фигуры)
Я думаю вышеуказанный способ - самый оптимальный из тех, что можно придумать под DOS. С ростом очков, которые начисляются за убранные линии можно уменьшать пороговое значение для счётчика итераций, что приведёт, естественно, к увеличению скорости "падения" фигуры.
Всё - реализуй. Если возникнут вопросы, то пиши - помогу. Я когда только начинал учится прораммировать, то писал по несколько версий игрушек: тетрис, пин-понг, змейка и т.д. на каждом языке прораммирования, который осваивал. Так что я по прежнему полон идей. Если будет интересно - подкину.
Delay вызыватеся в цикле и его период очень маленький (например 200-300). После каждого delay'я производится опрос клавиатуры (readkey) и выполняются действия в соответствии с нажатыми клавишами, потом очищается буфер клавиатуры чтобы не было противного писка при зажатой клавише, а затем происходит увеличение некого счётчика итераций и если он (т.е. счётчик) достиг некого порогового значения, то счётчик сбрасывается в ноль, а фигура спускается на одну клеточку вниз.
Получается, что пока фигура ещё висит и не сделала шаг вниз можно её успеть провернуть несколько раз и вволю подвигать, если порогове значение достаточно велико. (Вообще эта величина, как ты наверное заметил, обратно пропорциональна скорости "падения" фигуры)
Я думаю вышеуказанный способ - самый оптимальный из тех, что можно придумать под DOS. С ростом очков, которые начисляются за убранные линии можно уменьшать пороговое значение для счётчика итераций, что приведёт, естественно, к увеличению скорости "падения" фигуры.
Всё - реализуй. Если возникнут вопросы, то пиши - помогу. Я когда только начинал учится прораммировать, то писал по несколько версий игрушек: тетрис, пин-понг, змейка и т.д. на каждом языке прораммирования, который осваивал. Так что я по прежнему полон идей. Если будет интересно - подкину.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Я думаю если мы перехватим прерывание клавиатуры и будем двигать фигурки оттуда, то нам delay'и по боку будут.
*provided AS IS
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Верно, господин куратор ассемблерного форума, но я думаю, что это не совсем тривиальный способ для начинающих и вообще предпочитаю следовать своему девизу 

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
пасиба
to be continue...