На самом деле, это не так уж сложно, если это так.DX-объект может получить щелчок, если вы можете изолировать объект с помощью мыши с помощью системы реверсирования, в зависимости от того, основан ли он на 3D или 2D.2D использует маскирующие эффекты, а 3D добавляет для перевода в и из 2D / 3D пространство на основе определенных свойств, используемых в векторном исчислении.
В значительной степени из логического пространства, в 3D срез трехмерного объекта отображается в 2D-пространстве, которое затем отображается в пространстве камеры, которое затем отображается.Грубый, есть еще кое-что, но я сохраняю это настолько простым, насколько это возможно.Теперь задача состоит в том, чтобы найти 2D-объем / местоположение на пиксель, перевести копию 2D-рендеринга 3D-объекта на изображение, которое будет / уже является DeviceContext для монитора, чтобы показать () на карте, и объединитькликабельный объект (который будет выполнять намеченный код, как и должна делать кнопка) для копии объекта 2D-карты.
Другими словами, найдите, где на экране отображается объект, и сгенерируйте кликабельную маску поверхвизуализированная часть экрана.Будь то растровая маска, или маска многоугольника, или маска куба, или любая другая форма, которую вы можете создать математически;до тех пор, пока 2D-активируемый объект на самом деле взаимодействует с положением и состоянием мыши в системе с постоянным обновлением.
Например, скажем, что приложение полноэкранное, что разрешение составляет 800 x 600 (что проще,это может быть что угодно), и что объект, который вы хотите иметь возможность взаимодействовать, визуализируется в контексте, который не допускает его сам по себе (* 1), и что визуализированный объект показывает прямоугольник.Допустим, в этом вся суть, и система, которую вы используете для перевода, выдает Rectangle (код C # .NET, да, но это только пример, лучше плавать вокруг).Таким образом, мы можем сказать, что координаты прямоугольника маски идентичны координатам визуализируемого объекта.
Итак, скажем: "Маска прямоугольника = новый прямоугольник (100, 100, 200, 100); // Начальная точка X, Начальная точка Y, Длина, Ширина."Довольно понятно.Добавление покадровой позиции курсора по сравнению с позициями маски будет указывать, находится ли курсор над маской, и с дополнительным кодированием может указывать, если курсор щелкнул (или другие события), находясь в пределах диапазона маски.
Допустим, кнопка открывает главное меню.И происходит событие, в частности событие «MouseClick», когда точка доступа курсора находится в точке (125, 200).Который, конечно, был в пределах маски.В этом случае через весь этот тривиальный код открывается главное меню.В эту систему легко добавлять новые интерактивные объекты, если все сделано правильно.
Да, существуют и другие, более простые способы.Но из всех этих, это одна из наиболее динамичных и гибких систем.Диапазон использования варьируется от наличных денег, которые вы получаете в игре, которую вы должны нажать, чтобы получить, до пользовательского интерфейса, до меню, до чего-либо, что можно нажимать.Диапазон не только в играх, либо.Дизайнеры пользовательских интерфейсов, которые любят изобретать велосипед, могут и используют преимущества подобных систем, таких как я, любят определять каждый аспект от микрокода до макрокода.Точно, чтобы определить макрокод как он нужен, как ожидается, и без лишнего раздувания с помощью управления микрокодами.Не говорю, что мне нравится микрокод, поскольку он может быть слишком чертовски привередливым, и часто это так.Это стоит тех нескольких сотен кадров в секунду, которые вы получаете при правильной оптимизации (в первый раз), хотя ...>: - D
* 1 = (предсказуемо в моделях трехмерного рендеринга, с точки зрения рендерингане модифицирование (которое, кажется, включает в себя выбор объекта (через позицию мыши / курсора и все такое), что по сути то, что вы ищете) и как таковое не включено (напрямую). Через перевод это становится возможным, с наивысшей точностью, еслисделано правильно. В дополнение к этому DirectX, OpenGL и другие, как, по умолчанию Renderers.)