Energy Reload
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
C++:
void HealthArmBox(IActor*Player, IEntity* pEnt, float HP, float Ar)
{
DWORD color=GREEN;
Vec3 ScreenPos1, ScreenPos2;
//Выходим на класс костей
ICharacterInstance* GetCharacter = pEnt->GetCharacter(0);
if (!GetCharacter)return;
ISkeletonPose* m_pSkeleton = GetCharacter->GetISkeletonPose();
if (!m_pSkeleton)return;
//Получаем матрицу кости, головы
Matrix34 Head = pEnt->GetProjectedWorldBBox()*Matrix34(m_pSkeleton->GetAbsJointByID(m_pSkeleton->GetJointIDByName("Bip01 Head")));
//Получаем позицию игрока
Vec3 Ground = позиция игрока
//Проверяем на валидность позиции
if (Head.GetTranslation() == Vec3{ZERO}) return;
if (Ground == Vec3{ ZERO }) return;
//Определяем цвет согласно значению жизней
if (HP < 60)color = YELLOW(150);
if (HP < 30) color = RED(150);
//Переводим 3Д координаты головы в 2Д координаты
if (WorldToScreen(Head.GetTranslation(), ScreenPos2))
{
//Переводим 3Д координаты позиции в 2Д координаты
WorldToScreen(Ground, ScreenPos1);//ноги
//Вычесляем расстояние между 2Д координатами
float w = (ScreenPos1.y - ScreenPos2.y) / 4;
//Вычесляем расстояние между 2Д координатами в соответствии жизней
int hw = (int)(((ScreenPos1.y - ScreenPos2.y)*(HP)) / -100);
//Вычесляем расстояние между 2Д координатами в соответствии брони
int arrmory = (int)(((ScreenPos1.y - ScreenPos2.y)*(Ar)) / -100);
//рисуем жизни
pRender->GradientBox(ScreenPos1.x + w, ScreenPos1.y, 4, hw, RED, color, vertical);//градиент жизней
pRender->Border(Vec2(ScreenPos1.x + w, ScreenPos1.y), 4, hw, 1, BLACK);//рамка градиента
//рисуем броню
pRender->GradientBox(ScreenPos1.x + w + 5, ScreenPos1.y, 4, arrmory, ORANGE, ORANGE, vertical);//градиент брони
pRender->Border(Vec2(ScreenPos1.x + w + 5, ScreenPos1.y), 4, arrmory, 1, BLACK);//градиент рамки
}
}
vertical - говорит о том, что он вертикальный.
Вот что имеем:
Взято из основ одного хорошего человека.
Последнее редактирование: