Jump to content

Не корректно отображается DxImage


Recommended Posts

Добрый день, уважаемые форумчане. Вот делал свой HUD и столкнулся с некоторым неудобством. Ниже код который писал изначально, думаю Вы легко поймете что он делает.

if armor >= 100 then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/100.png") 
elseif armor > 89 and armor < 100  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/90.png") 
elseif armor > 79 and armor < 90  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/80.png") 
elseif armor > 69 and armor < 80  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/70.png") 
elseif armor > 59 and armor < 70  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/60.png") 
elseif armor > 49 and armor < 60  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/50.png") 
elseif armor > 39 and armor < 50  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/40.png") 
elseif armor > 29 and armor < 40  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/30.png") 
elseif armor > 19 and armor < 30  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/20.png") 
elseif armor > 9 and armor < 20  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/10.png") 
elseif armor < 10  then 
    dxDrawImage(sWidth*0.88,55,50,50,"armor/0.png") 
end 

Думаю все понимают, что это слишком большой код для данной ситуации, особенно если учесть, что таких еще 2(HP,oxygen), то это просто извращение. Поэтому я сократил его до такого:

dxDrawImage(sWidth*0.88,55,50,50,"armor/"..(math.floor(armor/10)*10)..".png") 

По сути он должен делать тоже самое, что и выше, но тут возникла небольшая проблема. Когда уровень брони равен 100, картинка отображается корректная (100.png), если броня равно от 91 до 99, то тоже все верно (90.png), но если броня равна 90, то картинка отображается не корректно, вместо 90.png отображается 80.png, хотя судя по расчету все должно быть правильно:

armor=100 
a = (math.floor(armor/10)*10) 
print (a) --выведет 100 

armor=99 -- (или же armor=91) 
a = (math.floor(armor/10)*10) 
print (a) --выведет 90 

armor=90 
a = (math.floor(armor/10)*10) 
print (a) --выведет 90 

Т.е. при условии, что броня равна 90, должна отображаться картинка 90.png, но этого не происходит.

Пробовал использовать и другие варианты. Например, (string.format('%.0f',(armor/10))*10) и (math.ceil(armor/10)*10), но это не помогло, либо я получал неверный номер картинки, либо работало так, как выше с math.floor и даже было такое, что при 94 показывалась картинка 90.png, а при 95 - 100.png.

Собственно это не так критично,погрешность всего в единицу, но меня всю ночь мучал вопрос, что не так в расчетах или же почему она отображается не так, как должна, захотелось разобраться. И так происходит с каждым десятком, кроме 100, тут все правильно отображается.

Жду ваших предложений и критики :)

p.s. Прощу прощения если в посте много лишнего, но постарался доступно объяснить проблему :) .

Edited by Guest
Link to comment

math.floor - это округление вниз, math.ceil - округление вверх. Попробуйте с math.ceil. Броня - это реальное число и возвращать оно вместо ровно 90 может 89.9554332, и тогда это число округлится вниз и покажет неверную для вас картинку.

Link to comment
math.floor - это округление вниз, math.ceil - округление вверх. Попробуйте с math.ceil. Броня - это реальное число и возвращать оно вместо ровно 90 может 89.9554332, и тогда это число округлится вниз и покажет неверную для вас картинку.

Как я уже писал выше это не помогает.

armor = 90 
print ((math.ceil(armor/10))*10) --выведет 90 

armor = 91 
print ((math.ceil(armor/10))*10) --выведет 100 

таким образом в пределах от 91 до 100 включительно будет отображаться "armor/100.png", а эта картинка должна только при 100 и выше, но не в пределах 90 - 99.

Link to comment
math.floor - это округление вниз, math.ceil - округление вверх. Попробуйте с math.ceil. Броня - это реальное число и возвращать оно вместо ровно 90 может 89.9554332, и тогда это число округлится вниз и покажет неверную для вас картинку.

Полностью подписываюсь под словами, тоже долго не мог понять почему не округляет вниз уровень ХП у игрока. С хп для машины же все нормально

Link to comment

Ну как бы я ранее замечал, что getPedArmor даёт не верный результат, но закономерность не нашел.

ТС: Для дебага выводи в рендер результат getPedArmor для сравнения, возможно проблема кроется в самой функции.

dxDrawText( (string)(getPedArmor( Ped )), ... );  

Link to comment
Ну как бы я ранее замечал, что getPedArmor даёт не верный результат, но закономерность не нашел.

ТС: Для дебага выводи в рендер результат getPedArmor для сравнения, возможно проблема кроется в самой функции.

dxDrawText( (string)(getPedArmor( Ped )), ... );  

Я немного видел, в каком стиле ты пишешь код, в нашем случае string таблица, а не функция, поэтому:

dxDrawText( tostring( getPedArmor( Ped ) ), x, y, w, h, ... );  

Link to comment
Ну как бы я ранее замечал, что getPedArmor даёт не верный результат, но закономерность не нашел.

ТС: Для дебага выводи в рендер результат getPedArmor для сравнения, возможно проблема кроется в самой функции.

dxDrawText( (string)(getPedArmor( Ped )), ... );  

Я немного видел, в каком стиле ты пишешь код, в нашем случае string таблица, а не функция, поэтому:

dxDrawText( tostring( getPedArmor( Ped ) ), x, y, w, h, ... );  

Извиняюсь, машинально

P.S. Где видел?

Link to comment

getPedOxygenLevel тоже показывает странные результаты, когда игрок не зашел под своим аккаунтом, кислород равен 1150, когда он в воде, то значение скачет между 1000 и 1001, в остальное время равно 1000, это при условии, что не изменен stat 28 и еще какой-то, каждый из которых повышают уровень на 1500.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...