2Randomize
Прежде чем, делать свои заключения - ты сначала в код вникни, а потом только высказывай свое фи.
1) Он и не будет работать, я же по русски написал что нужен тип вектора Float2, который содержит x и y - компоненты. Нормальный кодер опишет этот вектор без особых затруднений.
2) Насчет быстродействия, если тебе интересно - то проверь. В твоей функции происходит 8 (восемь!) вызовов функции DrawOval(), а затем погляди на исходник этой функции... сразу скажу моя функция минимум раз в 4-6 будет работать быстрее.
3) Насчет названия - это уже дело вкуса. Но позволю защитить свое название...
название функции - полностью соответсвует мышлению программиста.
DrawRectRound()
[Draw] - отрисовать, [Rect] - Прямоугольник, [Round] - скругленный.
Другими словами я название функции делю на 3 части : [Операция][Основное название функции][Модификатор функции]
Кто со мной не согласен - те пусть пишут всякие басни в названиях функций.
Не могу отказаться от соблазна покритиковать вышеописанный код :
1) GetClsColor() - заЧем ?
2) Любые операции с вьюпортами нежелательны, ибо не на всех видяхах работает.
3) Золотое правило : в любых функциях отрисовки чего-либо никогда нельзя менять аттрибуты отрисовки. Вы поглядите на официальные функции - там из атрибутов ничего не трогается. А если уж нужда заставляет менять то при завершении работы функции их всегда надо возвращать в исходное состояние (тоесть на момент, когда функция была вызвана).
ЗЫ Для особо одаренных, ниже привожу полностью рабочий код :
SuperStrict
Function DrawRectRound(x:Float, y:Float, w:Float, h:Float, radius:Float = 40.0, corner:Int = -1)
radius = Abs(radius)
Select Sgn(corner)
Case - 1 corner = Int(radius / 10.0) + 1
Case 1 corner = Abs(corner)
Case 0
DrawRect(x, y, w, h)
Return
End Select
DrawRect(x + radius, y, w - (radius * 2.0), h)
DrawRect(x, y + radius, radius, h - (radius * 2.0))
DrawRect(x + w - radius, y + radius, radius, h - (radius * 2.0))
Local v1:Float2 = Null
Local v2:Float2 = Null
Local i:Int
Local inc:Float = 90.0 / corner
For i = 0 To corner
Local ang:Float = 0.0 + (inc * i)
v2 = New Float2.ForAngle(ang)
v2 = v2.MulS(radius)
If v1
DrawPoly([x + w - radius, y + h - radius, v1.x + x + w - radius, v1.y + y + h - radius, v2.x + x + w - radius, v2.y + y + h - radius])
End If
v1 = v2
v2 = Null
Next
v1 = Null
v2 = Null
For i = 0 To corner
Local ang2:Float = 90.0 + (inc * i)
v2 = New Float2.ForAngle(ang2)
v2 = v2.MulS(radius)
If v1
DrawPoly([x + radius, y + h - radius, v1.x + x + radius, v1.y + y + h - radius, v2.x + x + radius, v2.y + y + h - radius])
End If
v1 = v2
v2 = Null
Next
v1 = Null
v2 = Null
For i = 0 To corner
Local ang3:Float = 180.0 + (inc * i)
v2 = New Float2.ForAngle(ang3)
v2 = v2.MulS(radius)
If v1
DrawPoly([x + radius, y + radius, v1.x + x + radius, v1.y + y + radius, v2.x + x + radius, v2.y + y + radius])
End If
v1 = v2
v2 = Null
Next
v1 = Null
v2 = Null
For i = 0 To corner
Local ang4:Float = 270.0 + (inc * i)
v2 = New Float2.ForAngle(ang4)
v2 = v2.MulS(radius)
If v1
DrawLine(v1.x + x + w - radius, v1.y + y + radius, v2.x + x + w - radius, v2.y + y + radius)
DrawPoly([x + w - radius, y + radius, v1.x + x + w - radius, v1.y + y + radius, v2.x + x + w - radius, v2.y + y + radius])
End If
v1 = v2
v2 = Null
Next
Type Float2
Field x:Float
Field y:Float
Method Delete()
x = Null
y = Null
End Method
Method Create:Float2(x:Float = 0.0, y:Float = 0.0)
MemCopy(Varptr Self.x, [x, y], 8)
Return Self
End Method
Method ForAngle:Float2(ang:Float)
MemCopy(Varptr x, [Float(Cos(ang)), Float(Sin(ang))], 8)
Return Self
End Method
Method MulS:Float2(s:Float)
Return Create(x * s, y * s)
End Method
End Type
End Function
SetGraphicsDriver(GLMax2DDriver())
Graphics(1024, 768)
SetTransform()
SetBlend(ALPHABLEND)
SetAlpha(1.0)
SetColor(255, 255, 255)
SetLineWidth(1.0)
Local r:Float = 40.0, k:Float = 0.3
While Not KeyHit(KEY_ESCAPE)
Cls
r:+k
If r > 80.0 Then k = -0.3
If r < 0 Then k = 0.3
DrawRectRound(MouseX(), MouseY(), 300.0, 200.0, r, 5)
Flip()
Wend
End