Russian Qt Forum
Ноябрь 26, 2024, 10:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4] 5 6   Вниз
  Печать  
Автор Тема: Вторая форма в проекте.  (Прочитано 30633 раз)
Alexu007
Гость
« Ответ #45 : Июнь 05, 2013, 21:21 »

processGame выполняется долго - там специально паузы вставлены, иначе игры не получится. emit - потому что processGame сигнал и связан со слотом void Widget::proc_Game() на другой форме. Программа состоит из 3-х форм, они все связаны, в двух формах игровые поля компа и человека, а в третьей основной - индикаторы, сколько у кого кораблей убито.

Взаимодействие между формами с помощью сигналов и слотов, мне тут так подсказали.

Поэтому я и в непонятках. Я то думал: кликнул мышкой - выскочило прерывание мышки  - отправило сигнал для продолжения игры на другую форму - и на этом прерывание мышки закончилось. А получается что не так.
« Последнее редактирование: Июнь 05, 2013, 21:24 от Alexu007 » Записан
mutineer
Гость
« Ответ #46 : Июнь 05, 2013, 21:24 »

Пока выполняется твой proc_Game() все остальное стоит, поэтому все входящие события от системы накапливаются в очередь. Зачем там паузы? Какую роль они играют?
Записан
mutineer
Гость
« Ответ #47 : Июнь 05, 2013, 21:28 »

mousePressEvent это не прерывание, это метод, и отрабатывает он в главном потоке. Поэтому пока главный поток занят он отработать не может
Записан
Alexu007
Гость
« Ответ #48 : Июнь 05, 2013, 21:33 »

Ну да, стоит, ну да - накапливаются, и что с этим делать? Я вообще то думал, что прерывание мышки при каждом клике сразу возникает, не дожидаясь пока там где-то что-то кончится - поэтому и пытался его "зареторнить", когда оно не вовремя. Но так не работает. Но в других то програмах это как-то обходят? Те же шахматы - если я 10 раз кликну по доске, пока компьютер думает - он мои клики проигнорирует.
Записан
mutineer
Гость
« Ответ #49 : Июнь 05, 2013, 21:35 »

Выноси долгие рассчеты в отдельный поток. а основной пусть отвечает на мышку и игнорирует ее когда не надо
Записан
Alexu007
Гость
« Ответ #50 : Июнь 05, 2013, 21:41 »

Зачем там паузы? Какую роль они играют?

Ну как же? Я кликаю мышкой в поле компа, если сразу появляется результат (попал-мимо) то уже некрасиво - нужны паузы. Клик - через паузу (0,8 сек у меня Sleep(800)) не экране результат появляется, ещё через паузу ход компу отдаётся (если мимо) - активируется форма поля человека - пауза - туда комп ходит - пауза - либо попал и продолжает ходить, либо отдаёт ход челу - активируется форма компа. Без пауз всё будет происходить мгновенно и ничего не понятно будет.

Добавлено: какие там долгие рассчёты в морском бое "С2 ранен В2 убит"? Паузы исскуственные с помощью Sleep().
« Последнее редактирование: Июнь 05, 2013, 21:45 от Alexu007 » Записан
mutineer
Гость
« Ответ #51 : Июнь 05, 2013, 21:44 »

Sleep() тормозит твой основной поток и ничего в это время не обрабатывается. Рассчитай текущее действие, взведи таймер. По таймеру отрисуй результат на экране и рассчитай следующее действие и взведи таймер. Если надо передать ход человеку, то таймер не взводи. Во время работы таймера приложение сможет отвечать на внешние раздражители, в отличие от Sleep()
Записан
Alexu007
Гость
« Ответ #52 : Июнь 05, 2013, 22:04 »

Блин, со слипами уже всё работает, и теперь всё переделывать, таймер прикручивать?

Код
C++ (Qt)
//**********************************************************
// процесс игры
void Widget::proc_Game()
 
{
 
QMessageBox msgBox;
 
int X;
 
//change_Opacity(1);
//set_Action = 0;
 
 
//ход человека
X = Move_Homo(mouse_x, mouse_y);
 
 
//ход человека: ошибка
if (X == 2) {Beep(1000, 800); return;}
 
// пеперисовываем поле
FC->repaint();
 
ui->progressBar_Comp->setValue(Cx_Palube_Comp * 10);
 
 
 
//победа человека, конец игры
if(Cx_Palube_Comp == 10)
   {
   set_Action = 0;
 
   Sleep(800);
 
   msgBox.setText("Win HOMO");
   msgBox.exec();
 
   Sleep(800);
 
   change_Opacity(2);
 
   ui->pushButton_3->setDisabled(false);
   return;
   }
 
 
//ранен, убит - продолжение хода чела
if(X == 1) return;
 
 
 
   //QMessageBox msgBox;
   //msgBox.setText(QString::number(X));
   //msgBox.exec();
 
   //если комп уже выиграл, добиваем без пауз
   //if(Cx_Palube_Comp < 10) Sleep(1000);
 
 
 
 
// отдаём ход компьютеру
if(Cx_Palube_Homo < 10) X = 1;
 
Sleep(800);
change_Opacity(0);
Sleep(500);
 
 
 
   // победа компьютера, доигрывает человек
   //else X = 0;
 
 
//продолжение хода компьютера
while(X == 1)
   {
   X = Move_Comp();
 
   FH->repaint();
 
   ui->progressBar_Homo->setValue(Cx_Palube_Homo * 10);
 
   //msgBox.setText(QString::number(Cx_Palube_Homo));
   //msgBox.exec();
 
   Sleep(800);
 
   // победа компьютера, конец игры
   if(Cx_Palube_Homo == 10)
       {
       set_Action = 0;
 
       Sleep(800);
 
       msgBox.setText("Win COMP");
       msgBox.exec();
 
       Sleep(800);
 
       change_Opacity(2);
 
       ui->pushButton_3->setDisabled(false);
       return;
       }
   }
 
Sleep(800);
change_Opacity(1);
 
 
//переход хода к человеку
return;
}
Записан
mutineer
Гость
« Ответ #53 : Июнь 05, 2013, 22:04 »

Ну можешь не переделывать и наслаждаться окнами, зависшими на несколько секунд
Но я бы не называл это "все работает"
« Последнее редактирование: Июнь 05, 2013, 22:06 от mutineer » Записан
Alexu007
Гость
« Ответ #54 : Июнь 05, 2013, 22:17 »

Окна не зависают. Просто если кликать мышкой чаще положенного - начинается путаница: компьютер походил, человек походил и уже непонятно кто, куда, чей счас ход, нада кликать или ждать, пока старые клики пройдут. Несолидно.
Записан
mutineer
Гость
« Ответ #55 : Июнь 05, 2013, 22:19 »

Окна зависают, можешь проверить. Во время этих слипов они ни на что не реагируют. Ну и концептуально это тоже неправильно. Но вообще хозяин барин
Записан
Alexu007
Гость
« Ответ #56 : Июнь 05, 2013, 22:51 »

Ну по крайней мере они перерисовываются, если другим окном по ним ездить. Да не, я переделаю конечно, тока теперь надо в таймере разбираться.
Записан
Alexu007
Гость
« Ответ #57 : Июнь 06, 2013, 00:46 »

Фигня какая!!! Я рэндом из qrand() сваял:

Код
C++ (Qt)
int random(int x)
   {
   return qrand() % x;
   }

Я и слип из таймера и глобальной переменной замастырю. В переменную число нужное вставляем, например 8, а по слотам таймера каждые 100мс единичку вычитаем до нуля - получите 0,8 сек. И программу переделывать будет ненада... поменять только Sleep на Pauza
Записан
mutineer
Гость
« Ответ #58 : Июнь 06, 2013, 08:25 »

А зачем 8 раз по 100мс? Почему не один раз на 800мс таймер завести?
В чем фишка с рандомом я вообще не понял... Так в любой доке написано
Записан
Alexu007
Гость
« Ответ #59 : Июнь 06, 2013, 13:32 »

У меня уже был морской бой на билдере написан, алгоритмы игры я взял оттуда. В билдере рэндом, в Qt куранд, чтобы не менять по всей программе я сделал рэндом из куранда.

С паузой сложнее. Я конечно могу аналог слипа сделать, но что-то мне подсказывает, что он будет точно так же тормозить комп - нужно в цикле ждать, прошло ли 0,8 сек.

Честно говоря я в затруднении. Сам принцип построения игрового процесса (простой и понятный со слипами) с таймером что-то пока не вырисовывается.

1. Программа ждёт клика мышкой по полю. Где имено и как она это делает - мне неизвестно.
2. Клик - вызывается mousePressEvent
3. mousePressEvent эмитирует сигнал, который связан со слотом игрового процесса. В зависимости от игровой ситуации либо ходит комп, либо return - и ждём следующего клика по полю (хода чела).

Теперь с таймером. mousePressEvent запускает таймер? Ну запустили - сам игровой процесс в onTimeout чтоли впихивать? Он же каждый период времени выскакивает... ну допустим я при первом включении таймер сразу остановлю. Пошла игра, дошла до первой необходимости сделать временную задержку - снова включать таймер? Так он и включит onTimeout сначала, а зачем мне сначала? Мне нужно с того места, где я паузу делал. С помощью глобальной переменной запоминать, с какого места начинать в очередной раз? Во геморой то блин!
« Последнее редактирование: Июнь 06, 2013, 13:37 от Alexu007 » Записан
Страниц: 1 2 3 [4] 5 6   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.271 секунд. Запросов: 21.