здравствуйте решил увеличить числа лимита с 100 до 1000, увеличивал в функции DrawHudNumber, но появилась проблема. Спрайты цифр рисуются некорректно. Как это исправить ?
илья2 ищи дефайн DHN_3DIGITS, вроде так называется. Добавь новый, например, DHN_4DIGITS. И под него впихни условия со сдвигом на один символ. Там не всё так просто, я сам пытался сделать 5 тысяч патронов для минигана, но цифры съехали, не было видно иконки патронов. Разбираться не стал, потому что делал просто по фану.
KorteZZ в реальности никто не носит миниган на руках. Его устанавливают на станок. При такой скорострельности отдача огромная. И вес самого оружия с боезапасом пехотинцу не поднять. Мода на многоствольные пулемёты в массовой культуре началась, наверное, с фильма "Хищник". "Терминатор 2" моду закрепил.
В игре можно повысить скорострельность, представляешь, сколько патронов нужно будет рисовать в худе? Десятки тысяч. Будет имба, которая косит противника за секунды. Очень интересно эта проблема решена в TFC. Вроде бы пулемёт, вроде бы мощная штука. Но, в отличие от настоящего минигана, стреляет не в линию, а с разбросом по типу дробовика. При медленном расходе патронов сделано много попаданий. И баланс не страдает, и сетевой трафик экономится.
Добавлено 08-02-2022 в 16:24:
Так. Откопал старые сорцы и разобрался с рисованием цифр патронов. Объяснять, как увеличить передаваемое на клиент число, я не буду. В четырёх мессагах поменять BYTE на SHORT и сменить числа-ограничители с 254 и 255 на сколько там влазиет в шорт, вроде от -32768 до +32768, если он знаковый. А вот клиентский код приложу:
C++ Source Code:
#define DHN_4DIGITS 8
Новый флаг в hud.h.
C++ Source Code:
if (pw->iClip >= 0)
{
// room for the number and the '|' and the current ammo
x = ScreenWidth - (10 * AmmoWidth) - iIconWidth;
Важно заменить 8 на 10 в строке, определяющей x. По-умолчанию, отступ от правого края экрана равен ширине иконки патронов + ширине восьми цифр. По три цифры для магазина и запасных патронов, одна цифра для вертикального разделителя, и одна цифра для отступов. Так как показания у нас будут четырёхзначные, нужно добавить две цифры.
C++ Source Code:
x = gHUD.DrawHudNumber(x, y, iFlags | DHN_4DIGITS, pw->iClip, r, g, b);
Все вызовы DrawHudNumber в ammo.cpp нужно подкорректировать, и заменить DHN_3DIGITS на DHN_4DIGITS.
C++ Source Code:
1
int CHud :: DrawHudNumber( int x, int y, int iFlags, int iNumber, int r, int g, int b)
2
{
3
int iWidth = GetSpriteRect(m_HUD_number_0).right - GetSpriteRect(m_HUD_number_0).left;
4
int k;
5
6
if (iNumber > 0)
7
{
8
// SPR_Draw 1000's
9
if (iNumber >= 1000)
10
{
11
k = iNumber / 1000;
12
SPR_Set(GetSprite(m_HUD_number_0 + k), r, g, b);
13
SPR_DrawAdditive(0, x, y, &GetSpriteRect(m_HUD_number_0 + k));
14
x += iWidth;
15
}
16
elseif (iFlags & (DHN_4DIGITS))
17
{
18
//SPR_DrawAdditive( 0, x, y, &rc );
19
x += iWidth;
20
}
21
22
// SPR_Draw 100's
23
if (iNumber >= 100)
24
{
25
k = (iNumber % 1000) / 100;
26
SPR_Set(GetSprite(m_HUD_number_0 + k), r, g, b );
27
SPR_DrawAdditive( 0, x, y, &GetSpriteRect(m_HUD_number_0 + k));
28
x += iWidth;
29
}
30
elseif (iFlags & (DHN_4DIGITS | DHN_3DIGITS))
31
{
32
//SPR_DrawAdditive( 0, x, y, &rc );
33
x += iWidth;
34
}
35
36
// SPR_Draw 10's
37
if (iNumber >= 10)
38
{
39
k = (iNumber % 100)/10;
40
SPR_Set(GetSprite(m_HUD_number_0 + k), r, g, b );
41
SPR_DrawAdditive( 0, x, y, &GetSpriteRect(m_HUD_number_0 + k));