Модератор: Mikle
longwair писал(а):акер, А как надо делать? Может я просто выразился не правильно. Короче нужно стрелочку заставить двигаться по вектору к точке X2Y2, и повернуть её соответственно к этой точке.
longwair писал(а):Ну если не прав я, то подскажи как надо.
longwair писал(а):Ведь так люди и учатся.
STPos.x=STPos.x-sin(angle)
STPos.y=STPos.y+cos(angle)
в рендере
DrawGameOBJ Strelka, STPos.X, STPos.Y, 0
DODge писал(а):С ориентированием поворота ракеты проблем нет, использую Atan2 для избежания проблем с нулем. Но как сделать плавный поворот?
DODge писал(а):С ориентированием поворота ракеты проблем нет, использую Atan2 для избежания проблем с нулем.
Dim Направление As Vector3 = Vector3.Normalize(Объект.Позиция - Ракета.Позиция)
Хакер писал(а):Дался вам этот Atan. Можно из направляющего вектора сразу получать матрицу вращения.
Mikle писал(а):В общем согласен. Но для того, чтобы задавать равномерное по скорости вращение, или, к примеру, сделать вращение с инерцией, бывает удобно оперировать непосредственно значением угла.
Хакер писал(а):есть ракета должна не тупо менять своё направление, а должно просчитываться физическое воздействие разных сил на ракету
longwair писал(а): как же всё таки из направляющего вектора получить матрицу вращения?
Для этого есть готовая D3DXMatrixLookAtLH().
longwair писал(а):есть ли такое же но для стрелочки, как в теме выше?
Тангенс искомого угла - это отношение (x2-x1)/(y2-y1).
Соответственно тебе нужен арктангенс этой величины, но при y2-y1=0 получишь исключение деления на 0, эти случаи нужно обрабатывать отдельно.
Public Sub UpdateDirection()
Dim D As Single 'Будущий угол в градусах относительно оси для выбора направления
If Engine.mouseX <> MainChar.X And Engine.mouseY <> MainChar.Y Then
If Engine.mouseX - MainChar.X < 0 And Engine.mouseY - MainChar.Y < 0 Then CurrentQuadrant = TopLeft
If Engine.mouseX - MainChar.X > 0 And Engine.mouseY - MainChar.Y < 0 Then CurrentQuadrant = TopRight
If Engine.mouseX - MainChar.X < 0 And Engine.mouseY - MainChar.Y > 0 Then CurrentQuadrant = BottomLeft
If Engine.mouseX - MainChar.X > 0 And Engine.mouseY - MainChar.Y > 0 Then CurrentQuadrant = BottomRight
'Тут выбрали вадрат, где в данный момент курсор относительно спрайта
End If
If Engine.mouseX - MainChar.X <> 0 And Engine.mouseY - MainChar.Y <> 0 Then
Let D = Abs(Rad2Deg(Atn((Engine.mouseX - MainChar.X) / (Engine.mouseY - MainChar.Y))))
'А вот и заветный угол
End If
Select Case CurrentQuadrant
'Тут определяем направление по углу, то-есть в какой примерно сектор выбранного квадрата смотрит вектор,
'проведенный от спрайта к курсору, вроде по коду будет понятно
Case MouseQuadrant.TopLeft
If D < 25 Then CurrentDirection = North
If D >= 25 And D <= 70 Then CurrentDirection = North_West
If D > 70 Then CurrentDirection = West
Case MouseQuadrant.TopRight
If D < 25 Then CurrentDirection = North
If D >= 25 And D <= 70 Then CurrentDirection = North_East
If D > 70 Then CurrentDirection = East
Case MouseQuadrant.BottomRight
If D < 25 Then CurrentDirection = Sud
If D >= 25 And D <= 70 Then CurrentDirection = Sud_East
If D > 70 Then CurrentDirection = East
Case MouseQuadrant.BottomLeft
If D < 25 Then CurrentDirection = Sud
If D >= 25 And D <= 70 Then CurrentDirection = Sud_West
If D > 70 Then CurrentDirection = West
End Select
End Sub
Сейчас этот форум просматривают: Google-бот и гости: 10