![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Добрый день! Я делаю на С++ в консоли простую игрушку ... нужно сделать так что бы 2 человека могли управлять своими человечками (перемещаясь по матрице). Для каждого отведены отдельные клавиши.
Дайте пожалуйста пример когда или название функции с ее сигнатурой как это правильно делается) спасибо! |
|||
|
||||
| KaraKum |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Если "Windows", то CreateThread() :
Если Linux, то pthread_create():
Это сообщение отредактировал(а) KaraKum - 21.12.2010, 17:17 |
||||
|
|||||
| 4epT |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
да, под винду .. Спасибо ) попробую)) А как закрыть поток ?)) |
||||
|
|||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
А пользователи нажимают кнопки на одном компьютере?
|
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
да. С этим могут быть проблемы? |
|||
|
||||
| KaraKum |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Если создание потоков связано с вводом пользователей, то не обязательно создавать потоки. С наличием в программе потоков (то есть не только основной функции main()) могут быть проблемы из-за параллельного использования одной и той же памяти (данных). Лучше избегать их создания если есть такая возможность, а в данном случае она вроде как есть... Это сообщение отредактировал(а) KaraKum - 21.12.2010, 17:22 |
||||
|
|||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Ну вот к примеру .... я хочу реализовать змейку ... но что бы одновременно бегало 2 змейки в консоли. Насколько я понимаю, если один пользователь будет очень быстро нажимать на клавиши, то второй просто не сможет двигаться ... или я ошибаюсь?))
|
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Второй поток здесь не нужен.
Нажимаем кнопку - двигаем змейку в сторону; для другой змейки другие кнопки. А залипание клавиш зависит уже от клавиатуры и нажимаемых групп кнопок (некоторые кнопки нельзя нажать больше двух штук, а некоторые можно и сразу 4 если правильно разбросать их по клаве), а будет ли игрок успевать нажимать клавиши зависит уже от его настойчивости и ширины плеч оппонента |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
хорошо, а такой вариант ... я зажимаю кнопку .... и я ловлю нажатие клавиш в бесконечном while при помощи getch(); Тут тоже не нужен второй поток?)))) |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Ой, я невнимательно прочитал в вопросе про консоль.
Хмм... подразумевается использование ASCII-графики? Добавлено через 59 секунд Я думаю будет проще создать обычное окно и рисовать в нём посредством GDI. |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Я с MFC не знаком ( на с++ с оконным интерфейсом писал только с использованием WinAPI ... а там с GDI сплошные проблемы( И все же что посоветуешь?) в консоли с потоком?) |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
GDI относится к WinAPI - то есть должен быть доступен сразу после установки Visual Studio Express Edition (бесплатная которая и скачивается с сайта майрософта).
На консоли - это, конечно, дохлый номер. Идеальный вариант - на OpenGL, но займёт много времени его освоение (недели), а на GDI можно быстро что-нибудь начать делать. |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Ясно ... ( у меня просто по сути есть 3-4 дня, до защиты курсового .... буду думать) Спасибо за помощь) |
|||
|
||||
| Batbko |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 17.12.2010 Репутация: нет Всего: нет |
Кстати WM_KEYDOWN в виндовой консоли никто не отменял
и даже рисовать на нем с помощью GDI и добавлять элементы управления, мои знания API изрядно проржавели но даже где то на этом форуме я видел алгоритм получения главного окошка процесса, а дальше дело техники : остаеться только правильно подменить оконную процедуру ;) Хотя если для курсача и если препод смотрит в исходники то лучше не извращаться |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Всё вышеперечисленное можно заменить одной строчкой вызова функции создания нормально виндового окна.
|
|||
|
||||
| Batbko |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 17.12.2010 Репутация: нет Всего: нет |
Ну так человек консоль хочет
Интереснее как препод оное представляет ? чему тож он научить пытаеццо А вот если ограничений на способ реализации нету то лучше GDI а ещё лучше Qt или что нить похожее Делал по приколу игрушку "жизнь" ушло пару часов на матчасть пару часов на логику и минут 15 на гуй(На Qt) |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Преподы у нас нынче пожилые - вот глянет он на такой код сквозь свои окуляры "+8" и сердце схватит... Поэтому, 4epT, Это сообщение отредактировал(а) KaraKum - 21.12.2010, 21:27 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
кстати сам микрософт, рекомендует использовать _beginthread()/_beginthreadex() вместо CreateThread
|
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Непредсказуемый майкрософт...
|
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Я попытался сделать все это в консоли .. сделал второй поток, в котором цикл while(true) и gtehc()-ем ловлю нажатые клавиши ... все работает но тормозит жутко (((
так и должно быть?) или я где то набочил? Добавлено через 9 минут и 41 секунду На WinAPI будут проблемы с GDI ... вообще мне нужно сделать бомбермена =) а там ставить бомбы взрыв на n пикселей по краям, как это отлавливать через GDI ? |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
есть еще один вариант) на WinAPI но без GDI ....
сделаю Label на всю область экрана ... и буду в него печатать матрицу (игровое поле) ... все нажатые клавиши будут изменять поле и все ... Просто по сути, для этого курсового мы должны использовать обычные знания ООП, то есть на данные момент мы не знаем ни потоков ни WinAPI ничего) |
|||
|
||||
| Batbko |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 17.12.2010 Репутация: нет Всего: нет |
Bomberman говоришь... ООП!?
Если логика готова, то нарисовать её чем угодно большого труда не составит Если будешь делать не консольно приложение, то для обработки клавиатуры достаточно ловить WM_KEYDOWN в оконной процедуре - никаких потоков не надо IMHO. Но если имеешь шустрый инет и желание разок разобраться а потом без особого труда использовать то сходи например сюда это - тулкит от нокии. ООП и примеров, в том числе и рисования там хоть отбавляй. Притом каждый пример подробно разжеван и задокументирован. И ты можешь забыть про оконные процедуры и прочие неприятные вещи. P.S. Слегка погуглив по запросу можно поглядеть на пару-другую реализаций этого самого бомбермена на qt:) |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Составить логику проблем не будет) в этом я уверен ... а вот насчет WM_KEYDOWN можно примерчик?) именно для консоли ... Qt нету времени учить) курсовым занимаюсь вечером после работы)
|
|||
|
||||
| Batbko |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 17.12.2010 Репутация: нет Всего: нет |
Заполучить нового адепта не удалось
как получить хэндл окошка консольного спросишь на форуме а после надо поступать примерно так(поправьте кто нибудь если что):
как то так, хотя повторюсь мои знания winAPI исрядно попорчены отсутствием практики P.S. Хотя выучить Qt поглазев на пару примеров в разы проще IMHO. Это сообщение отредактировал(а) Batbko - 22.12.2010, 00:14 |
|||
|
||||
| 4epT |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
если честно я все равно не понимаю как это мне поможет сделать программу без потока (( они ведь должны как то одновременно ходить ... с компьютером наверное будет легче сделать?) |
||||
|
|||||
| 4epT |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Кто нибудь может объяснить почему так происходит ? отлавливаю нажатие клавиши "<-" и аналог "a"
Для стрелочки все реагирует быстро ... для буквы "а" большая задержка, мало того не всегда срабатывает. ког аналагичен, за исключением что там разные игроки дергаются. вот код: Функция шага: b - это бомбермен ...
вот так я создаю поток при каждом нажатии клавиш:
|
||||
|
|||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Не всматриваясь в реализацию всей игры сразу можно сказать что на месте создания поток и дожидания пока они завершатся можно просто вызвать сами функции потоков:
Добавлено @ 01:04 Все игры (в том числе AAA шутеры, MMORPG (WOW, LineageII)) являются, в принципе, однопоточными - только лишь часть, отвечающая за соединение, может быть отведена в отдельный поток, но и то лишь из-за принципа организации сетевого соединения. И змейку или бомбермена тоже можно реализовать довольствуясь лишь одним потоком Добавлено через 8 минут и 55 секунд Если смотреть на любую игры с-высока, то её можно представить так: - каждые сколько-то миллисекунд (20-30 раз в секунду) заново рисуется весь экран в зависимости от текущего состояния данных игры - перед каждой отрисовкой игровые объекты меняют своё состояние в зависимости от текущего состояния и введённых в игру данных (полученных данных по сети или просто нажатых клавиш на клавиатуре) Ввод данных в игру (клавиши клавиатуры) уже, в принципе, могут игру не "волновать" - логично даже создать массив текуще нажатых клавиш и устанавливать в "true" те клавиши, которые сейчас нажаты, а игровые объекты будут этот массив считывать. В этой системе просто нет работы для какого-либо второго потока - нечем ему тут заняться. Это сообщение отредактировал(а) KaraKum - 22.12.2010, 01:05 |
|||
|
||||
| 4epT |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
переделал без потоков))) работать стало значительно лучше)) хоть и не идеально) ну а бомбы уже нужно создавать в потоках ? они ведь должны взрываться через какое то время ... к примеру я ставлю бомбу, создаю для нее поток, в потоке делаю Sleep на время n и взрываю ее .. правильно? или так же самое можно без потока обойтись ?) |
||||
|
|||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
В случае со змейкой это так (не попню именование тамошних команд):
- создать массив допустим такой: bool keys[100500]; - по WM_KEYDOWN: keys[PUSHED_KEY_CODE] = true; - по WM_KEYUP: keys[RELEASED_KEY_CODE] = false; - по моменту обновления всех объектах (у нас только одинокая змея): snake->LIVE!() { if(keys[CROWL_FORWARD]) { //двигаем змейку на пиксель вперёд (ну или какая у неё там скорость передвижения)... } else if(keys[TURN_RIGHT]) { //поворачиваемся вправо... } else if... } - очищаем экран и рисуем всё заново в зависимости от текущего положения змейки... Добавлено через 1 минуту и 29 секунд Здесь тоже самое что прежде - игру нужно обновлять какое-то количество раз в секунду. sleep() использовать в играх нельзя. |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
то есть запомнить время когда она была установлена и при обновлении игрового поля проверять вышло ли время? |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Да, именно так.
|
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
спасибо большое) завтра буду пробовать!!)) еще отпишусь) |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
До завтра
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
4epT, по мне, луче воспользоваться кросплатформенной библиотекой. Например Boost.Thread.
В С++0X планируется поддержка многопоточности. Если программа пишется для себя то можно написать на нём. Компилировать можно VS2010 EE и g++4.5. Возможно есть ещё какие-то free компиляторы. -------------------- вопросов больше чем ответов |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
||||
|
||||
| 4epT |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Снова здравствуйте!)
Спасибо большое за совет, но буду писать без потоков) Написал что бы ставились бомбы ... все ок) только они не взрываются ( где то теряются. Я в игровом поле сделал массив Бомб. Бомбы экземляры классов. Смотрел через отладчик .. добавляется нормально, а вот уже при проверке на взрыв размер массива равен 0 Вот очередь вызова функций =)
Такое ощущение что где то теряю игровое поле (( и при вызове isBum уже просто напросто копия игрового поля. Есть какие нибудь идеи ?)) Опыта программирования на С++ мало, так что скорей всего где то напорол с указателями ... |
||||||||||
|
|||||||||||
| KaraKum |
|
||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Кстати, по поводу отрисовки изображения:
На данный момент я не знаю какими методами ты рисуешь изображение, но GDI всё-таки очень простая и удобная вещь (было реализовано специально чтобы можно было что-то быстро и просто нарисовать без использования horse-power OpenGL или DirectX). Например змейку можно было бы нарисовать примерно вот так (опять не помню точные имена функций):
Я почти уверен что этот метод проще чем то как ты отрисовываешь изображение сейчас. И проще, и правильнее. Добавлено @ 13:28
Ошибка здесь. Нужно определить конструктор копирования, который будет копировать время создания бомбы и в функцию передавать бомбу сразу по указателю или по ссылке - но это уже красивость - ошибка не тут Я не знаю что ты имеешь в виду под динамическим массивом, но С++ по своей натуре не позволяет осуществлять произвольный доступ к элементам массива. Например если создать массив
то нельзя обратиться, например, к третьему элементу:
Добавлено @ 13:33 Тебе нужно использовать STL-контейнер и лучше хранить бомбы по указателям (так проще и логичнее):
Это сообщение отредактировал(а) KaraKum - 22.12.2010, 13:33 |
||||||||||||||
|
|||||||||||||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Отрисовку через GDI сделаю если буду влаживаться в сроки)
STL-контейнера я думал, но почему то не решился его использовать =) Под динамическим я понимаю вот это:
Перегрузку конструктора копирования сделаю) но это ведь не решает почему размер массива обнуляется ( А кстати ... я юзаю для времени вот это SYSTEMTIME, нормально?) |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Эмм, а что именно обнуляется? Время установки бомбы?
|
|||
|
||||
| 4epT |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Нет, их кол-во ... я при создании бомбы, то есть при методе addBomb увеличиваю текущий размер на 1
а уже при проверке на взрыв бомб я не могу узнать сколько у меня их там ... так как размер равен 0 =( я это вижу через отладчик ... |
||||
|
|||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Тогда показывай код использования этого объекта "this", где переменная currentSizeLst и объявлена.
И используй std::vector или std::list, а не "new Bomb[100]". |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
А какой код показать? могу показать сигнатуры всех методов этого "this" ... то есть *.h файл =) |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Код в студию!
|
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
скину только вечером =( как с работы вернусь |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Вот собственно код:
Это Field.h |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
cpp-файл тоже нужен - непонятно что такое "int **field"
|
|||
|
||||
| 4epT |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
тут многовато (
|
||||
|
|||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
GUI и чем рисовать я бы тоже взял кросплатформенное...
Qt4, Ogre3D и т.д. и т.п. -------------------- вопросов больше чем ответов |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
KaraKum, привет) Я начал отрисовывать через GDI+ ... я сделал метод который просто выводит на экран матрицу в красивом виде ... перерисовка происходит каждый раз когда кто то двигается или ставит бомбу и экран блымает (то есть перерисовка происходит не достаточно быстро) - этого как то можно избежать?
Насколько я понимаю можно обновлять не все игровое поле а только его часть, но вот как за этим уследить?) |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Привет
Тормозить не должно даже если перерисовывать весь экран 30 раз в секунду (ну, если у тебя комп на биполярных транзисторах Проблема, видимо, в чём-то другом. Выложи сюда код функции отрисовки - она, наверное, небольшая... А тормозит как именно?: экран прорисовывается медленно сверху-вниз (как при рендеринге 3D-сцен в соответствующих редакторах) или экран отрисовывается моментально, но с задержкой по времени? |
|||
|
||||
| 4epT |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
скорее всего как при рендеринге 3D-сцен в соответствующих редакторах =))) но довольна таки быстро ... ну то есть та область перерисовывает блымает (это когда зажмешь кнопку и непрерывно перемещаешь бомбермена в сторону). Вот код отрисовки:
при каком либо движении делаю UpdateMainWindow()
в WM_PAINT:
drawRect - это функция рисования =) |
||||||||
|
|||||||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Аа, я понял. Скорее всего причина в следующем: в твоём случае, вероятно, экран перерисовывается при каждом событии нажатия клавиши, а это может происходить очень часто. Про WM_KEYDOWN не могу ничего сказать, но, вот, например, в SDL сообщения нажатии могут происходить по 500-1000 раз в секунду, что, конечно, тяжелова-то.
Если WM_KEYDOWN действительно приходят очень часто, то тебе нужно при нажатии клавиш лишь изменять какое-то внутреннее состояние игры и не перересовывать всё заново каждом этом случае, а отрисовкой заниматься только по таймеру (где-то 30 раз в секунду), ну и по WM_PAINT тоже (это событие приходит когда сворачивают-разворачивают окно, поэтому если есть таймер, генерирующий события 30 раз в секунду, то можно довольствоваться только им). Для отладки можно измерить сколько занимает времени одна отрисовка:
Это сообщение отредактировал(а) KaraKum - 25.12.2010, 18:48 Присоединённый файл ( Кол-во скачиваний: 2 )
timing.rar 1,16 Kb |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
Ну так даже если WM_KEYDOWN срабатывает очень часто, у меня ведь каждая клавишу фильтруется ... и по идеи оно вызывается 1 раз при нажатии клавиши
|
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
Хмм... тогда сложно что-либо сказать.
Нужно, значит, сделать замер времени, чтобы сократить число подозреваемых |
|||
|
||||
| 4epT |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
ну pringf выводит в консоль .... а у меня оконное приложение) как посмотреть то что он вывел?) |
|||
|
||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
В файл:
|
|||
|
||||
| 4epT |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 784 Регистрация: 13.8.2007 Репутация: нет Всего: 3 |
ок) сделаю тест напишу) |
||||
|
|||||
| KaraKum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 640 Регистрация: 3.12.2007 Репутация: 1 Всего: 1 |
ждёмс....
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |