Если вам нужна функция, позволяющая создать круговой круг, заполненный круговой диаграммой, указав параметр ang
, лучше всего делать ставку surface.DrawPoly( table vertices )
. Вы должны иметь возможность использовать его следующим образом:
function draw.FilledCircle(x, y, r, ang, color) --x, y being center of the circle, r being radius
local verts = {{x = x, y = y}} --add center point
for i = 0, ang do
local xx = x + math.cos(math.rad(i)) * r
local yy = y - math.sin(math.rad(i)) * r
table.insert(verts, {x = xx, y = yy})
end
--the resulting table is a list of counter-clockwise vertices
--surface.DrawPoly() needs clockwise list
verts = table.Reverse(verts) --should do the job
surface.SetDrawColor(color or color_white)
draw.NoTexture()
surface.DrawPoly(verts)
end
Я поставил surface.SetDrawColor()
перед draw.NoTexture()
, как этот пример предлагает это.
Возможно, вы захотитевместо этого используйте for i = 0, ang, angleStep do
, чтобы уменьшить количество вершин, тем самым уменьшая нагрузку на оборудование, однако это жизнеспособно только для маленьких кругов (как в вашем примере), поэтому шаг по углу должен быть некоторой функцией радиуса, чтобы учитывать каждую ситуацию. Кроме того, необходимо выполнить дополнительные вычисления для учета углов, которые не делятся на шаг по углу с остатком от нуля.
--after the for loop
if ang % angleStep then
local xx = x + math.cos(math.rad(ang)) * r
local yy = y - math.sin(math.rad(ang)) * r
table.insert(verts, {x = xx, y = yy})
end
Что касается текстурирования, это будет сильно отличаться от прямоугольника, если ваша текстураничего кроме сплошного цвета, но быстрый взгляд на библиотеку не выявил лучшего способа достичь этого.