AGENTX001, так ты же создаёшь простую программу. Без окна и, что самое важное, обработчика сообщений. Она у тебя после строчки step_timer:=... просто и благополучно завершается, и всё. Не знаю, что делают функции ...Ini (Из модуля windmill? Что-то такое припоминается, но не помню название), но даже если создаётся окно, обработки сообщений нет. Что это вообще за сообщения такие? Сообщения Windows, посылаемые программе (окну), когда пока она "висит" в памяти. Она постоянно (в бесконечном цикле) должна проверять наличие сообщений и обрабатывать их. Минимальная программа Windows на Delphi выглядит так (код из книги "OpenGL в Delphi" М.Краснова):
Code
program WinMin;
uses Windows, Messages;
const AppName = 'WinMin';
Var Window : HWnd; {Ссылка на окно, позволяет однозначно определить каждое окно.} Message : TMsg; {Сообщение - реакция ядра Windows на какое-либо событие.} WindowClass : TWndClass; {Структура класса окна, включает адрес "оконной" функции, обрабатывающей поступающие от Windows сообщения, атрибуты всех окон, принадлежащих этому классу, т.е. задаются основные свойства класса.}
// Специальная "оконная" функция, обрабатывающая сообщения, посылаемые окну. // Вызывается непосредственно ядром Windows (косвенно-вызываемая - callback function). // Параметры эквивалентны полям структуры типа TMsg. function WindowProc (Window : HWnd; Message, WParam : Word; LParam : LongInt) : LongInt; stdcall; begin WindowProc := 0; // Здесь указывается реакция оконной функции на сообщения Windows. case Message of wm_Destroy : begin {Ядро Windows пытается закрыть окно - обработку этого сообщения нельзя опускать.} PostQuitMessage (0); {Посылает прикладной программе сообщение wm_Quit код 0 - успешное завершение.} Exit; {Выход из текущей процедуры.} end; end; // Все сообщения, не обрабатываемые оконной функцией, передаются функции ядра Windows DefWindowProc. WindowProc := DefWindowProc (Window, Message, WParam, LParam); {DefWindowProc обеспечивает обработку тех сообщений окна, которые не обрабатывает прикладная программа.} end;
// Точка входа в программу, которая получает управление от ядра Windows. begin // Всем полям структуры присваиваются определённые значения (определяются атрибуты окна). with WindowClass do begin Style := cs_HRedraw or cs_VRedraw; {Стиль окна класса: окно будет перерисовываться при изменении его горизонтальных и вертикальных размеров.} lpfnWndProc := @WindowProc; {Указатель на оконную функцию, которая будет обрабатывать все сообщения, посылаемые окну.} cbClsExtra := 0; {Выделенная память, используемая программой по своему усмотрению.} cbWndExtra := 0; {Выделенная память, используемая программой по своему усмотрению.} hInstance := 0; {Ссылка на экземпляр программы, используется ядром Windows для однозначного определения сегмента данных экземпляра программы.} hIcon := LoadIcon (0, idi_Application); {Ссылка на иконку для окна, для отображения минимизированного окна, сейчас - иконка, соответствующая приложению.} hCursor := LoadCursor (0, idc_Arrow); {Ссылка на курсор, сейчас - в виде стрелки.} hbrBackground := GetStockObject (White_Brush); {Ссылка на шаблон заполнения фона для окна.} lpszMenuName := ''; {Ссылка на строку имени меню.} lpszClassName := AppName; {Имя класса.} end; // Регистрация окна с заданными атрибутами. // Параметр функции - структура типа TWndClass, содержащая атрибуты окон данного класса. If RegisterClass (WindowClass) = 0 then Halt (255); {Регистрация невозможна, завершение работы программы.} Window := CreateWindow {Создает окно и возвращает ссылку на окно типа HWnd.} (AppName, {Имя класса, к которому принадлежит создаваемое окно.} 'Win_Min', {Заголовок окна.} ws_OverlappedWindow, {Стиль окна, сейчас - комбинация стилей.} cw_UseDefault, {X - начальная позиция верхнего левого угла, сейчас - значение по умолчанию.} cw_UseDefault, {Y - начальная позиция верхнего левого угла, сейчас - значение по умолчанию.} cw_UseDefault, {Width - начальная ширина окна, сейчас - значение по умолчанию.} cw_UseDefault, {Height - начальная ширина окна, сейчас - значение по умолчанию.} 0, {WndParent - родительское окно данного окна.} 0, {Menu - меню, используемое данным окном.} HInstance, {Instance - указывает на экземпляр программы. этот параметр указывается, чтобы оконная функция имела доступ к сегменту данных программы.} nil); {Param - определяет дополнительную информацию, посылаемую через сообщение wm_Create.} // Окно создано, его необходимо отбразить на экране. ShowWindow (Window, CmdShow); {Отображает или делает невидимым указанное окно.} UpdateWindow (Window); {Указывает прикладной программе, что часть окна нуждается в перерисовке.} // После того, как окно отбражено на экране, управление передаётся циклу обработки сообщений. // GetMessage извлекает сообщения из очереди и помещается в структуру типа TMsg. // Для всех сообщений, отличных от wm_Quit (завершение работы программы), эта // функция возвращает ненулевое значение и цикл продолжает обработку сообщений. while GetMessage (Message, 0, 0, 0) do { GetMessage возвращает сообщение из очереди GetMessagePos } begin // TranslateMessage передает структуру типа TMsg ядру Windows для преобразования сообщений о введенных символах TranslateMessage (Message); {Переводит сообщение виртуальных клавиш в символьное сообщение.} DispatchMessage (Message); {Передает сообщение оконной функции указанного окна.} {После того, как оконная функция обработала сообщение, управление возвращается} {в цикл обработки сообщений.} end;// конец цикла обработки сообщений Halt (Message.wParam); {Программа завершается.} end.
*** Собственно, нужно узнать, что и как делает твой движок, и придумать, какой сделать цикл, чтобы программа не завершалась раньше времени.
*** В принципе, можно использовать не таймер из MMSystem, а напрямую из WinAPI, если тебе нужна минимальная программа. Там примерно то же, только обработка сообщения таймера (WM_TIMER) происходит в цикле обработки сообщений... Для его создания - SetTimer(указатель на окно, идентификатор таймера, период, указатель на функцию[для обработки в обработчике сообщений - nil]), и для убийства - KillTimer (указатель на окно, идентификатор таймера);
Сообщение отредактировал TimKruz - Суббота, 24 Декабря 2011, 16:19
черная_тень, Duskly, ждите банан за распространение не лицензионного контента на GCUP. Потому что нельзя, т.к. контент защищён авторским правом, и его нарушение (распространение без ведома автора) - нарушение закона РФ, а это нарушение правил сайта... черная_тень, уж лучше скачать с торрента, там быстрее. И сжимать надо сильнее. А русификация иногда бывает полезна...
Quote (черная_тень)
3. Сборка включает в себя умных ботов. Теперь можете спокойно играть, даже если у Вас нету интернета
ZBots, что ли?
Quote (черная_тень)
2. !без модификаций!(Чистая сборка, не имеет ничего лишнего)
Да ладно, я нашёл чистую сборку (точнее, там можно установить разные модификации, типа ZBots, русификации и т.п., но это по желанию) на торрент-трекере за несколько секунд с помощью Яндекса, при чём там скорость какая-то офигительная (3.5-4 Mbit/s, давно так не скачивал).
tifaso, а по-моему, главное в программе - функциональность и удобность, а не стиль...
Quote (tifaso)
Незнаю конечно, каждый при своём мнении, но на мой взгляд программа получилась отличной в плане её внешнего вида и достаточно стабильной в работе. Мне ею гораздо удобнее пользоваться чем стандартным блокнотом.
Вот скажи честно, тебе правда удобнее или что? Просто, по-моему, гораздо проще за пару секунд открыть самым обычным блокнотом простой текстовый файл, при чём в блокноте можно назначить довольно удобный автоматический перенос строк (а это, между прочем, стандартная функция расширенного поля ввода Windows), ну и, конечно, получить очень много функций в, например, WordPad. А у тебя - долгое время старта, огромная голубая (не всем нравится этот цвет и размер) панель с гигантскими кнопками, которые нажимаются пользователем очень редко, минимум возможностей и при разворачивании на весь экран скрывается панель задач...
И, опять же, т.н. "кэп":
Разве это сообщение настолько важно пользователю? Вот он нажал на "отмена", и, по-твоему, мучается, спрашивая себя: "А правда ли выход отменён? А вдруг она выходит так же долго, как запускается?.."? Короче, его нужно убрать, это уж точно лишнее.
*** tifaso, вот посмотрел на твоём сайте страницу этой программы - мне кажется, версия 1.4 была лучшей из всех, хотя функции те же. Хотя, этот голубой стиль опять же смотрится плохо...
Сообщение отредактировал TimKruz - Суббота, 24 Декабря 2011, 15:23
Не понял! Там выбираешь папку с музыкой для загрузки в список.
Ну, да. Я имел в виду, что при открытии папки загружаются только те файлы, что в ней лежат напрямую, или ещё и те, что лежат во вложенных папках? Т.е., например, я открыл папку music, в ней, скажем, 10 файлов и 2 папки, в каждой из которых тоже десять файлов. Вопрос: сколько файлов загрузится в итоге?
Quote (tifaso)
Здесь нет бага идет дополнительная проверка положения воспроизведения что бы задать правильную иконку.
Нет, ты не понял. Вот у меня играет музыка - кнопка "пауза". Я нажимаю стоп - "воспроизвести". Ещё раз нажимаю стоп (хотя эту кнопку можно и заблокировать) - опять "пауза", хотя ничего не играет. Да, и надпись "Воспроизводится/Остановлено" ведёт себя так же. Да и вообще, как я заметил, кнопка воспроизведение/пауза некорректно функционирует. Сам по ней покликай. Или тебе видео записать? Я могу.
Quote (tifaso)
Не замечал такого. При нажатии стоп он сбрасывается там прописано это в коде программы.
Не, не сбрасывается. И ещё бегунок тоже не сбрасывается. Чуть не сказал, что вообще ничего не воспроизводится... Оказывается, сначала нужно выбрать из списка файл, даже если он там один! А если не выбрать, то в строке "Воспроизводится:" будет почему-то "true" или "false"... Кнопки перемотки совсем не работают при паузе. А при воспроизведении корректно работает только перемотка вправо, и то как-то странно. А влево вообще не перематывает, только дёргается; зато если несколько раз на эту кнопку ("перемотать к началу") нажать, бегунок будет дёргаться... Могу видео записать... Через минуту теста кнопка воспроизведения/паузы и надпись "Воспроизводится/Приостановлено" работают не правильно, т.е. показывают, что остановлено, когда воспроизводится и наоборот.
Вообще я тебе советую блокировать те кнопки, нажатие на которые в данный момент ни к чему не приведёт. (например, после того, как пользователь нажал "стоп" - кнопка "стоп"; когда в плей-листе ни одной или одна песня - кнопки "Предыдущая/Следующая музыка", кнопки перемотки, когда воспроизведение остановлено и т.п.)
Quote (tifaso)
Потому что при первом запуске нужно задать настройки программы так как она запрашивает настройки которых у тебя нет и в следствии зависает.
Что самое интересное - об этом сразу не понять. Да, после сохранения настроек всё отлично. Однако пользователь-то об этом не знает! Следовательно, нужно создавать файл со стандартными настройками, или устанавливать стандартные настройки, если не обнаружен файл настроек. И, кстати, в окне настроек кнопка "Сохранить все изменения" не закрывает окно настроек. И ещё это окно можно свободно растягивать.
Quote (tifaso)
Вот это баг в программе причём очень досадный.
"Баг" - ошибка, которая "закралась" в программу без ведома программиста. А то, что она не отображается на панели задач - это, я думаю, ты сам сделал так?
Одна штука: при открытии одного файла (меню - открыть файл), он не добавляется к существующему плейлисту, а перезаписывает его. Это может оказаться не совсем удобным, особенно учитывая размеры кнопок плейлиста.
Ещё при тестировании мною плейлиста (его функций) у меня почему-то программа зависла (при этом сильно загрузила процессор) и вылетела. Печально.
*** Чуть не забыл! "Кэп":
Вместо этого сообщения можно было просто заблокировать кнопку, как я писал уже выше.
*** Ещё забыл написать: при открытии нет фильтров. Не понятно, что можно открыть, а что нет, а ошибки при открытии не музыкального файла не выдаётся.
Сообщение отредактировал TimKruz - Суббота, 24 Декабря 2011, 15:24
Скин "Purpules" вообще ужасен, особенно размером шрифта. В скине "Argo Green Max" меню плохо просматривается. Я понимаю, что пользователь может это изменить, но это же стандартные скины, и они, по идее, должны быть идеальными... Функция "Открыть из ... >> папку" смотрит вложенные папки?.. Хотелось бы увидеть количество песен в плей-листе. А то открыл, наверное, 1000 штук... И хотелось бы не только добавлять/удалять по-одиночке или всё сразу, а группами... Кнопка "зацикливать музыку" - переключатель (true/false)? Если да, то это должно как-то выделяться на самой кнопке или форме... Вываливающиеся окошки просто так не исчезают, обязательно нужно что-то выбрать... У главного хотя бы крестик есть, а у кнопки "открыть" - нет... Лучше сделать таймер секунд на 5 или закрытие окошка при клике на форме... При нажатии на кнопку "стоп" несколько раз кнопка воспроизведение/пауза меняется - баг. И, конечно, счётчик не ставится в ноль при нажатии "стоп"... Второй раз программа почему-то не запустилась, даже после переустановки. Выдаёт такое окно и закрывается:
И, чуть не забыл: на панели задач программа не отображается, а сворачивается в левый нижний угол, над "пуском". Не удобно, особенно, когда браузер на весь экран. (нельзя быстро переключиться, приходится сворачивать окна, чтобы найти плеер) Как я уже говорил, советую сделать функцию "всегда наверху" и иконку на баре справа снизу. (опять забыл название)
А waterpro.dat зачем? Он содержит параметры воды, понятно, но можно ли его изменять?
Да, можно, конечно. Все файлы с параметрами в текстовом виде можно изменять, главное чтобы не выходило за границы (диапазона значений конкретной переменной) и не было ошибок. Главное, делай копии изменяемых файлов, а то игра в крайнем случае может и не запуститься... Точно не знаю, что там, в этом файле, но могу сказать вот что: в GTA третьей серии (LC, VC, SA, т.к. движок у них один, точнее, его устройство [расположение и названия файлов], хотя постоянно улучшался) город "стоит" на воде, точнее над водой, т.е. есть общий уровень воды, без волн, а уже дальше, в отдельных районах и при разной погоде свободное пространство заполняется водой. При этом настраивается высота воды, высота и частота волн.
Сообщение отредактировал TimKruz - Пятница, 23 Декабря 2011, 17:10
Я как-то баловался, поставив машине "Гепард" массу 50000 кг, скорость 500 км/ч и ускорение-торможение в ноль. (в блокноте) И ещё, кажется, очень сильный удар кулаком - вжик, и тот, кого ударили, висит на дереве/здании. Было весело... А вообще к моддингу отношусь нейтрально, сам не люблю что-либо модифицировать.
Quote (Andrey_M)
Не знаете, где найти прогу, чтобы настройки оружия менять? Ну то есть мощность выстрела, перезарядка.
Все эти программы часто пишутся на коленке и от них больше проблем. Проще в блокноте файлы изменить... А изменение параметров оружия зачастую не даёт преимущества, т.к. оно и у врагов такое же, а уникального оружия нет. Хотя можно, конечно, с кулаками на бандитов/военных идти, но тогда любой прохожий тебя случайно убить сможет...
***
Quote (ahno)
Вся инфа об оружии и машинах лежит простыми текстовыми файлами в папке игры, дерзай же.
Ага, handling.cfg с параметрами машин и weapon.dat с параметрами оружия... (в папке data)
Сообщение отредактировал TimKruz - Пятница, 23 Декабря 2011, 16:54
Есть поисковик, который всё найдет. Было бы кому искать.
Вы бы эту ссылку где-нибудь на видном месте разместили, а то ссылка "Поиск" в левом верхнем углу и "Поиск по всему сайту" предлагают стандартный поисковик... (Конечно, если в "Поиск по всему сайту" нажать "найти" и потом выбрать одну из нижних ссылок, то откроется другой поисковик, но это не на виду расположено)
Все теже ошибки: 1 дерево, 1 дорога, 1 "травка". Геймплея в игре нет, потому что нет ни атмосферы, ни кач. звукового сопр., нет ничего кроме "пустой (на мой взгляд) коробочки основных (очень урезаных) возможностей. Идем дальше: нет анимации, нет квеста, интерфейс отталкивает, проблемы с рес. (нужно более чем 3) что бы было некое разнообразие. Напоследок - мир пуст, хоть и является заполнненым, он однообразен, скучен (звук, звук!), отсутствие полноценного AI.
Что ты от него хочешь - всё и сразу? Для начала у него всё вполне хорошо. И, уж тем более, это не ошибки. И, кстати - "возможностей, очень урезанных" по сравнению с чем? Это же не клон какой-то игры, не мод и не многолетняя разработка.
buga, есть такой баг, с отображением бара здоровья. Когда юнит добывает ресурсы, у него как будто максимальное здоровье, и визуально оно не уменьшается...
Но какие нужны еще библиотеки для комфортного использования OpenGL? glut, glew, glee?
Ну, для начала изучения и gl/glu хватит, дополнительные библиотеки уже потом изучать нужно... В Glut, если не ошибаюсь, есть много полезных примитивов (всякие кубы, шары, чайник и ещё несколько). Главное усвоить основы, без них ни какие дополнительные не помогут...
Можно сделать просто. "Скрипт" анализируется на ошибки, исправляется и обрабатывается, чтобы получить список команд. Затем в цикле: берётся первая команда и, если такая существует (поддерживается интерпретатором), выполняется. Например: if c1='WRITE ' then write(c2). Ну, конечно, так же делаются и конструкции. (if, for и т.д.) Ничего сложного не вижу.
не рассказывают какие файлы нужно иметь, где их скачать.
Сама библиотека OpenGL должна быть у тебя на компьютере. Модули для подключения OpenGL обычно поставляются в стандартном пакете любой среды программирования. Так что можешь уже начинать программировать. Или у тебя примеры из книг вообще не запускаются? P.S. И ты не сказал, на каком языке программируешь.
Сообщение отредактировал TimKruz - Четверг, 22 Декабря 2011, 11:40
Давно как-то нарисовал оранжевую трубу-банку; сейчас подрисовал немного мелочей, получилась такая фиговина: Не слишком ярко?.. Всё равно, выглядит как-то слишком пусто.
взять хотя бы [url=http://docwiki.embarcadero.com/CodeExamples/en/BringToFront_(Delphi)]тутор[/url]
Чем тебе функция BringToFront не угодила? По-моему, удобно.
Quote (prog_154rus)
В чем дельфи лучше java, например? Тем, что он платный и это круто? И сервера выгоднее держать на линуксе, там дельфи нет.
Был бесплатный вариант Delphi, для студентов. Ну, спорить об этом можно долго. Да, ява-машина хорошо интерпретирует, но всё-таки это совсем не то, что обычные программы. Вы только подумайте: чтобы запустить что-то весом 100 КБ, нужно скачивать кучу других штуковин, весом по несколько сот мегабайт, которые весят в памяти и жрут ресурсы: всякие там java-машины и net-платформы. А для Linux Delphi всё-таки есть, например, Kylix 3 (правда он умер как проект, т.е. не разрабатывается, но скачать и программировать всегда можно). И, кстати, Lazarus поддерживает Linux. Хотя это совсем другой проект, но синтаксис там тот же.
Quote (Stage)
А как платформа дельфи - это устаревшее говно с функциями типа inttostr и блевотной VCL из прошлого века.
ИМХО, использовать IntToStr и VCL лучше, чем, чтобы просто преобразовать число в строку, создавать кучу объектов, а разместить нужный компонент на форме проще, чем целый час описывать форму и все её свойства.
Quote (Stage)
но с приходом .net она ушла
Delphi поддерживает платформу net. Хотя я не вижу в ней смысла, лишние сотни мегабайт не нужных пользователю функций.
Quote (prog_154rus)
Сейчас C# и VB убили дельфи на фронте виндовса.
Чем? Своей бесплатностью? ИМХО, C# сложнее Delphi, а VB ограниченный по определению.
Quote (prog_154rus)
Java EE убил на серверах.
Ничего не мешает использовать вместо Java тот же Delphi. И конечный пользователь просто не заметит разницы. Хотя, смотря какой программист.
Всё, не надо разводить холивар. И, заметьте - не я его начал, я просто предложил вариант, а VipCat пусть сам решает, что ему нужно. Спорить, что лучше использовать - "А" или "Б", где А=Б, хотя реализовано иначе - безумно интересно, но совершенно бессмысленно.
создай объект мыши, например objMouse, в шаг (событие) напиши код движения по сетке и за мышью: При нажатии ПКМ пиши:
Брр, зачем создавать новый объект? И зачем использовать GML, когда задача легко решается "на кнопках"? Я сделал примерно так же, только в объекте игрока и без лишнего кода.