Показать сообщение отдельно
Старый 30.12.2012, 03:54   #199
Черный крыс
 
Сообщений: n/a
Ответ: Вопрос-Ответ (для новичков BlitzMax)

Для избежания подобной ситуации прибегают к разного рода ухищрениям, как то : высчитывать угол отражения и менять его в зависимости от того, как далеко мяч столкнулся от центра платформы - наверно замечал, что если мяч сталкивается с самым краем платформы, то угол отражения становится очень острым. Еще можно учитывать скорость и направление движения платформы в момент столкновения, они тоже влияют на угол отражения.

Друг, это все элементарно делается векторами. Пользуйся ->

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
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Nex (30.12.2012)