HGE & Visual C++
| |
Aikidos | Дата: Суббота, 14 Января 2012, 15:24 | Сообщение # 21 |
постоянный участник
Сейчас нет на сайте
| Если я не ошибаюсь, HGE перестал развиваться с 2008 года?
Ты вышел в поле. Ты куришь гашиш. Ты видишь машину. Ты медведь. Ты горишь.
|
|
| |
noname | Дата: Суббота, 14 Января 2012, 16:18 | Сообщение # 22 |
заслуженный участник
Сейчас нет на сайте
| Quote (Aikidos) Если я не ошибаюсь, HGE перестал развиваться с 2008 года? не знаю, но похоже на то.
там, на предыдущей странице я вопрос задал. очень нужна помощь.
все правила форумной игры Дуэль Программистов
|
|
| |
GECK | Дата: Суббота, 14 Января 2012, 17:20 | Сообщение # 23 |
заслуженный участник
Сейчас нет на сайте
| Посмотрел твой проект. Подключил к проекту файлы maz_gen.h и maz_gen.cpp, потом студия сама подсказала записать #include "stdafx.h" в maz_gen.cpp. Все скомпилилось
На будущее - выкладывай только исходники, в архиве мусора много.
Всё гениальное просто. И хреново работает.
|
|
| |
noname | Дата: Четверг, 19 Января 2012, 15:02 | Сообщение # 24 |
заслуженный участник
Сейчас нет на сайте
| Quote (GECK) Подключил к проекту файлы maz_gen.h и maz_gen.cpp как?
Quote 1>kosmobiaky.obj : error LNK2019: ссылка на неразрешенный внешний символ "void __cdecl WorldFill(void)" (?WorldFill@@YAXXZ) в функции _WinMain@16
1>D:\my_projects\03-raise-HGE\01-Kolobok\0008\Debug\kosmobiaky.exe : fatal error LNK1120: 1 неразрешенных внешних элементов Добавлено (14.01.2012, 17:46) --------------------------------------------- так, вроде бы как-то это сделал. хотя сам толком не понял, что я делал.'
GECK, СПАСИБО большое)) Добавлено (16.01.2012, 16:23) --------------------------------------------- ---------------------------------------------
блукаю щазз в модулях своей многомодульной проги.
хочу понять, как делается одна штука на MS Visual C++. а именно:
1. в функции main() объявляется двумерный массив, а затем он передаётся в качестве параметра функции, реализованной в другом модуле.
2. размеры этого массива задаются только в одном месте программы(константой, дефайнами, да чем угодно- лишь бы работало), И эти размеры доступны из любого модуля программы.
не мог ли бы кто-нить показать, как это делается, на примере с двумя модулями(основной- тот, в котором ф-ция main() И другой- в котором ф-ция, обрабатывающая массив). Добавлено (16.01.2012, 16:24) ---------------------------------------------
Quote (noname) в функции main() объявляется двумерный массив а лучше- глобальное объявление, до объявления функций, в основном модуле(где main())Добавлено (16.01.2012, 19:08) --------------------------------------------- --------------------------------------------- вышеописанная проблема РЕШЕНА Добавлено (19.01.2012, 14:56) --------------------------------------------- --------------------------------------------- ---------------------------------------------
я сделал генерёжку простого лабиринта. в отличие от старой версии "колобка", на этот раз лабиринт составляется из комнат. размеры комнат и другие константы задаются в файле stdafx.h сейчас там установлен режим 1050x1680xFULL_SCREEN, но это легко изменить: http://dl.dropbox.com/u/52494730/Kolobok/2012_01_19/0012.zip для более удобного экспериментирования с программой режим экрана лучше сменить на оконный, значения которого указаны там в комментах.
прога очень сырая. управление- стрелками, выход по ESC.
есть причина, по которой я предлагаю вашему вниманию именно полноэкранный вариант. дело в том, что меня абсолютно не устраивает скорость перерисовки экрана: при движении видны заметные искажения.
если кто что может подсказать по этому поводу- буду благодарен. Добавлено (19.01.2012, 15:02) --------------------------------------------- я имею ввиду небольшие искажения в тот момент, когда перерисовывается весь экран.
все правила форумной игры Дуэль Программистов
|
|
| |
GECK | Дата: Четверг, 19 Января 2012, 15:31 | Сообщение # 25 |
заслуженный участник
Сейчас нет на сайте
| Quote (noname) при движении видны заметные искажения Используй вертикальную синхронизацию: Code hge->System_SetState(HGE_FPS, HGEFPS_VSYNC);
Всё гениальное просто. И хреново работает.
|
|
| |
noname | Дата: Четверг, 19 Января 2012, 16:06 | Сообщение # 26 |
заслуженный участник
Сейчас нет на сайте
| Quote (GECK) Используй вертикальную синхронизацию: СПАСИБО. наиболее неприятный эффект при горизонтальном смещении экрана убрался.
и, в-принципе работает нормально. с учётом того, что я юзаю режим 1050x1680x32bit. тот же BlackThorne гораздо поскромнее в этом плане И к тому же без скроллинга))Добавлено (19.01.2012, 16:06) --------------------------------------------- и тут же СЛЕДУЮЩИЙ ВОПРОС:
вот есть у меня ф-ции: - FrameFunc (опрос ввода и модификация состояния игры) - RenderFunc (перерисовка экрана)
я так понимаю, что они выполняются так часто, как могут.
RenderFunc меня в этом плане абсолютно устраивает, а вот что касается FrameFunc, то хотелось бы задать частоту её вызова. напр- 100 или 10 раз в секунду. тогда и отрисовка получится более качественной, т к она будет происходить чаще, чем изменения в том, что надо отобразить.
все правила форумной игры Дуэль Программистов
|
|
| |
GECK | Дата: Четверг, 19 Января 2012, 17:02 | Сообщение # 27 |
заслуженный участник
Сейчас нет на сайте
| noname, судя по коду, проблема в другом. Каждый кадр все объекты нужно смещать не на фиксированную величину, а на скорость_объекта * dt, где dt - промежуток времени между кадрами. В случае hge это hge->TimerGetDelta(). Если сейчас в игре уменьшить фпс вдвое, то и сама игра замедлится вдвое, что не есть хорошо. Ну или я не понял проблему
Quote (noname) отрисовка получится более качественной, т к она будет происходить чаще, чем изменения в том, что надо отобразить. Ну, на самом деле нет. Если не изменять игровой мир, то в чем смысл несколько кадров рисовать одно и то же?
Всё гениальное просто. И хреново работает.
|
|
| |
noname | Дата: Суббота, 21 Января 2012, 23:24 | Сообщение # 28 |
заслуженный участник
Сейчас нет на сайте
| Quote (GECK) Если сейчас в игре уменьшить фпс вдвое, то и сама игра замедлится вдвое, что не есть хорошо именно так. а я и хочу как-то управлять частотой вызова этих функций.
Quote (GECK) Если не изменять игровой мир, то в чем смысл несколько кадров рисовать одно и то же? хм.. дельное замечание!
если всё просчитывается, а затем- всё выводится И при этом движение объектов на экране происходит с постоянной для каждого объекта скоростью, то лагов не должно быть.
ну чтож. буду надеяться, что отрисовка в HGE (RenderFunc) происходит только после того, как мир полностью обсчитан (FrameFunc). тогда остаётся только покумекать над переделкой моей функции отображения игрового мира (WordShow).
Quote (GECK) hge->TimerGetDelta() СПАСИБО, почитаю.
Добавлено (20.01.2012, 15:15) --------------------------------------------- --------------------------------------------- личкой пришло: HGE (Meragon) Вчера Quote FrameFunc исполняется каждый кадр, т.е. если у тебя вертикальная синхронизация сейчас в игре есть, то это значит фпс = частота монитора (в моем случае - 75 - кадров в секунду). Ограничить можно через произвольную установку fps: hge->System_SetState( HGE_FPS, 60 ); Если тебе надо ограничить передвижение, то используй вместо Input_GetKeyState, InputGetKeyDown.
Добавлено (20.01.2012, 15:45) --------------------------------------------- но это- не выход. от таких ограничений у меня только ещё больше лагает.
попробую последовать совету GECK. чё-та разленился, никак не начну))
Добавлено (21.01.2012, 13:05) --------------------------------------------- упс, нашёл ошибку- оказывается я видимую область каждый раз перерисовывал дважды.
Добавлено (21.01.2012, 13:19) --------------------------------------------- Quote (noname) упс, нашёл ошибку- оказывается я видимую область каждый раз перерисовывал дважды. в функции WorldShow перед оператором switch есть совершенно лишний условный оператор, который выводит либо стены либо обои, которые ниже перерисовываются в свиче.
щазз я занят более радикальной переделкой проги.
Добавлено (21.01.2012, 20:38) --------------------------------------------- ---------------------------------------------
игру упростил и перешёл на отрисовку с использованием dx=hge->TimerGetDelta(); http://dl.dropbox.com/u/52494730/Kolobok/2012_01_21/0016.zip временно оставляю Колобка в покое И перехожу к шахматам.
в папке Debug лежит экзешник со всеми нужными для запуска файлами. остальное- для тех, кто хочет поковыряться в исходниках.Добавлено (21.01.2012, 23:24) --------------------------------------------- проблема: экзешник запускается только на моём компе(возможно, ещё у тех, у кого стоит MS Visual C++ и HGE).
здесь два отзыва от форумчан: http://forum.sources.ru/index.p....064302
проверил на компе своего отца- пишет "программа не запускается".
я так понимаю, что надо доложить в архив ещё файлов. НО каких?
все правила форумной игры Дуэль Программистов
Сообщение отредактировал noname - Суббота, 21 Января 2012, 20:39 |
|
| |
Demeron | Дата: Суббота, 21 Января 2012, 23:29 | Сообщение # 29 |
User created in C++
Сейчас нет на сайте
| noname, режим Release стоит? hge.dll и bass.dll вкинул к .exe? Под какую систему компилировалось?
|
|
| |
noname | Дата: Четверг, 26 Января 2012, 16:39 | Сообщение # 30 |
заслуженный участник
Сейчас нет на сайте
| Quote (Demeron) режим Release да, дело было именно в этом. тока щазз узнал об этом режиме. спасибо. (режим с Debug на Release переключается на стандартном тулбаре Visual C++).Добавлено (22.01.2012, 00:06) --------------------------------------------- итак, проблема решена
и, раз исходники я уже выложил выше, то кладу только то, что необходимо для запуска игры: http://dl.dropbox.com/u/52494730/Kolobok/2012_01_22/Release.zip
движение всё равно далеко до идеального, а так же колобок входит в стены.
мне нравится, как реализовано движение вот этой игре: http://gcup.ru/forum/28-15605-254259-16-1308849878 (нажимайте F1 и F2, чтобы настроить режим отображения) --
на этом временно бросаю Колобка и перехожу к шахматам. Добавлено (22.01.2012, 12:05) --------------------------------------------- рассматривал ещё раз 7-й туториал к HGE- там плавно двигается большое кол-во спрайтов одновременно
надо только разобраться, как это делается. и применить к шахматным фигурам. Добавлено (25.01.2012, 18:56) --------------------------------------------- --------------------------------------------- куча уроков по HGE есть здесь: http://hge-blog.ru/17_urok....io-2008 в самом низу жмите левую ссылку, чтобы перейти к следующему уроку. Добавлено (26.01.2012, 12:29) --------------------------------------------- --------------------------------------------- --------------------------------------------- хочу хранить спрайты всех шахматных фигур и кое-чего ещё в анимации(в хелпе в разделе hints&tips есть указание на то, что библиотеки спрайтов удобно хранить именно так).
в связи с этим вопрос: как загрузить анимацию из *.png- файла? в уроках что-то такое есть, но там загружается из какого-то менеджера ресурсов, а это мне вообще не понятно, да и не нужно. мне бы- просто из файла.. Добавлено (26.01.2012, 15:40) --------------------------------------------- --------------------------------------------- т е есть в файле *.png куча спрайтов одинаковых размеров. ВОПРОС: - как загрузить эти спрайты, чтобы они стали кадрами анимации? Добавлено (26.01.2012, 16:39) --------------------------------------------- решение найдено Code HGE* hge = hgeCreate(HGE_VERSION); HTEXTURE tex = hge->Texture_Load(filename/*имя файла с текстурой*/); float w = hge->TexureWidth(tex); float h = hge->TexureHeight(tex); hgeAnimation anim = new hgeAnimation(tex/*текстура*/, numFrames/*количество кадров на текстуре*/, FPS/*частота обновления, если кадры менять не надо - ставишь 0*/, 0/*верхний левый угол Х*/, 0/*верхний левый угол У*/, w/*ширина текстуры*/, h/*высота текстуры*/);
все правила форумной игры Дуэль Программистов
|
|
| |
Demeron | Дата: Четверг, 26 Января 2012, 22:09 | Сообщение # 31 |
User created in C++
Сейчас нет на сайте
| noname, ну не совсем.... Нужно так: Code HGE* hge = hgeCreate(HGE_VERSION); HTEXTURE tex = hge->Texture_Load(filename/*имя файла с текстурой*/); float w = 64.0f;//ширина одного кадра float h = 64.0f;//высота одного кадра int numFrames = 10;//количество кадров в анимации float FPS = 10;//количество кадров в секунду (скорость воспроизведения) hgeAnimation anim = new hgeAnimation(tex,numFrames,FPS, 0/*верхний левый угол первого спрайта анимации по Х*/, 0/*верхний левый угол первого спрайта анимации по У*/, w,h);
Сообщение отредактировал Demeron - Четверг, 26 Января 2012, 22:13 |
|
| |
noname | Дата: Суббота, 04 Февраля 2012, 10:10 | Сообщение # 32 |
заслуженный участник
Сейчас нет на сайте
| в туториалах к HGE есть пример, где перемещается много покемонов Zazaka.
я только что дотумкал и реализовал другой способ перемещения, который больше подходит к шахматной программе, которую я пишу: http://forum.sources.ru/index.p....3069006Добавлено (04.02.2012, 10:10) --------------------------------------------- как создать русский шрифт для HGE?
я бы предпочёл не сам рисовать шрифт, а перевести какой-нить из виндузовских.
все правила форумной игры Дуэль Программистов
|
|
| |
GECK | Дата: Суббота, 04 Февраля 2012, 10:18 | Сообщение # 33 |
заслуженный участник
Сейчас нет на сайте
| В комплекте с HGE идет генератор шрифтов же. В окошке Characters range выбираешь нужные символы, и все.
Всё гениальное просто. И хреново работает.
|
|
| |
noname | Дата: Пятница, 16 Марта 2012, 23:09 | Сообщение # 34 |
заслуженный участник
Сейчас нет на сайте
| да, появились другие дела, так что шахматы мои пока что заброшены. и давно.
скачать то, что получилось, можно здесь: http://dl.dropbox.com/u/52494730/CHESS/2012_02_05/0020.zip
если кто подскажет, какого поцелуя мои шахматы вылетают, когда я ставлю шах компу, буду признателен. по-моему я как-то не правильно юзаю движок.Добавлено (16.03.2012, 23:09) --------------------------------------------- кста, в моих шахматах переворачивать доску можно даже во время перемещения фигуры))
все правила форумной игры Дуэль Программистов
|
|
| |
Kwant | Дата: Воскресенье, 15 Июля 2012, 20:06 | Сообщение # 35 |
почетный гость
Сейчас нет на сайте
| Падает у тя оно на: Code int move_num = rand()%(AI.ML.n); AI.ML.n = 0 - у тебя идет деление на ноль И еще интересна вот эта строка: Code if(PU->Fgr[c][n].alive && MvCrrct(PU,&(PU->Fgr[c][n]),x,y)) { result = true || result; }
У тебя тут постоянно true -_-
Проверка чисел с плавающей точкой: if((G.FgCur.sx==G.FgDst.sx)&&(G.FgCur.sy==G.FgDst.sy)) - надо бы: fabs( A - B ) < E
Структура: TFigure - на 32-битной платформе, размер может быть уменьшен с 24 до 20 байт, перестановкой полей.
Ну и функция void Q_10() == void Q_50() - зачем дубликаты лепить?
Сообщение отредактировал Kwant - Воскресенье, 15 Июля 2012, 20:15 |
|
| |
noname | Дата: Суббота, 10 Ноября 2012, 14:26 | Сообщение # 36 |
заслуженный участник
Сейчас нет на сайте
| Kwant, спасибо! не ожидал, что кто-то разберётся- собирался уже слезать с HGE обратно на Zen(что было бы печально, ибо он заточен под Delphi).
правда, времени сейчас мало, но продолжу разбираться.Добавлено (08.11.2012, 21:34) ---------------------------------------------
Quote (Kwant) AI.ML.n = 0 - у тебя идет деление на ноль похоже на правду. AI.ML.n хранит кол-во возможных ходов. я сделал защиту от деления на ноль(не иду по этой ветке, если нет ходов), но она не срабатывает в случае, если у компа ровно один ход. потому как я считаю ходы с нуля(а если ходов нет, то AI.ML.n == -1).
блин, а я так долго пытался понять- почему иногда, когда я ставлю шах компу, прога вылетает! это был самый достающий момент для меня, из-за которого я уже начал думать, что не понимаю, что происходит, и даже собирался перестать пользоваться HGE. короч, Kwant, - огромное тебе спасибо)))
и, кста- если кто будет разбираться, то в той же функции ошибка в комментах. функция Q_40 это Искуственный Интеллект, а не ожидание завершения игры, как написано в комментах. вообще же, я постарался снабдить прогу понятными комментариями, чтобы любой желающий смог бы легко в ней разобраться. --
Quote result = true || result; }
У тебя тут постоянно true да, там вродь и должно быть true. но лишний || result надо будет убрать. только ещё раз присмотрюсь к этому месту- правильно ли там всё сделано. --
Quote (Kwant) Проверка чисел с плавающей точкой: if((G.FgCur.sx==G.FgDst.sx)&&(G.FgCur.sy==G.FgDst.sy)) - надо бы: fabs( A - B ) < E отлично! а я-то этого не знал, и пытался налепить костылей. большое спасибо)) --
Quote (Kwant) Структура: TFigure - на 32-битной платформе, размер может быть уменьшен с 24 до 20 байт, перестановкой полей. с одной стороны- кого волнуют в наши дни какие-то 4-ре байта, а с другой- интересно, что куда надо переставить? --
Quote (Kwant) Ну и функция void Q_10() == void Q_50() - зачем дубликаты лепить? Quote // действуем соответственно текущему состоянию switch (Q) { case 10: Q_10(); break; // ждём начала игры case 20: Q_20(); break; // ждём хода юзера case 30: Q_30(); break; // перемещаем выделенную фигуру case 40: Q_40(); break; // Искуственный Интеллект case 50: Q_50(); break; // партия окончена, ожидаем завершения игры case 255: ; // ничего не делаем } ну, всё же, декларативно, это разные функции. и даже если они в данный момент совершенно одинаковы, то когда-нибудь, теоретически, могут измениться, если я добавлю, например, какие-нибудь специфические эффекты при ожидании начала игры.
короч- я считаю хорошим стилем держать две разные функции для обработки состояния ожидания начала игры и обработки состояния ожидания завершения игры, даже если на данный момент они абсолютно одинаковы. --
я очень рад, что кто-то потрудился разобраться в моей проге, и даже реально смог мне очень помочь.
ещё раз спасибо!Добавлено (10.11.2012, 14:26) ---------------------------------------------
Quote (Kwant) if((G.FgCur.sx==G.FgDst.sx)&&(G.FgCur.sy==G.FgDst.sy)) - надо бы: fabs( A - B ) < E Quote (noname) отлично! а я-то этого не знал, и пытался налепить костылей. большое спасибо)) да, перемещение фигур в моей проге организовано не в духе традиций HGE, но переделывать уже не буду- разберусь с этим моментом хорошенько в следующем своём проекте(платформер).
все правила форумной игры Дуэль Программистов
|
|
| |
|