HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 09.04.2025, 12:27
DaniilPovetkin
Новичок
Регистрация: 14.01.2020
Сообщений: 14
С нами: 3333204

Репутация: 53
По умолчанию

Всем привет, вопрос скорее к знатокам математических функций. Пишу отрисовку текста в пространстве SAMP, и хочу сделать, что когда игрок не смотрит на этот текст, то ему указывалось направление иконкой, например если точка сзади, то внизу экрана и так по всей его плоскости. Но сейчас работает коряво, вроде слева отображается, справа тоже, а когда спиной стою никак

C++:





Код:
ImVec2
CalculateEdgePosition
(
ImVec2 originalPos
,
ImVec2 screenSize
)
{
const
float
margin
=
10.0f
;
// Отступ от края
const
float
imageSize
=
32.0f
;
// Определяем, в каком направлении находится точка за пределами экрана
bool
left
=
originalPos
.
x

screenSize
.
x
;
bool
top
=
originalPos
.
y

screenSize
.
y
;
// Вычисляем позицию на краю экрана
float
x
=
originalPos
.
x
;
float
y
=
originalPos
.
y
;
if
(
left
)
x
=
margin
;
else
if
(
right
)
x
=
screenSize
.
x
-
margin
-
imageSize
;
else
x
=
std
::
clamp
(
x
,
margin
,
screenSize
.
x
-
margin
-
imageSize
)
;
if
(
top
)
y
=
margin
;
else
if
(
bottom
)
y
=
screenSize
.
y
-
margin
-
imageSize
;
else
y
=
std
::
clamp
(
y
,
margin
,
screenSize
.
y
-
margin
-
imageSize
)
;
return
ImVec2
(
x
,
y
)
;
}
void
СTooltipManager
::
RenderTooltip
(
)
{
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
auto
drawlist
=
ImGui
::
GetBackgroundDrawList
(
)
;
CVector targetPosition
{
2760.6069f
,
-
2420.8516f
,
21.7059f
}
;
CPlayerPed
*
pLocalPed
=
FindPlayerPed
(
-
1
)
;
CVector cameraPosition
=
pLocalPed
->
GetPosition
(
)
;
CVector cameraForward
=
pLocalPed
->
GetForward
(
)
;
float
fDistance
=
DistancePointToPoint
(
cameraPosition
,
targetPosition
)
;
CVector screenPosition
=
Utils
::
ConvertGameCoordsToScreen
(
targetPosition
)
;
ImVec2 screenSize
=
ImGui
::
GetIO
(
)
.
DisplaySize
;
ImVec2 pos
=
ImVec2
(
screenPosition
.
x
,
screenPosition
.
y
)
;
ImVec2 posForward
=
ImVec2
(
screenPosition
.
x
,
screenPosition
.
y
)
;
bool
isVisibleOnScreen
=
(
screenPosition
.
x
>=
0.0f
&&
screenPosition
.
x
=
0.0f
&&
screenPosition
.
y

AddText
(
textPos
,
IM_COL32
(
255
,
255
,
255
,
255
)
,
utf8
(
std
::
string
(
distanse
)
)
)
;
ImVec2 imagePos
=
ImVec2
(
pos
.
x
-
16.0f
,
pos
.
y
+
15.0f
)
;
drawlist
->
AddImage
(
(
void
*
)
iconToolTip
,
imagePos
,
ImVec2
(
imagePos
.
x
+
32.0f
,
imagePos
.
y
+
32.0f
)
)
;
std
::
string tet
=
"Добыча камня"
;
float
text2Width
=
ImGui
::
CalcTextSize
(
utf8
(
tet
)
)
.
x
;
ImVec2 text2Pos
=
ImVec2
(
pos
.
x
-
text2Width
*
0.5f
,
pos
.
y
+
32.0f
+
15.0f
)
;
drawlist
->
AddText
(
text2Pos
,
IM_COL32
(
255
,
255
,
255
,
255
)
,
utf8
(
tet
)
)
;
ImGui
::
PopFont
(
)
;
}
else
{
ImVec2 edgePos
=
CalculateEdgePosition
(
pos
,
screenSize
)
;
ImVec2 imageSize
=
ImVec2
(
32.0f
,
32.0f
)
;
drawlist
->
AddImage
(
(
void
*
)
iconToolTip
,
edgePos
,
ImVec2
(
edgePos
.
x
+
imageSize
.
x
,
edgePos
.
y
+
imageSize
.
y
)
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
}


Что-то типо такого в итоге, только просто иконкой в направлении к координатам

Изображение
 
Ответить с цитированием

  #2  
Старый 14.05.2025, 22:33
андрей чикатила
Познающий
Регистрация: 23.05.2024
Сообщений: 42
С нами: 1042221

Репутация: 8
По умолчанию

C++:





Код:
#include 
bool
IsPointInFrontOfCamera
(
const
CVector
&
cameraPos
,
const
CVector
&
cameraForward
,
const
CVector
&
targetPos
)
{
CVector directionToTarget
=
targetPos
-
cameraPos
;
directionToTarget
.
Normalize
(
)
;
return
(
cameraForward
.
x
*
directionToTarget
.
x
+
cameraForward
.
y
*
directionToTarget
.
y
+
cameraForward
.
z
*
directionToTarget
.
z
)
>
0.1f
;
}
ImVec2
CalculateEdgePosition
(
const
CVector
&
targetPos
,
const
CVector
&
cameraPos
,
const
CVector
&
cameraForward
,
ImVec2 screenSize
)
{
const
float
margin
=
10.0f
;
const
float
imageSize
=
32.0f
;
bool
isInFront
=
IsPointInFrontOfCamera
(
cameraPos
,
cameraForward
,
targetPos
)
;
CVector dirToTarget
=
targetPos
-
cameraPos
;
dirToTarget
.
Normalize
(
)
;
CVector2D
screenDir
(
dirToTarget
.
x
,
dirToTarget
.
y
)
;
float
aspectRatio
=
screenSize
.
x
/
screenSize
.
y
;
ImVec2
screenCenter
(
screenSize
.
x
*
0.5f
,
screenSize
.
y
*
0.5f
)
;
ImVec2 projectedPoint
=
ImVec2
(
screenCenter
.
x
+
screenDir
.
x
*
screenCenter
.
x
*
aspectRatio
,
screenCenter
.
y
-
screenDir
.
y
*
screenCenter
.
y
)
;
if
(
!
isInFront
)
{
projectedPoint
.
x
=
screenCenter
.
x
*
2
-
projectedPoint
.
x
;
projectedPoint
.
y
=
screenCenter
.
y
*
2
-
projectedPoint
.
y
;
}
float
x
=
std
::
clamp
(
projectedPoint
.
x
,
margin
,
screenSize
.
x
-
margin
-
imageSize
)
;
float
y
=
std
::
clamp
(
projectedPoint
.
y
,
margin
,
screenSize
.
y
-
margin
-
imageSize
)
;
if
(
!
isInFront
)
{
x
=
(
projectedPoint
.
x

GetPosition
(
)
;
CVector cameraForward
=
pLocalPed
->
GetForward
(
)
;
CVector screenPosition
=
Utils
::
ConvertGameCoordsToScreen
(
targetPosition
)
;
ImVec2 screenSize
=
ImGui
::
GetIO
(
)
.
DisplaySize
;
bool
isInFront
=
IsPointInFrontOfCamera
(
cameraPosition
,
cameraForward
,
targetPosition
)
;
bool
isVisibleOnScreen
=
isInFront
&&
(
screenPosition
.
x
>=
0
&&
screenPosition
.
x
=
0
&&
screenPosition
.
y

AddText
(
textPos
,
IM_COL32_WHITE
,
distanse
)
;
ImVec2
imagePos
(
screenPosition
.
x
-
16.0f
,
screenPosition
.
y
+
15.0f
)
;
drawlist
->
AddImage
(
(
void
*
)
iconToolTip
,
imagePos
,
ImVec2
(
imagePos
.
x
+
32.0f
,
imagePos
.
y
+
32.0f
)
)
;
const
char
*
text
=
"Добыча камня"
;
ImVec2 text2Pos
=
ImVec2
(
screenPosition
.
x
-
ImGui
::
CalcTextSize
(
text
)
.
x
*
0.5f
,
screenPosition
.
y
+
47.0f
)
;
drawlist
->
AddText
(
text2Pos
,
IM_COL32_WHITE
,
text
)
;
ImGui
::
PopFont
(
)
;
}
else
{
ImVec2 edgePos
=
CalculateEdgePosition
(
targetPosition
,
cameraPosition
,
cameraForward
,
screenSize
)
;
drawlist
->
AddImage
(
(
void
*
)
iconToolTip
,
edgePos
,
ImVec2
(
edgePos
.
x
+
32.0f
,
edgePos
.
y
+
32.0f
)
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
}


Попробуй так
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.