Суббота, 05 Октября 2024, 12:47

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Передвижение машины
clidiДата: Пятница, 02 Марта 2012, 22:52 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Нужно сделать передвижение машины, а конкретно чтоб машина постепенно останавливалась если не нажата стрелка вверх. Сейчас у меня только одна переменая для скорости. Когда машина врезается, то скорость становится отрицательной и машина едит назад. И скорость не снижается. Пробовал делать иф стейтменты, если клавиша не нажата то скорость 0, или пробовал если клавиша не нажата то скорость постепенно уменьшается от текущей. Как это сдялать, подскажите. использую c++ и opengl.
RorschachДата: Пятница, 02 Марта 2012, 22:55 | Сообщение # 2
участник
Сейчас нет на сайте
в каждом цикле умножай скорость на определенный коэффициент трения, ну вроде
friction = .98f
speed *= friction
А вообще у юзера GECK был великолепный пример физики авто, стукни ему в личку.


Never compromise. Not even in the face of Armageddon.

Сообщение отредактировал Rorschach - Пятница, 02 Марта 2012, 22:56
-Mikle-Дата: Вторник, 06 Марта 2012, 14:53 | Сообщение # 3
Изобретатель велосипедов
Сейчас нет на сайте
clidi, вот простой пример автофизики на Visual Basic 6 с исходником:
ss2d
Управление:
a, z - сменить передачу
стрелка вверх - газ
стрелка вниз - тормоз
Вот, если надо, в 3D:
ss3d
но этот не запустится в Win Vista и новее, или нужно добавить и зарегистрировать dx8vb.dll.


Сообщение отредактировал -Mikle- - Вторник, 06 Марта 2012, 14:54
clidiДата: Среда, 07 Марта 2012, 18:22 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Rorschach, Спасибо, пока оставил как ты сказал, с friction.

-Mikle-, Спасибо за пример кода, я совсем немного его посмотрел. попозже попробую использовать.

А не подскажете ли как исправить так, чтоб скорость постоянно была положительной? Мне кажется что нужно вычислять направление машины для этого. Это так? Например direction = newlocation - oldlocation. И затем если нажата стрелка вверх, то направление вверх, если вниз, то наоборот. Как делать так чтоб поменять направление на 180 градусов?
GECKДата: Четверг, 08 Марта 2012, 09:19 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
clidi, кури векторную математику smile
Quote (clidi)
Мне кажется что нужно вычислять направление машины для этого. Это так?

Это так. Но лучше завести для этого отдельный единичный вектор. В этом случае можно вычислить новое положение автомобиля как, например, oldlocation + direction * speed.

Quote (clidi)
Как делать так чтоб поменять направление на 180 градусов?

В векторном случае - умножить вектор на -1. Если направление хранить в виде угла, то просто прибавить/отнять 180 градусов.


Всё гениальное просто. И хреново работает.
-Mikle-Дата: Четверг, 08 Марта 2012, 09:59 | Сообщение # 6
Изобретатель велосипедов
Сейчас нет на сайте
Quote (clidi)
как исправить так, чтоб скорость постоянно была положительной?

Скорость - это вектор, он не может быть положительным или отрицательным. Если имеется ввиду та_циферка_что_на_спидометре, то это модуль проекции скорости на вектор, направленный вдоль корпуса машины.
В моём 2D примере это модуль величины SpY после перевода величин в локальную систему координат автомобиля.
clidiДата: Четверг, 08 Марта 2012, 22:37 | Сообщение # 7
почетный гость
Сейчас нет на сайте
-Mikle-, Что то у меня не получается чтоб работал код. А конкретно я не понял как переделать render функцию. Если раньше я рисовал для машины 5 точек и трансформировал только центральную, то как быть сейчас? Как я понял CarX и CarY это центральная точка машины?



И как я понял у вашей машины 2 точки?

И раньше у меня было для трансформации:
Code

this->setXofP(this->getXofP + this->getVelocity() * cos((90+this->getAngle())*(PI/180.0f)));
this->setYofP(this->getYofP + this->getVelocity() * sin((90+this->getAngle())*(PI/180.0f)));


Помогите пожалуйста переделать.
Вместо this->getAngle() вставить alpha или как?

Я использую c++ и opengl.


Сообщение отредактировал clidi - Четверг, 08 Марта 2012, 22:41
-Mikle-Дата: Пятница, 09 Марта 2012, 13:10 | Сообщение # 8
Изобретатель велосипедов
Сейчас нет на сайте
Quote (clidi)
CarX и CarY это центральная точка машины?

Да, точнее - центр тяжести.
Quote (clidi)
И как я понял у вашей машины 2 точки?

Это середина переднего и заднего бамперов, величины вспомогательные, если рендерить спрайт, то достаточно центральной точки и угла поворота 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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг