Исходник Animated health bar

push me to the edge
Олдфаг
Статус
Оффлайн
Регистрация
22 Мар 2017
Сообщения
2,253
Реакции[?]
1,204
Поинты[?]
1K
Ну решил я значит запилить себе рич хп бар, делюсь кодом
C++:
constexpr float SPEED_FREQ = 255 / 1.0f;

void CEsp::DrawHealthBar( C_CSPlayer* player, Rect2D bbox ) {
   Color col_black = Color ( 0, 0, 0, static_cast< int > ( m_flAlpha[ player->entindex( ) ] ) );
   int player_hp = player->m_iHealth( );
   int player_hp_max = 100;

   static float prev_player_hp[ 65 ];

   if ( prev_player_hp[ player->entindex( ) ] > player_hp )
      prev_player_hp[ player->entindex( ) ] -= SPEED_FREQ * Source::m_pGlobalVars->frametime;
   else
      prev_player_hp[ player->entindex( ) ] = player_hp;

   float x = bbox.left - 10, float y = bbox.top, width = fabsf( bbox.bottom - bbox.top ) - ( ( ( fabsf( bbox.bottom - bbox.top ) * prev_player_hp[ player->entindex( ) ] ) / player_hp_max ) );
   float w = 4, h = fabsf( bbox.bottom - bbox.top );

   Color fill = Color ( static_cast< int > ( ( 130.0f - player_hp * 1.3f ) ), static_cast< int > ( ( player_hp * 2.55f ) ), 10, static_cast< int > ( ( m_flAlpha[ player->entindex( ) ] ) ) );
   Color color = Color ( 255, 255, 255, static_cast< int > ( ( m_flAlpha[ player->entindex( ) ] * 0.85f ) ) );

   Render::Get( )->SetTextFont( FONT_VISITOR );
   Render::Get( )->AddRectFilled( Vector2D( x + 3, y - 1 ), Vector2D( x + w + 3, y + h + 1 ), Color ( 0.0f, 0.0f, 0.0f, m_flAlpha[ player->entindex( ) ] / 357.0f ) );
   Render::Get( )->AddRectFilled( Vector2D( x + 4, y + width ), Vector2D( x + w - 1 + 3, y + h ), fill );

   if ( player_hp != 100 ) 
      Render::Get( )->AddText( Vector2D( x + 3, y + width + 1 ), color, OUTLINED | CENTER_X | CENTER_Y, "%d", player_hp );
}
EDIT: Отрефакторил
Демонстрация работы
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
КРЯКАЕМ ВАНТАПС pphud'om
Забаненный
Статус
Оффлайн
Регистрация
5 Мар 2019
Сообщения
285
Реакции[?]
34
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ne nu spasibo opyat za dump ftality
 
stay fatal
Забаненный
Статус
Оффлайн
Регистрация
7 Сен 2017
Сообщения
332
Реакции[?]
48
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Годнотаааа
 
Участник
Статус
Оффлайн
Регистрация
4 Авг 2017
Сообщения
463
Реакции[?]
212
Поинты[?]
0
Рефакторинг? Не, не слышал.
Вот так лучше наверное (хотя тоже так себе):
C++:
void CEsp::DrawHealthBar(C_CSPlayer* player, Rect2D bbox)
{
   int player_index = player->entindex();
   int player_hp = player->m_iHealth( );
   int player_hp_max = 100;

   static float prev_player_hp[65];
   constexpr float SPEED_FREQ = 255 / 1.0f;
   
   Color col_black = Color(0, 0, 0, static_cast<int>(m_flAlpha[player_index]));
   Color fill = Color(static_cast<int>((130.0f - player_hp * 1.3f)), static_cast<int>((player_hp * 2.55f)), 10, static_cast<int>((m_flAlpha[player_index])));
   Color color = Color(255, 255, 255, static_cast<int>((m_flAlpha[player_index] * 0.85f)));
 
   if (prev_player_hp[player_index] > player_hp)
   {
      prev_player_hp[player_index] -= SPEED_FREQ * Source::m_pGlobalVars->frametime;
   }
   else
   {
      prev_player_hp[player_index] = player_hp;
   }
     
   float width;

   float x = bbox.left - 10;
   float y = bbox.top;
   float bboxDifferent = fabsf(bbox.bottom - bbox.top);
   width = bboxDifferent - (((bboxDifferent * prev_player_hp[player_index] ) / player_hp_max));

   float w = 4;
   float h = bboxDifferent;

   Render::Get()->SetTextFont(FONT_VISITOR);
   Render::Get()->AddRectFilled(Vector2D(x + 3, y - 1), Vector2D(x + w + 3, y + h + 1), Color(0.0f, 0.0f, 0.0f, m_flAlpha[player_index] / 357.0f));
   Render::Get()->AddRectFilled(Vector2D(x + 4, y + width), Vector2D(x + w - 1 + 3, y + h), fill);
 
   if ( player_hp != 100 )
   {
      Render::Get()->AddText(
          Vector2D(x + 3, y + width + 1),
          color,
          OUTLINED | CENTER_X | CENTER_Y,
          "%d",
          player_hp);
   }
}
По-хорошему, надо разбить эту функцию, а также избавиться от магических чисел, но так как общей картины кода я не имею, сделать это правильно я не могу.
 
push me to the edge
Олдфаг
Статус
Оффлайн
Регистрация
22 Мар 2017
Сообщения
2,253
Реакции[?]
1,204
Поинты[?]
1K
Рефакторинг? Не, не слышал.
Вот так лучше наверное (хотя тоже так себе):
C++:
void CEsp::DrawHealthBar(C_CSPlayer* player, Rect2D bbox)
{
   int player_index = player->entindex();
   int player_hp = player->m_iHealth( );
   int player_hp_max = 100;

   static float prev_player_hp[65];
   constexpr float SPEED_FREQ = 255 / 1.0f;
 
   Color col_black = Color(0, 0, 0, static_cast<int>(m_flAlpha[player_index]));
   Color fill = Color(static_cast<int>((130.0f - player_hp * 1.3f)), static_cast<int>((player_hp * 2.55f)), 10, static_cast<int>((m_flAlpha[player_index])));
   Color color = Color(255, 255, 255, static_cast<int>((m_flAlpha[player_index] * 0.85f)));

   if (prev_player_hp[player_index] > player_hp)
   {
      prev_player_hp[player_index] -= SPEED_FREQ * Source::m_pGlobalVars->frametime;
   }
   else
   {
      prev_player_hp[player_index] = player_hp;
   }
   
   float width;

   float x = bbox.left - 10;
   float y = bbox.top;
   float bboxDifferent = fabsf(bbox.bottom - bbox.top);
   width = bboxDifferent - (((bboxDifferent * prev_player_hp[player_index] ) / player_hp_max));

   float w = 4;
   float h = bboxDifferent;

   Render::Get()->SetTextFont(FONT_VISITOR);
   Render::Get()->AddRectFilled(Vector2D(x + 3, y - 1), Vector2D(x + w + 3, y + h + 1), Color(0.0f, 0.0f, 0.0f, m_flAlpha[player_index] / 357.0f));
   Render::Get()->AddRectFilled(Vector2D(x + 4, y + width), Vector2D(x + w - 1 + 3, y + h), fill);

   if ( player_hp != 100 )
   {
      Render::Get()->AddText(
          Vector2D(x + 3, y + width + 1),
          color,
          OUTLINED | CENTER_X | CENTER_Y,
          "%d",
          player_hp);
   }
}
По-хорошему, надо разбить эту функцию, а также избавиться от магических чисел, но так как общей картины кода я не имею, сделать это правильно я не могу.
Индивидуальный код стайл? Не не слышал...
Ты вообще знаешь значение слова рефакторинг? Я вам выкладываю реализацию а не обучение по код стайлу
Если бы я написал все в ловер кейсе ты бы наверное сказал, что это не согласовано, только вот в 2к19 году существует вагон и маленькая тележка различных код стайлов. Если вы думаешь, что нужно юзать сторого 1 то мне не о чём с тобой разговаривать впринципе
 
Участник
Статус
Оффлайн
Регистрация
4 Авг 2017
Сообщения
463
Реакции[?]
212
Поинты[?]
0
Индивидуальный код стайл? Не не слышал...
Ты вообще знаешь значение слова рефакторинг? Я вам выкладываю реализацию а не обучение по код стайлу
Если бы я написал все в ловер кейсе ты бы наверное сказал, что это не согласовано, только вот в 2к19 году существует вагон и маленькая тележка различных код стайлов. Если вы думаешь, что нужно юзать сторого 1 то мне не о чём с тобой разговаривать впринципе
Я про код стайл вообще ничего не говорил. Глаза протри, и ещё раз сравни мой и твой вариант. У тебя дохуя дублирования кода, функция огромная, куча магических чисел - это ты называешь так код стайл? Это называется говнокод.
 
Пользователь
Статус
Оффлайн
Регистрация
7 Апр 2016
Сообщения
335
Реакции[?]
96
Поинты[?]
1K
Я про код стайл вообще ничего не говорил. Глаза протри, и ещё раз сравни мой и твой вариант. У тебя дохуя дублирования кода, функция огромная, куча магических чисел - это ты называешь так код стайл?
Да, ты прав. В некоторых местах, код выглядит вырвиглазно
 
push me to the edge
Олдфаг
Статус
Оффлайн
Регистрация
22 Мар 2017
Сообщения
2,253
Реакции[?]
1,204
Поинты[?]
1K
Я про код стайл вообще ничего не говорил. Глаза протри, и ещё раз сравни мой и твой вариант. У тебя дохуя дублирования кода, функция огромная, куча магических чисел - это ты называешь так код стайл? Это называется говнокод.
Ты отредачил его, и после этого код стайл уже поменялся, если ты не понимаешь о чём я то вот тебе пример
Мое условие
C++:
if ( true ) {
    
}
Твоё условие
C++:
if (true)
{
    
}
И так с любыми другими аспектами
Я привел пример того как можно сделать анимацию, вы меня судите за то что у меня в отрисовке магические числа. Это так же умно как например говорить что вместо animation fix правильно говорить animation update и т.п
 
Пользователь
Статус
Оффлайн
Регистрация
7 Апр 2016
Сообщения
335
Реакции[?]
96
Поинты[?]
1K
Ты отредачил его, и после этого код стайл уже поменялся, если ты не понимаешь о чём я то вот тебе пример
Мое условие
C++:
if ( true ) {
  
}
Твоё условие
C++:
if (true)
{
  
}
И так с любыми другими аспектами
Я привел пример того как можно сделать анимацию, вы меня судите за то что у меня в отрисовке магические числа. Это так же умно как например говорить что вместо animation fix правильно говорить animation update и т.п

В некоторых местах, ты действительно делаешь лишние мувы
 
Пользователь
Статус
Оффлайн
Регистрация
7 Апр 2016
Сообщения
335
Реакции[?]
96
Поинты[?]
1K
push me to the edge
Олдфаг
Статус
Оффлайн
Регистрация
22 Мар 2017
Сообщения
2,253
Реакции[?]
1,204
Поинты[?]
1K
Уже лучше, но я бы еще вынес вот это в самый верх
Код:
static float prev_player_hp[ 65 ];
А это вообще за пределы функции
Код:
constexpr float SPEED_FREQ = 255 / 1.0f;
Можно конечно, но я бы не засорял глобальное пространство перемеными которые используются только в 1 функции
 
Пользователь
Статус
Оффлайн
Регистрация
7 Апр 2016
Сообщения
335
Реакции[?]
96
Поинты[?]
1K
Можно конечно, но я бы не засорял глобальное пространство перемеными которые используются только в 1 функции
Ну в теории это можно использовать и в других функциях, поэтому я подумал, что стоит вынести отдельно.
 
push me to the edge
Олдфаг
Статус
Оффлайн
Регистрация
22 Мар 2017
Сообщения
2,253
Реакции[?]
1,204
Поинты[?]
1K
Ну в теории это можно использовать и в других функциях, поэтому я подумал, что стоит вынести отдельно.
Ну пожалуй соглашусь на счёт SPEED_FREQ, его так же можно заюзать например в армор баре
 
Сверху Снизу