Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Видимо в поток


Автор: InsideYou 3.6.2008, 15:09
Доброе время суток!

Такая ситуация, игра пишется в MFC. Есть объект, который управляется мышкой, он прорисовывается на экране. Есть ещё несколько других объекто(2-3), они тоже прорисовываются на экране, но двигаются хаотично при помощи рандома. Получается так, что пока объект который двигает хаотично не закончит свой путь, то мышкой заставить двигаться главный объект нельзя. Как можно сделать чтобы все объекты синхронно двигались по экрану?

Заранее спасибо.

P.S. Срочно-завтра сдача курсача.

Автор: rrrFer 3.6.2008, 17:53
думаю примерно так:
Код

void Timer(){
    int Time;                        
    obj *object1=new obj;
    obj *object2=new obj;
    obj *object3=new obj;
    //обработка по таймеру
    for(Time=0;Time<100;Time++){
        object1->step;
        object2->step;
        object3->step;
    }
}

тут obj это обьекты которые двигаютс, в Тime отсчитывается как долго они будут двигаться, если до какого-то события то пиши:
for(;;){} а внутри где-нибудь break; step() - обьект будет сдвигаться, тогда получистя что обрабатываться объекты будут почти параллельно. Вобщем функция отрисовки того самого хаотичнодвигающегося объекта должна прерываться и передавать управление в Timer(), чтобы отсчитывать время можно использвать time() из time.h, то есть:
Код

#include <time.h>
int step(){
    time_t t1,t2; int i=0;
    for(time(&t1),time(&t2),i=0;difftime(t2,t1)<10;time(&t2)){
    //двигаешь
    }
    return 1; //возврашаешься в Timer()
}

Автор: InsideYou 3.6.2008, 20:23
Насчёт 3х движущихся объектов Вы правы, но суть не в этом. Пока они все 3 не закончат свой путь мышка  двигатся не будет. Суть игры-может видели когда-то: летают по окну 2-3 квадрата и ты сматываешь от них своим хвадратом при помощи мышки. Вот так вот.

Автор: dizzy1984 4.6.2008, 13:05
Не знаю нужно ли тебе теперь решение, но можно попробовать добавить вызовы функции PumpMessage() в то вычисление, которое создает длительный промежуток "зависания" приложения. Чем больше - тем лучше.
Код

BOOL PumpMessage()
{
    CWinThread *pThread = AfxGetThread();
    MSG msg;
    while(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
    {
        if (!pThread->PumpMessage()) 
            break; 
    }
    return TRUE;
};

Вся соль в том, что для отклика на ввод пользователя и расчетов программы в MFC используется 1 поток. (AFAIK В отличие от delphy, где нет таких проблем). Эта функция прерывает работу программы для отработки ввода пользователя.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)