Для избежания подобной ситуации прибегают к разного рода ухищрениям, как то : высчитывать угол отражения и менять его в зависимости от того, как далеко мяч столкнулся от центра платформы - наверно замечал, что если мяч сталкивается с самым краем платформы, то угол отражения становится очень острым. Еще можно учитывать скорость и направление движения платформы в момент столкновения, они тоже влияют на угол отражения.
Друг, это все элементарно делается векторами. Пользуйся ->
Function Compare:Int(obj:Float2, withObj:Object)
Local vec:Float2 = Float2(withObj)
Local mv:Float = obj.x + obj.y
Local vv:Float = vec.x + vec.y
If mv < vv
Return -True
ElseIf mv > vv
Return True
Else
Return False
EndIf
End Function
Public
Function F2:Float2(x:Float = 0.0, y:Float = 0.0)
Return New Float2.Create(x, y)
End Function
Global NullFloat2:Float2 = New Float2.Create()
Private
Public
Rem'
bbdoc: Класс двухмерного вектора.
EndRem
Type Float2
Rem'
bbdoc: x - product.
EndRem
Field x:Float
Rem'
bbdoc: y - product.
EndRem
Field y:Float
Rem'
bbdoc: Получть угол наклона вектора.
returns: Угол наклона в градусах.
EndRem
Method Create:Float2(x:Float = 0.0, y:Float = 0.0)
Self.x = x
Self.y = y
Return Self
End Method
Rem'
bbdoc: Получть угол наклона вектора.
returns: Угол наклона в градусах.
EndRem
Method ForAngle:Float2(angle:Float)
x = Cos(angle)
y = Sin(angle)
Return Self
End Method
Method Delete() ' destructor
x = Null
y = Null
End Method
Rem'
bbdoc: Получть угол наклона вектора.
returns: Угол наклона в градусах.
EndRem
Method ToAngle:Float()
Return ATan2(y, x)
End Method
Rem'
bbdoc: Копировать вектор.
returns: Вектор.
EndRem
Method Copy:Float2()
Return New Float2.Create(x, y)
End Method
Rem'
bbdoc: Установить вектор.
returns: Ничего.
EndRem
Method Set(x:Float = 0.0, y:Float = 0.0)
Self.x = x
Self.y = y
End Method
Rem'
bbdoc: Перевернуть вектор.
returns: Вектор.
EndRem
Method Reverse:Float2()
Return New Float2.Create(- x, - y)
End Method
Rem'
bbdoc: Прибавить вектор.
returns: Вектор.
EndRem
Method Add:Float2(f2:Float2)
Return New Float2.Create(x + f2.x, y + f2.y)
End Method
Rem'
bbdoc: Отнять вектор.
returns: Вектор.
EndRem
Method Sub:Float2(f2:Float2)
Return New Float2.Create(x - f2.x, y - f2.y)
End Method
Rem'
bbdoc: Умножить вектор.
returns: Вектор.
EndRem
Method Mul:Float2(f2:Float2)
Return New Float2.Create(x * f2.x, y * f2.y)
End Method
Rem'
bbdoc: Умножить вектор.
returns: Вектор.
EndRem
Method Div:Float2(f2:Float2)
Return New Float2.Create(x / f2.x, y / f2.y)
End Method
Rem'
bbdoc: Умножить вектор.
returns: Вектор.
EndRem
Method AddS:Float2(s:Float)
Return New Float2.Create(x + s, y + s)
End Method
Rem'
bbdoc: Умножить вектор.
returns: Вектор.
EndRem
Method SubS:Float2(s:Float)
Return New Float2.Create(x - s, y - s)
End Method
Rem'
bbdoc: Умножить вектор.
returns: Вектор.
EndRem
Method MulS:Float2(s:Float)
Return New Float2.Create(x * s, y * s)
End Method
Rem'
bbdoc: Умножить вектор.
returns: Вектор.
EndRem
Method DivS:Float2(s:Float)
Return New Float2.Create(x / s, y / s)
End Method
Rem'
bbdoc: Умножить вектор.
returns: Вектор.
EndRem
Method AddTimeStep(f2:Float2, dt:Float)
x:+f2.x * dt
y:+f2.y * dt
End Method
Rem'
bbdoc: Точка векторов.
returns: Точку (Float).
EndRem
Method Dot:Float(f2:Float2)
Return x * f2.x + y * f2.y
End Method
Rem'
bbdoc: Пересечь вектора.
returns: Пересечение (Float).
EndRem
Method Cross:Float(f2:Float2)
Return x * f2.y - y * f2.x
End Method
Rem'
bbdoc: Левый перпендикуляр.
returns: Вектор.
EndRem
Method LPerp:Float2()
Return New Float2.Create(- y, x)
End Method
Rem'
bbdoc: Правый перпендикуляр.
returns: Вектор.
EndRem
Method RPerp:Float2()
Return New Float2.Create(y, - x)
End Method
Rem'
bbdoc: Спроецировать вектор.
returns: Вектор.
EndRem
Method Project:Float2(f2:Float2)
Return f2.MulS(Dot(f2) / f2.Dot(f2))
End Method
Rem'
bbdoc: Повернуть вектор.
returns: Вектор.
EndRem
Method Rotate:Float2(f2:Float2)
Return New Float2.Create(x * f2.x - y * f2.y, x * f2.y + y * f2.x)
End Method
Rem'
bbdoc: Повернуть вектор в обратную сторону.
returns: Вектор.
EndRem
Method UnRotate:Float2(f2:Float2)
Return New Float2.Create(x * f2.x + y * f2.y, y * f2.x - x * f2.y)
End Method
Rem'
bbdoc: Получть длинну вектора.
returns: Длинна вектора.
EndRem
Method Length:Float()
Return Sqr(Dot(Self))
End Method
Rem'
bbdoc: Получить квадрат длинны вектора.
returns: Квадрат длинны вектора.
EndRem
Method LengthSq:Float()
Return Dot(Self)
End Method
Rem'
bbdoc: Установить длинну вектора.
returns: Вектор.
EndRem
Method SetLength:Float2(ln:Float)
Local f2:Float2 = Normalize()
f2.x:*ln
f2.y:*ln
Return f2
End Method
Rem'
bbdoc: Нормализировать вектор.
returns: Вектор.
EndRem
Method Normalize:Float2()
Return MulS(1.0 / Length())
End Method
Method Compare:Int(withObject:Object)
Return.Compare(Self, withObject)
End Method
Method ToString:String()
Return "{x:" + String(x) + "}{y:" + String(y) + "}"
End Method
End Type