Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2012, 12:54   #1
LiuLiuJons
Форумчанин
 
Регистрация: 28.12.2011
Сообщений: 124
По умолчанию Задержка хода противника

Добрый день!
Проблема вот в чём - есть общий цикл программы, который описан в
Код:
void __fastcall TForm1::IdleLoop(TObject*, bool& done) // drawing in loop func
{
	done = false;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	Draw();
	glFlush();
	SwapBuffers(hdc);

}
Далее в процедуре Draw рисуются все элементы (фигуры). Однако мне необходимо задержать прорисовку конкретных элементов. У меня есть игрок и противник, и я хочу чтобы действие противника (=ход противника, компьютера) выполнялось с задержкой.
Если я прописываю в процедуре изменения положения противника функции наподобии Sleep(1000); - на это время задерживается прорисовка всего, тоесть и когда игрок (тоесть я например) двигаю фигуры - они у меня двигаются с задержкой.

Как сделать, чтобы только действие противника отображалось с задержкой?

Описала я наверное неочень понятно свою проблему, но не знаю как лучше это сделать..
"Думай не о задаче, а о решении" (с)
LiuLiuJons вне форума Ответить с цитированием
Старый 18.04.2012, 13:54   #2
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

не вполне четко представляю Вашу задачу..., но можно попробовать запускать прорисовку через таймер. Допустим есть переменная mDelay, дискретность таймера 100 мс; в каждом цикле анализируется значение mDelay: если не ноль, тогда декремент - и выполнение прорисовки, если обнулилось. При своем ходе устанавливаете mDelay в 1, а при ходе противника, допустим, 4.
nick42 вне форума Ответить с цитированием
Старый 19.04.2012, 11:55   #3
LiuLiuJons
Форумчанин
 
Регистрация: 28.12.2011
Сообщений: 124
По умолчанию

Пока реализовать не очень выходит - всё равно весь вывод приостанавливается..
Может я не до конца разобралась, что вы имели ввиду, вот тут:
Цитата:
в каждом цикле анализируется значение mDelay: если не ноль, тогда декремент - и выполнение прорисовки, если обнулилось
декремент переменной mDelay? Тоесть на один уменьшать значение каждый раз (и в случае с противником пройдёт цикл 4 раза, а в случае с игроком - один раз) когда вызывается процедура перерисовки?
"Думай не о задаче, а о решении" (с)
LiuLiuJons вне форума Ответить с цитированием
Старый 19.04.2012, 13:47   #4
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

- ну да; вот так, например:
Код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
      if (myDelay != 0)
        { if (--myDelay == 0)  doPaint(); }
}
nick42 вне форума Ответить с цитированием
Старый 19.04.2012, 15:22   #5
LiuLiuJons
Форумчанин
 
Регистрация: 28.12.2011
Сообщений: 124
По умолчанию

Не, так не выходит - начинается мигание, если я перерисовываю в таймере, а не в IdleLoop и плюс всё равно торможение как движения фигур противника, так и моих фигур.

Не хочется весь проект выкладывать, но попробую описать общую схему:
1.)Есть процедура IdleLoop, которая в Create зациклена:
Application->OnIdle = IdleLoop;

2.)IdleLoop выглядит, как я указывала выше.

3.)Далее в Draw() идёт прорисовка всего (то есть и фигур противника и моих).

4.)Потом изменение положения моих фигур обрабатывается в
FormMouseDown
и в конце этой процедуры вызывается само движение моих фигур и фигур противника вот так:
if (Move()) { OppMove();}
"Думай не о задаче, а о решении" (с)
LiuLiuJons вне форума Ответить с цитированием
Старый 19.04.2012, 15:44   #6
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Так, конечно, не пойдет. Ваш зацикленный IdleLoop не даст нормально работать даже таймеру. На мой вкус - этот Application->OnIdle - штука достаточно опасная и неудобная.
nick42 вне форума Ответить с цитированием
Старый 19.04.2012, 17:07   #7
LiuLiuJons
Форумчанин
 
Регистрация: 28.12.2011
Сообщений: 124
По умолчанию

Угу, наверное так и есть.. Только вот как сделать, чтобы перерисовка была нормальная без IdleLoop я не знаю.
"Думай не о задаче, а о решении" (с)
LiuLiuJons вне форума Ответить с цитированием
Старый 19.04.2012, 17:21   #8
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Если Вы используете перетаскивание картинок, то вполне сгодятся функции DragDrop. Если нет, - ну можно связать какие-то действия с
обработчиками OnMouse. Всегда есть варианты... .
nick42 вне форума Ответить с цитированием
Старый 19.04.2012, 17:33   #9
LiuLiuJons
Форумчанин
 
Регистрация: 28.12.2011
Сообщений: 124
По умолчанию

У меня происходит перерисовка фигур, которые являются объектами моего класса и 3д объектами в OpenGL..
Я пробовала запихнуть SwapBuffers() или glFlush() в таймер, и вообще не использовать IdleLoop, но результат - изображение начинало моргать..
"Думай не о задаче, а о решении" (с)
LiuLiuJons вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм выбора лучшего хода tanyhaftv Помощь студентам 4 09.06.2011 17:55
В заданной корректной позиции при игре в шашки определить допустимость хода белых(с учетом взятий) Dominges Помощь студентам 0 18.10.2010 09:00
Пузырьки:алгоритм лучшего хода SynEnergizer Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 05.12.2009 16:18
Как сделать имитацию хода даты и времени в программе? Bill Gates Общие вопросы Delphi 1 06.01.2008 15:21
Как сделать имитацию хода даты и времени в программе? Bill Gates Общие вопросы Delphi 1 05.01.2008 22:42