Актуальная версия v0.3.0

Особенности

  1. Система отрисовки пользовательского интерфейса:
    • (+) Основная система;
    • (+) Управление при помощи Jass функций;
    • (+) Поддержка многострочного текста с форматированием;
    • (+) Поддержка .ttf формата шрифтов;
  1. Постобработка:
    • (+) HDR Rendering;
    • (+) ACES Tonemapping and Color Grading;
    • (+) Screen Space Reflections;
    • (+) Temporal Anti-Aliasing;
    • (+) Contact Shadows;
    • (+) Поддержка пользовательских шейдеров;
    • (-) Управление при помощи Jass функций;
  1. Улучшенное освещение:
    • (+) Каскадные тени;
    • (+) Расчёт освещения в линейном пространстве;
    • (+) Physically Based Shading;
    • (+) Поддержка пользовательских шейдеров;
    • (+) Поддержка карт нормалей;
    • (-) Управление при помощи Jass функций;
  1. Прочее:
    • (+) Переход с Direct3D8 на Direct3D9;
    • (+) Поддержка широкоформатных мониторов;
    • (+) Уменьшение задержки между приказами в игре;
    • (+) Запуск более одного экземпляра war3.exe одновременно;
    • (+) Возможность включить/выключить вертикальную синхронизацию.

Скриншоты

Custom Natives

Дополнительные константы
// TriggerRegisterMouseEvent & TriggerRegisterKeyEvent
constant integer MB_Left = 0
constant integer MB_Middle = 1
constant integer MB_Right = 2
constant integer MB_X1 = 3
constant integer MB_X2 = 4
constant integer KEY_Any = -1
constant integer EVENT_Down = 0
constant integer EVENT_Up = 1

// CtrlSetAnchor & SetPortrait
constant integer ANCHOR_TOPLEFT = 0
constant integer ANCHOR_TOP = 1
constant integer ANCHOR_TOPRIGHT = 2
constant integer ANCHOR_LEFT = 3
constant integer ANCHOR_CENTER = 4
constant integer ANCHOR_RIGHT = 5
constant integer ANCHOR_BOTTOMLEFT = 6
constant integer ANCHOR_BOTTOM = 7
constant integer ANCHOR_BOTTOMRIGHT = 8
Mouse API
native int GetMouseX() // Возвращает положение курсора в экранных координатах
native int GetMouseY()
native int GetMouseXRelative()
native int GetMouseYRelative()
native float GetMouseTerrainX() // Возвращает проекцию позиции курсора на ландшафт
native float GetMouseTerrainY()
native float GetMouseTerrainZ()
native bool IsMouseOverUI() // Находится ли курсор над стандартным интерфейсом или нет?
native void BlockMouse(bool bBlock) // Блокирует входные сообщения от мыши (перемещение, нажатия), передаваемые в игру
native int GetWheelDelta() // Возвращает направление/скорость вращения колёсика мыши (положительное значение указывает на то, что колесо вращается вперед)
native void SetMousePos(int x, int y) // Устанавливает положение курсора
native void TriggerRegisterMouseWheelEvent(trigger trig) // Триггер срабатывает при прокрутки колёсика мыши
native void TriggerRegisterMouseMoveEvent(trigger trig) // Триггер срабатывает при перемещении курсора
native void TriggerRegisterMouseEvent(trigger trig, int iButton, int state) // Триггер срабатывает при нажатии (state == 0) / отпуске (state == 1) кнопки iButton (поставьте iButton == -1, чтобы отлавливать все кнопки мыши)
Keyboard API
native int GetTriggerKey() // Возвращает последнюю нажатую клавишу
native bool IsKeyDown(int iKey) // Нажата ли клавиша?
native void TriggerRegisterKeyEvent(trigger trig, int iKey, int state) // Триггер срабатывает при нажатии (state == 0) / отпуске (state == 1) клавиши iKey (поставьте iKey == -1, чтобы отлавливать любые клавиши)
Window API
native int GetWindowWidth() // Возвращает ширину экрана в полноэкранном режиме, либо ширину окна в оконном
native int GetWindowHeight()
native int GetWindowX() // Возвращает координаты окна
native int GetWindowY()
native void TriggerRegisterWindowResizeEvent(trigger trig) // Триггер срабатывает при изменении размера окна
GUI API
native void CtrlNew(int id, int offsetX, int offsetY, int width, int height) // Создаёт новый экземпляр элемента GUI (id >= 0)
native void CtrlSetText(int id, string text, bool bWrap) // bWrap: если текст заходит за пределы ширины, заданной при создании элемента GUI, то происходит переход на новую строку
native void CtrlSetColor(int id, int argb) // Красит элемент GUI в заданный цвет
native void CtrlSetAnchor(int id, int parentId, int anchor) // Выравнивание элемента. Установите parentId = -1, чтобы выравнивание шло относительно всего окна
native void CtrlSetTexture(int id, string filename) // Устанавливает текстуру элемента
native void CtrlSetSize(int id, int width, int height) // Устанавливает размер элемента. Функция не изменяет ширину или высоту, если установить соответствующий аргумент равным -1;
native void CtrlSetPosition(int id, int offsetX, int offsetY) // Устанавливает позицию элемента
native void CtrlShow(int id, bool isShow) // Показывает (true) / скрывает (false) элемент GUI
native void CtrlSetDepth(int id, float fDepth) // Определяет порядок поиска элементов GUI функцией CtrlGetFromMousePoint. Чем значение fDepth меньше, тем элемент расположен ближе к экрану (1.0 по умолчанию)
native void CtrlSetAngle(int id, float fAngle) // Устанавливает угол поворота элемента GUI (в радианах)
native int CtrlGetWidth(int id)
native int CtrlGetHeight(int id) // Используется, чтобы узнать высоту элемента GUI после применения функции CtrlSetText с аргументом "bWrap" == true
native int CtrlGetFromPoint(int x, int y) // Возвращает элемент, расположенный по заданным координатам (если такого нет, возвращает -1)
native bool CtrlIsText(int id) // Является ли элемент GUI текстом?
native void CtrlSetFont(int id, string fontName, int size) // Устанавливает шрифт для указанного элемента GUI (по умолчанию используется "Consolas" с размером 13)
native void GUILoadFont(string fileName) // Загружает шрифт по указанному пути в память
Misc API
native float GetFPS() // Возвращает количество кадров в секунду
native float GetDeltaTime() // Возвращает количество времени, затрачиваемое на отрисовку одного кадра (в секундах)
native int COLOR_ARGB(int a, int r, int g, int b) // Переводит цвет из ARGB формата в шестнадцатеричное значение
native void EnableVsync(bool bEnable) // Включает/выключает вертикальную синхронизацию
native void TriggerRegisterFrameUpdateEvent(trigger trig) // Триггер срабатывает каждый кадр
native bool IsGamePaused() // Находится ли игра на паузе?
native void SetBlackBorders(float upper, float bottom) // Изменяет расположение чёрных границ по оси y (значения находятся в промежутке от 0.0 до 0.6). Значения по умолчанию - upper = -0.02, bottom = 0.13.
native void SetPortrait(int anchor, int x, int y, int width, int height) // Устанавливает расположение и ширину портрета в пикселях. Выравнивание идёт относительно всего окна.
Lighting API
N/A
Post-processing API
N/A

Установка

Требования:

Распакуйте архив и запустите RenderEdge.exe. При первом запуске появится окно с предложением выбрать расположение файла war3.exe.
Нажмите F7, чтобы показать меню настроек. Изменить настройки также можно в файле RenderEdge.ini.
В редакторе реестра можно включить опцию, позволяющую загружать файл настроек, шейдеры и текстуры из папки с RenderEdge: HKEY_CURRENT_USER\Software\RenderEdge\AllowLocalFiles. Последовательность поиска ресурсов: загруженная карта, папка с RenderEdge, архив RenderEdge_exp.mpq.
Для подключения RenderEdge к Jass New Gen Pack (exp. 2) отредактируйте файл wehack.lua следующим образом:
wehack.lua
-- # begin RenderEdge #
RenderEdgePath = grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "InstallPath")
haveRenderEdge = grim.exists(RenderEdgePath .. "\\RenderEdge.exe")

function toggleRenderEdgeDebug(checked)
    if checked then
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 1)
	else
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 0)
	end
end

function toggleRenderEdgeAllowLocalFiles(checked)
    if checked then
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "AllowLocalFiles", 1)
	else
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "AllowLocalFiles", 0)
	end
end

if haveRenderEdge then
	RenderEdgeMenu = wehack.addmenu("RenderEdge")
	
	RenderEdgeEnabled = TogMenuEntry:New(RenderEdgeMenu, "Run with RenderEdge", nil, true)
	
	RenderEdgeDebug = TogMenuEntry:New(RenderEdgeMenu, "Debug Mode", 
	    function(self) toggleRenderEdgeDebug(self.checked) end, false)
	if grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug") == 1 then
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 1)
	else
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 0)
	end
	
	RenderEdgeAllowLocalFiles = TogMenuEntry:New(RenderEdgeMenu, "Allow Local Files", 
	    function(self) toggleRenderEdgeAllowLocalFiles(self.checked) end, false)
	if grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "AllowLocalFiles") == 1 then
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeAllowLocalFiles, 1)
	else
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeAllowLocalFiles, 0)
	end
end
-- # end RenderEdge #

function testmap(cmdline)
	if haveRenderEdge and RenderEdgeEnabled.checked then
		local pos = string.find(cmdline, ".exe")
		cmdline = string.sub(cmdline, 5 + pos)
		cmdline = RenderEdgePath .. "RenderEdge.exe " .. cmdline
	end
	
	if wh_opengl.checked then
		cmdline = cmdline .. " -opengl"
	end
	if wh_window.checked then
		cmdline = cmdline .. " -window"
	end
	wehack.execprocess(cmdline)
end

Редактирование шейдеров

Если вы хотите отредактировать шейдеры, то скачайте архив, распакуйте шейдеры, скомпилируйте и поместите их в папку Shaders. Эту папку вы можете импортировать в карту, разместить в папке RenderEdge или в архиве RenderEdge_exp.mpq.

Компиляция из Visual Studio

Добавьте шейдеры в проект, в его свойствах настройте HLSL Compiler следующим образом:





Компиляция с помощью fxc.exe

@echo off
fxc.exe /T fx_2_0 /Fo Standard.cso Shaders\Standard.fx /nologo
fxc.exe /T fx_2_0 /Fo Shadows.cso Shaders\Shadows.fx /nologo
fxc.exe /T fx_2_0 /Fo PostProcess.cso Shaders\PostProcess.fx /nologo
fxc.exe /T fx_2_0 /Fo Skybox.cso Shaders\Skybox.fx /nologo
pause

Примеры

[RenderEdge] Sample Map - идёт в комплекте с RenderEdge (папка Maps).
Карта написана на vJass и содержит демонстрацию использования всех функций RenderEdge. Карта обновляется каждый раз, при выпуске новой версии RenderEdge.
Особенности карты:
  • Система пользовательского интерфейса (виджеты: Label, Button, Dragbox, Checkbox, Horizontal Slider);
  • Редактирование стандартного интерфейса;
  • Система управления камерой.

Список изменений

Следите за разработкой RenderEdge на Trello.
v0.3.0
  * Слияние с экспериментальной версией;
  * Добавлена поддержка Cine Filter;
  * Улучшен Image Based Lighting: генерация BRDF LUT текстуры и использование EnvBRDF функции вместо приближения;
  * Добавлен шейдер ландшафта;
  * Загрузка .ini файла из папки с RenderEdge без флага AllowLocalFiles;
  * Добавлена кнопка перезагрузки шейдеров;
  * Обновлён эффект Bloom;
  * Исправлен баг в лаунчере, из-за которого окно выбора пути к war3.exe не появлялось после переноса варкрафта в другую папку;
  * Исправлено качество теней;
  * Исправлена некорректная дальняя плоскость отсечения теней;
  * Исправлено некорректное название и расширение файлов скриншотов;
  * Исправлена отрисовка пост-эффектов при загрузке карты.

v0.2.7a
  * Обновлён RenderStage Controller (улучшен перехват отрисовки стандартного интерфейса);
  * Исправлены баги в JassAPI (некорректная конвертация real <=> float);
  * Исправлены баги в функциях CtrlSetDepth и CtrlSetAngle;
  * Исправлены слайдеры и чекбоксы в карте-примере;
  * Добавлены описания .exe и .dll файлов.

v0.2.6a
  * Убран лимит на размер 512p в .blp тексурах (спасибо Karaulov`у);
  * Добавлена новая native функция CtrlSetZOrder (порядок отрисовки элементов интерфейса);
  * Добавлена новая native функция EnableAnisoFiltering (возможность установить анизотропную фильтрацию текстур);
  * Добавлена новая native функция HideInterface;
  * Добавлены новые native функции: EditMinimap, EditCommandBarButton, EditHeroBarButton, EditItemBarButton, EditMinimapButton и EditUpperButtonBarButton;
  * Изменено название функций SetPortrait и SetBlackBorders на EditPortrait и EditBlackBorders;
  * Исправлено большое количество багов в RenderEdge_loader.dll и RenderEdge.exe;
  * Исправлен некорректный перенос строки при использовании символа "|n" во wrapped тексте;
  * Исправлено большое количество багов в GUI-системе (например, баг с функцией CtrlSetTexture при перезапуске карты);
  * Оптимизирована GUI-система. Некоторые функции переписаны с нуля;
  * Оптимизированы менеджеры шрифтов и текстур;
  * Обновлены detours.lib и libjpeg.lib до последней версии;
  * Улучшен и оптимизирован debug log.

v0.2.5a
  * Добавлена новая native функция GUILoadFont;
  * Добавлена новая native функция CtrlSetFont;
  * Удалена функция GUISetFont;
  * Исправлены вылеты при установке некоторых шрифтов (например, "Times New Roman");
  * Исправлена высота однострочного текста;

v0.2.4a
  * Добавлена новая native функция SetPortrait;
  * Функция CtrlSetSize теперь не изменяет ширину или высоту, если вы установите соответствующий аргумент равным -1;
  * Изменено имя функции CtrlSetAlignment на CtrlSetAnchor;
  * Изменён способ исправления ширины полосок здоровья;
  * Исправлено выравнивание динамических элементов по отношению к другим элементам пользовательского интерфейса;
  * Исправлена высота wrapped текста;
  * Исправлена высота wrapped текста при динамическом изменении ширины;
  * Исправлены проблемы с безопасностью. Если жирный, курсивный или полужирный курсивный шрифт недоступен, используется обычный шрифт.

v0.2.3b
  * Исправлено выравнивание относительно других элементов интерфейса.

v0.2.3a
  * Добавлена новая native функция CtrlSetSize;
  * добавлена новая native функция CtrlSetAlignment;
  * Функции CtrlSetPosition и CtrlNew теперь принимают offsetX и offsetY вместо x и y;
  * Удалена функция CtrlSetRect.

v0.2.2a
  * Добавлена новая native функция IsGamePaused;
  * Добавлена новая native функция SetBlackBorders;
  * Обновлен Jass API, исправлены некоторые баги связанные с пользовательскими нативными функциями;
  * Исправлены нативные функции, которые принимают аргументы тира boolean;
  * Исправлено повторное добавление триггеров функциями TriggerRegister#Event после перезапуска карты;
  * Функция EnableVsync теперь работает без необходимости сворачивать игру;
  * Исправлена ошибка, при которой новые элементы GUI не имели зеленой текстуры по умолчанию;
  * Улучшен debug log. Лог файл очищается, если размер превышает 100 КБ.

v0.2.1b
  * Исправлены вылеты при вызове функций CtrlSetText, CtrlSetTexture и GUISetFont (проблема с конвертацией UTF-8 в ASCII);
  * Удалено нестабильное нововведение из предыдущей версии: "Убрано стандартное ограничение минимальной дистанции камеры до цели";
  * Обновлён FreeType до версии 2.8;
  * Обновлён RenderEdge_loader.dll. Теперь он ищет RenderEdge_exp.dll, если не нашёл, то запускает RenderEdge.dll;
  * Добавлен счётчик памяти, используемой варкрафтом;
  * Оптимизация GUI системы;
  * Оптимизация Widescreen fix;
  * Оптимизация debug log. Система отладки переписана с нуля.

v0.2.1a
  * Обновлён Widescreen Fix. Вертикальный угол обзора больше не зависит от ширины экрана;
  * Снято ограничение на максимальный FPS, теперь он может подниматься выше 64 с выключенным vsync (спасибо Karaulov'у);
  * Убрано стандартное ограничение минимальной дистанции камеры до цели (было 100.0, теперь можно установить до 0.01);
  * Использование более точного формата буфера глубины, если поддерживается. Используйте SetCameraField(ConvertCameraField(7), value, time), чтобы изменить ближнюю плоскость отсечения камеры (100.0 по умолчанию);
  * Добавлена новая native функция TriggerRegisterFrameUpdateEvent. Триггер срабатывает каждый кадр (задержка меньше 0.001 секунд);
  * Добавлена новая native функция EnableVsync (включено по умолчанию);
  * Добавлены новые native функции GetWindowX и GetWindowY;
  * Добавлены новые native функции GetMouseXRelative и GetMouseYRelative;
  * Функции GetMouseX и GetMouseY теперь возвращают координаты без отсечения границами окна;
  * Изменено название функции FPS на GetFPS;
  * Изменено название функции DeltaTime на GetDeltaTime;
  * Функция GetDeltaTime теперь возвращает секунды вместо миллисекунд;
  * Улучшен debug log. Лог файл очищается при превышении размера в 1 MB.

v0.2.0a
  * Поддержка Direct3D9;
  * Блокировка функции CtrlGetFromPoint, если игра на паузе;
  * Показ GUI только после загрузки карты;
  * Исправлен баг, связанный с тем, что ширина и высота текстур были перепутаны;
  * Исправлен слишком большой угол обзора при использовании Widescreen Fix;
  * Исправлена проблема, связанная с тем, что невозможно было запустить приложение с первой попытки;
  * Обновлён FreeType до версии 2.7;
  * Запуск более одного экземпляра war3.exe одновременно;
  * Оптимизация RenderEdge.dll;
  * Исправлены проблемы безопасности;
  * Обновлено лого проекта, и добавлен значок приложения;
  * Улучшен debug log;

v0.1.0a
  * Реализована поддержка широкоформатных мониторов;
  * Реализовано корректное получение информации из jass строки (поддержка всех языков, а не только английского);
  * Добавлена поддержка TTF шрифтов, используя FreeType (https://www.freetype.org/);
  * Добавлена поддержка многострочного текста и форматирования ("|n" (на новую строку), "|cAARRGGBB" (изменить цвет), "|b" (полужирный шрифт), "|i" (наклонный шрифт), "|r" (сброс к стандартному цвету текста и обычному шрифту));
  * Уменьшена задержка отдачи приказов юнитам в одиночной игре;
  * Исправлена проблема, связанная с невозможностью запустить RenderEdge после переустановки Warcraft по другому пути;
  * Изменено название функции CtrlCreateInstance на CtrlNew;
  * Изменена функция CtrlSetText(int id, bool autoResize, string text) на CtrlSetText(int id, string text, bool bWrap);
  * Изменена функция CtrlGetFromMousePoint() на CtrlGetFromPoint(int x, int y);
  * Добавлена новая native функция GUISetFont;
  * Добавлена новая native функция CtrlIsText;
  * Функция IsMouseOverUI теперь работает корректно;
  * Удалена функция CtrlSetSolidColor, вместо этого используйте белую текстуру ("Textures\\white.blp") и функцию CtrlSetColor(int argb);
  * Добавлен логотип проекта;
  * Уменьшен размер RenderEdge.mpq;
  * Улучшен debug log.

v0.0.3a
  * Реализовано чтение настроек из реестра;
  * Добавлены функции CtrlGetHeight и CtrlGetWidth для получения ширины элемента GUI после применения функции CtrlSetText с аргументом "autoResize" == true;
  * Исправлено растягивание полосок здоровья на широкоформатных экранах;
  * Отключена функция EnableDebug, теперь включение режима отладки осуществляется из редактора реестра;
  * Улучшена совместимость с JNGP;
  * Улучшен debug log.

v0.0.2b
  * Исправлена проблема, при которой не получалось запустить мод с первого раза;
  * Улучшен debug log.

v0.0.2a
  * Исправлена ошибка с загрузкой RenderEdge.mpq, теперь мод можно без проблем размещать в любой папке;
  * Исправлен баг в функции CtrlSetText, при котором все элементы GUI, использующие текстуру шрифта, имели одинаковый текст;
  * Изменена функция CtrlSetText - убран аргумент "argb", отвечающий за цвет создаваемого текста, вместо этого используйте функцию CtrlSetColor (текст по умолчанию белый);
  * Изменена функция CtrlSetDepth - тип аргумента "depth" изменён на real;
  * Добавлена новая native функция CtrlSetAngle;
  * Удалена функция CtrlSetCallback.

v0.0.1a
  * Первая стабильная версия.

Ссылки


Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
24
8 лет назад
0
ELB359, зачем это нужно? подсветка нативки? Толку мало
0
10
8 лет назад
Отредактирован Lotus101
0
ENAleksey:
Кстати, а нет ли планов как-то объединить мод с JNGP?
Для подключения RenderEdge к Jass New Gen Pack (exp. 2) скачайте и замените файл wehack.lua в папке с JNGP (заменяет вкладку с RtC). Либо отредактируйте его самостоятельно:
wehack.lua
Пример того, как выглядит wehack.lua после редактирования
-- # begin RenderEdge #
RenderEdgePath = grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "InstallPath")
haveRenderEdge = grim.exists(RenderEdgePath .. "\\RenderEdge.exe")

function toggleRenderEdgeDebug(checked)
    if checked then
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 1)
	else
		grim.setregdword("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug", 0)
	end
end

if haveRenderEdge then
	RenderEdgeMenu = wehack.addmenu("RenderEdge")
	RenderEdgeEnabled = TogMenuEntry:New(RenderEdgeMenu, "Run with RenderEdge", nil, true)
	RenderEdgeDebug = TogMenuEntry:New(RenderEdgeMenu, "Debug Mode", 
	    function(self) toggleRenderEdgeDebug(self.checked) end, false)
	if grim.getregpair("HKEY_CURRENT_USER\\Software\\RenderEdge", "Debug") == 1 then
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 1)
	else
		wehack.checkmenuentry(RenderEdgeMenu, RenderEdgeDebug, 0)
	end
end
-- # end RenderEdge #

function testmap(cmdline)
	if haveRenderEdge and RenderEdgeEnabled.checked then
		local pos = string.find(cmdline, ".exe")
		cmdline = string.sub(cmdline, 5 + pos)
		cmdline = RenderEdgePath .. "\\RenderEdge.exe " .. cmdline
	end
	
	if wh_opengl.checked then
		cmdline = cmdline .. " -opengl"
	end
	if wh_window.checked then
		cmdline = cmdline .. " -window"
	end
	wehack.execprocess(cmdline)
end
Постарайтесь склеиться с mix файлом. Он вариком автоматически подгружается, так что думаю, что есть шанс разобраться и вклеить туда запуск своего кода
Пробовал, но что-то не получалось, возможно, из-за того, что загрузка mix файлов происходит после создания Direct3D, а для работы мода нужно перехватить эту функцию до её вызова.
Возможно, сделаю два способа внедрения RenderEdge: (Или лучше оставить только один вариант?)
  • Запуск через .exe;
  • Внедрение библиотеки в игру с помощью d3d8.dll/d3d9.dll в паке с варкрафтом.
Я не силен в джассе, но преобразовать в свою карту умею. Мне бы хотелось добавить в карту систему перемещения камеры от 3 лица на правую кнопку мыши и чтобы она двигалась плавно за героем, и передвижение героя на клавиши wasd, можете ли вы добавить это в мод или функции написать?
Я уже добавил вращение и приближение камеры при зажатом Ctrl и правой клавише мыши. Выложу обновлённую карту-пример вместе со следующей версией мода. Но если надо сейчас, то вот код (ещё изменится):
Камера
library Camera initializer Camera_Init
{
    private float facing = 0.0;
    private float aoa = 0.0;
    private float curCamDist = 0.0;

    private float cameraTime = 0.03125;
    private float sens = 0.05;

    private bool bRBM = false;
    private bool bCtrlPressed = false;


    private void OnMouseMove()
    {
        if (bCtrlPressed && bRBM)
        {
            int centerX = GetWindowWidth()/2;
            int centerY = GetWindowHeight()/2;
            float deltaX = I2R(centerX - GetMouseX()) * sens;
            float deltaY = I2R(centerY - GetMouseY()) * sens;
            
            if (GetMouseX() != centerX)
            {
                facing += deltaX;
                if (facing > 360.0)   { facing -= 360.0; }
                elseif (facing < 0.0) { facing += 360.0; }

                SetCameraFieldForPlayer(Player(0), CAMERA_FIELD_ROTATION, facing, cameraTime);
            }
            
            if (GetMouseY() != centerY)
            {
                aoa += deltaY;
                if (aoa > 360.0)     { aoa = 360.0; }
                elseif (aoa < 275.0) { aoa = 275.0; }
                
                SetCameraFieldForPlayer(Player(0), CAMERA_FIELD_ANGLE_OF_ATTACK, aoa, cameraTime);
            }
            
            SetMousePos(centerX, centerY);
        }
    }

    private void OnKeyboardDown()
    {
        if (GetTriggerKey() == 17 && !IsKeyDown(1) && !IsKeyDown(2))
        {
			curCamDist = GetCameraField(CAMERA_FIELD_TARGET_DISTANCE);
            BlockMouse(true);
            //ShowCursor(false);
            bCtrlPressed = true;
        }
    }

    private void OnKeyboardUp()
    {
        if (GetTriggerKey() == 17)
        {
            BlockMouse(false);
            //ShowCursor(true);
            bCtrlPressed = false;
        }
    }
                
    private void OnMouseDown()
    {
        bRBM = true;
        if (bCtrlPressed)
        {
            facing = GetCameraField(CAMERA_FIELD_ROTATION) * bj_RADTODEG;
            aoa = GetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK) * bj_RADTODEG;
            SetMousePos(GetWindowWidth()/2, GetWindowHeight()/2);
        }
    }
            
    private void OnMouseUp()
    {
        bRBM = false;
    }

    private void OnWheelEvent()
    {
        if (bCtrlPressed)
        {
            curCamDist -= I2R(GetWheelDelta()) * 0.5;
            if (curCamDist < 300.0)
            {
                curCamDist = 300.0;
            }
            elseif (curCamDist > 3000.0)
            {
                curCamDist = 3000.0;
            }
            SetCameraFieldForPlayer(Player(0), CAMERA_FIELD_TARGET_DISTANCE, curCamDist, cameraTime);
        }
    }

    //===========================================================================
    private void Camera_Init()
    {
        trigger temp = CreateTrigger();
        TriggerRegisterTimerEvent(temp, cameraTime, true);
        TriggerAddAction(temp, function OnMouseMove);
        //TriggerRegisterMouseMoveEvent(temp);

        temp = CreateTrigger();
        TriggerAddAction(temp, function OnKeyboardDown);
        TriggerRegisterKeyEvent(temp, KEY_Any, EVENT_Down);

        temp = CreateTrigger();
        TriggerAddAction(temp, function OnKeyboardUp);
        TriggerRegisterKeyEvent(temp, KEY_Any, EVENT_Up);
	
        temp = CreateTrigger();
        TriggerAddAction(temp, function OnMouseDown);
        TriggerRegisterMouseEvent(temp, MB_Right, EVENT_Down);
	
        temp = CreateTrigger();
        TriggerAddAction(temp, function OnMouseUp);
        TriggerRegisterMouseEvent(temp, MB_Right, EVENT_Up);
	
        temp = CreateTrigger();
        TriggerAddAction(temp, function OnWheelEvent);
        TriggerRegisterMouseWheelEvent(temp);
    }
}
Готовую систему перемещения камеры от первого лица (легко переделать для третьего лица) можно взять отсюда, в RenderEdge есть все необходимые функции для реализации.
Ок спасибо, вот еще что думаю, можно ли сделать как в шутере за счет вашей функции определения положения мышки? Я просто сам не могу придумать как сделать полет пули в выбранную точку на экране, а если это обычный предмет, то чтобы он еще падал со временем. И подскажи пжл как установить этот шарпкрафт, на том сайте вроде как нету пояснений для установки.
0
7
8 лет назад
0
Lotus101, думаю, варкрафт слишком неудобен для этого, почему бы юнити не использовать?
0
10
8 лет назад
0
ELB359:
Lotus101, думаю, варкрафт слишком неудобен для этого, почему бы юнити не использовать?
Хочу сделать рпг картой с такой камерой, но там у парочки героев будет скил кинуть кинжал, ну и будет тупо если он просто полетит прямо от героя.
0
13
8 лет назад
0
Lotus101, посмотри эту систему, либо сделай сам. Для движения снарядов нужно написать всего-лишь одну-две формулы. Ещё можешь посмотреть наработки для Unreal Engine, Unity, либо прочитать книги по игровой физике.
0
10
8 лет назад
0
ENAleksey:
Lotus101, посмотри эту систему, либо сделай сам. Для движения снарядов нужно написать всего-лишь одну-две формулы. Ещё можешь посмотреть наработки для Unreal Engine, Unity, либо прочитать книги по игровой физике.
Спасиб, а как установить и пользоваться sharpcraft знаешь?
0
20
7 лет назад
0
На скринах с гером на панели приказов от нас замазали что-то вкусное
0
13
7 лет назад
Отредактирован ENAleksey
0
ssbbssc, если вы про миникарту, то это я случайно нажал на кнопку скрытия ландшафта и долго не мог понять, в чём дело :)
0
33
7 лет назад
0
ENAleksey, про красные квадраты справа ятп
0
13
7 лет назад
0
Кет, а, это вообще старая версия.
Здесь я просто показал, что можно заменить стандартные кнопки приказов на свои.
11
13
7 лет назад
Отредактирован ENAleksey
11
Кстати, вот пример того, как выглядит моя старая карта после переноса на RenderEdge (пока без графических улучшений и пост-эффектов) + демонстрация одной из предстоящих фичей:
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.