Нужно сделать передвижение машины, а конкретно чтоб машина постепенно останавливалась если не нажата стрелка вверх. Сейчас у меня только одна переменая для скорости. Когда машина врезается, то скорость становится отрицательной и машина едит назад. И скорость не снижается. Пробовал делать иф стейтменты, если клавиша не нажата то скорость 0, или пробовал если клавиша не нажата то скорость постепенно уменьшается от текущей. Как это сдялать, подскажите. использую c++ и opengl.
в каждом цикле умножай скорость на определенный коэффициент трения, ну вроде friction = .98f speed *= friction А вообще у юзера GECK был великолепный пример физики авто, стукни ему в личку. Never compromise. Not even in the face of Armageddon.
Сообщение отредактировал Rorschach - Пятница, 02 Марта 2012, 22:56
clidi, вот простой пример автофизики на Visual Basic 6 с исходником: ss2d Управление: a, z - сменить передачу стрелка вверх - газ стрелка вниз - тормоз Вот, если надо, в 3D: ss3d но этот не запустится в Win Vista и новее, или нужно добавить и зарегистрировать dx8vb.dll.
Сообщение отредактировал -Mikle- - Вторник, 06 Марта 2012, 14:54
Rorschach, Спасибо, пока оставил как ты сказал, с friction.
-Mikle-, Спасибо за пример кода, я совсем немного его посмотрел. попозже попробую использовать.
А не подскажете ли как исправить так, чтоб скорость постоянно была положительной? Мне кажется что нужно вычислять направление машины для этого. Это так? Например direction = newlocation - oldlocation. И затем если нажата стрелка вверх, то направление вверх, если вниз, то наоборот. Как делать так чтоб поменять направление на 180 градусов?
Мне кажется что нужно вычислять направление машины для этого. Это так?
Это так. Но лучше завести для этого отдельный единичный вектор. В этом случае можно вычислить новое положение автомобиля как, например, oldlocation + direction * speed.
Quote (clidi)
Как делать так чтоб поменять направление на 180 градусов?
В векторном случае - умножить вектор на -1. Если направление хранить в виде угла, то просто прибавить/отнять 180 градусов. Всё гениальное просто. И хреново работает.
как исправить так, чтоб скорость постоянно была положительной?
Скорость - это вектор, он не может быть положительным или отрицательным. Если имеется ввиду та_циферка_что_на_спидометре, то это модуль проекции скорости на вектор, направленный вдоль корпуса машины. В моём 2D примере это модуль величины SpY после перевода величин в локальную систему координат автомобиля.
-Mikle-, Что то у меня не получается чтоб работал код. А конкретно я не понял как переделать render функцию. Если раньше я рисовал для машины 5 точек и трансформировал только центральную, то как быть сейчас? Как я понял CarX и CarY это центральная точка машины?
Code
Private Sub Render() 'Рисование Dim x As Single, y As Single x = CarX * 5 / Me.ScaleWidth '5 пикселей на метр x = (x - Int(x)) * Me.ScaleWidth y = CarY * 5 / Me.ScaleHeight y = (1 - y + Int(y)) * Me.ScaleHeight Car.X1 = x - 10 * Sin(Alpha) '10 пикселей = 2 метра, расстояние от центра тяжести до задней части Car.Y1 = y + 10 * Cos(Alpha) Car.X2 = x + 8 * Sin(Alpha) '8 пикселей = 1.6 метра, расстояние от центра тяжести до передней части Car.Y2 = y - 8 * Cos(Alpha) End Sub
Это середина переднего и заднего бамперов, величины вспомогательные, если рендерить спрайт, то достаточно центральной точки и угла поворота Alpha (в радианах). Это:
Code
x = (x - Int(x)) * Me.ScaleWidth y = (1 - y + Int(y)) * Me.ScaleHeight
Сделано, чтобы машина, выезжая за край, появлялась с другой стороны.
Quote (clidi)
Вместо this->getAngle() вставить alpha или как?
Скорее вместо этого: ((90+this->getAngle())*(PI/180.0f))
Сообщение отредактировал -Mikle- - Пятница, 09 Марта 2012, 16:05