Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
nnnikotinnn995
5 / 5 / 4
Регистрация: 07.07.2011
Сообщений: 383
1

Физика в libGDX

26.09.2014, 11:38. Просмотров 1513. Ответов 0
Метки нет (Все метки)

Здравствуйте. В libGDX для двух мерных игр можно использовать физику Box2D. Предлагаю в этой теме изучить возможности этой библиотеки на примере игры Hill Climb Racing,начать с модели машинки и попытаться побороть возможные баги Box2D-libGDX .
В качестве документации могу предложить http://box2d.org/manual.pdf , а для тех кто не дружит с английским есть перевод http://www.gamedev.ru/code/forum/?id=87747 . В приведенных ссылках все написано достаточно понятно, потому сразу перейду к сути.
Начнем с колес
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//создание колес-----------------------------------------------------------------------------------
private float NRad;public Body wheeln1;public Fixture fixwheeln1;
public void createwheeln1(){
BodyDef def = new BodyDef();def.type = BodyType.DynamicBody;def.position.set(posbeginX,posbeginY);def.angularDamping=2.5f;wheeln1 = world.createBody(def);
CircleShape circlen = new CircleShape();circlen.setRadius(NRad);circlen.setPosition(new Vector2(0f, 0f));
//--------------------------
FixtureDef fixtureDef = new FixtureDef();FixtureDefn(fixtureDef,circlen);
//---------
fixwheeln1 = wheeln1.createFixture(fixtureDef);circlen.dispose();
}
public Body wheeln2; public Fixture fixwheeln2;
public void createwheeln2(){
BodyDef def2 = new BodyDef();def2.type = BodyType.DynamicBody;def2.position.set(posbeginX+3*NRad,posbeginY);def2.angularDamping=2.5f;wheeln2 = world.createBody(def2);
CircleShape circlen = new CircleShape();circlen.setRadius(NRad);circlen.setPosition(new Vector2(0f, 0f));
//--------------------------
FixtureDef fixtureDef = new FixtureDef();FixtureDefn(fixtureDef,circlen);
//---------
fixwheeln2 = wheeln2.createFixture(fixtureDef);circlen.dispose();
}
// Соединяем колеса жестким отрезком
public DistanceJointDef jtwnheeln12;
public void jointwnheeln12(){
jtwnheeln12=new DistanceJointDef();jtwnheeln12.initialize(wheeln1, wheeln2, getPosition(), getPosition2());world.createJoint(jtwnheeln12);
}
//создание колес--------------------------------------------------------------------------------------
Ну и для того, чтобы было интереснее при нажатие на правой стороне экрана будем крутить колесо вперед, а на левой - назад.
Java
1
2
3
4
5
6
public void ChangeNavigation(float delta){
Vector2 vel = wheeln1.getLinearVelocity();wheeln1.setLinearVelocity(vel);
if(touchn.boolmoven==1){wheeln1.applyTorque(-35);
}else if(touchn.boolmoven==-1){wheeln1.applyTorque(35);
}
}
Можете посмотреть исходник (Racing). В целом, до настоящего момента все идет гладко. Но при попытке к данной конструкции присоединить кузов начинаются проблемы.Кузов не должен двигаться в горизонтальном положение (или параллельно оси соединения колес) . Для этого нужно такое соединение, которое может перемещаться только в одном направление и не может вращаться. И как написано в документации для этой цели есть PrismaticJointDef

A prismatic joint allows for relative translation of two bodies along a specified axis. A prismatic joint
prevents relative rotation. Therefore, a prismatic joint has a single degree of freedom.

Однако это не совсем так. Для того, чтобы увидеть на сколько верное данное заявление можно создать и соединить 2 прямоугольника DistanceJointDef и PrismaticJointDef соединением.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//--------------------------------------------------------------------------------------
public Body skyhookn1;
public void createskyhookn1(){
BodyDef def = new BodyDef();def.type = BodyType.DynamicBody;def.position.set(posbeginX,posbeginY);skyhookn1 = world.createBody(def);
PolygonShape polyn = new PolygonShape();polyn.setAsBox(NRad,NRad/4);
FixtureDef fixtureDef = new FixtureDef();fixtureDef.shape = polyn;fixtureDef.density = 8.5f;
Fixture fixskyhook=skyhookn1.createFixture(fixtureDef);polyn.dispose();skyhookn1.setFixedRotation(true);
}
public Body skyhookn2;
public void createskyhookn2(){
BodyDef def = new BodyDef();def.type = BodyType.DynamicBody;def.position.set(posbeginX,posbeginY+2*NRad);skyhookn2 = world.createBody(def);
PolygonShape polyn = new PolygonShape();polyn.setAsBox(NRad,NRad/4);
FixtureDef fixtureDef = new FixtureDef();fixtureDef.shape = polyn;fixtureDef.density = 8.5f;
Fixture fixskyhook=skyhookn2.createFixture(fixtureDef);polyn.dispose();
}
public DistanceJointDef jtskyhookncarn;
public void Distanceskyhookwnncarn(){
jtskyhookncarn=new DistanceJointDef();
jtskyhookncarn.initialize(skyhookn1, skyhookn2,skyhookn1.getPosition(),skyhookn2.getPosition());
//jtskyhookncarn.frequencyHz=6;jtskyhookncarn.dampingRatio=0.285f;
world.createJoint(jtskyhookncarn);
}
PrismaticJointDef Prismaticskyhookncarn;
public void PrismaticSkyhooknCarn(){
Prismaticskyhookncarn=new PrismaticJointDef();
Vector2 worldAxis= new Vector2(0.0f, 1.0f);
Prismaticskyhookncarn.initialize(skyhookn1, skyhookn2,skyhookn1.getPosition(),worldAxis);
Prismaticskyhookncarn.lowerTranslation = -diametnwheeln/4;
Prismaticskyhookncarn.upperTranslation = diametnwheeln/4;
Prismaticskyhookncarn.enableLimit = true;
Prismaticskyhookncarn.maxMotorForce = 2.5f;Prismaticskyhookncarn.motorSpeed = 8.0f;
Prismaticskyhookncarn.enableMotor = true;world.createJoint(Prismaticskyhookncarn);
}
//-----------------------------------------------------------
Ну и заменим управление
Java
1
2
3
4
5
6
public void ChangeNavigation(float delta){
Vector2 vel = skyhookn1.getLinearVelocity();skyhookn1.setLinearVelocity(vel);
if(touchn.boolmoven==1){skyhookn1.applyForce(325, 0, skyhookn1.getPosition().x, skyhookn1.getPosition().y);
}else if(touchn.boolmoven==-1){skyhookn1.applyForce(-325, 0, skyhookn1.getPosition().x,skyhookn1.getPosition().y);
}
}
Я зафиксировал вращение нижнего прямоугольника skyhookn1.setFixedRotation(true); чтобы конструкция не упала на пол.
При столкновение со стенкой верхний прямоугольник будет дергаться горизонтально, хотя потом вернется в свое положение. А должен синхронно останавливаться с нижним (исходник Racing2). Вряд ли при такой стабильности получится нормальная физика.
Как вы думаете, это баг libGDX или нужно что то дописать? Посоветуйте как можно решить эту проблему?
Помотрите пожалуйста исходник Racing2, все что касается физики находится в пакете com.nikitin.phisics в классе MainCar и чуть чуть в AllObjects.
0
Миниатюры
Физика в libGDX   Физика в libGDX   Физика в libGDX  

Вложения
Тип файла: 7z Racing.7z (4.75 Мб, 11 просмотров)
Тип файла: 7z Racing2.7z (5.45 Мб, 10 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2014, 11:38
Ответы с готовыми решениями:

Libgdx AI
Добрый день , кто нибудь пользовался данной вещью? ...

Splash на libgdx
Всем привет есть 2 атласа 2048x2048 на андроиде 4.2 и выше, работает все...

Libgdx polygon
Добрый день, возникла следующая проблема : создаю объект класса Polygon...

SQLite и libGDX
Здраствуйте! Программирую потихоньку игры на либе, так чисто для себя. Тут...

Libgdx уроки посоветуйте
Привет! Посоветуйте уроки по LibGDX плиз. В гугле на первом месте сайт -...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2014, 11:38

Компиляция игры, libGDX
Здравствуйте. Помогите скомпилировать проект. Да, странная просьба) Я так...

Нужен ли мне LibGDX?
Уважаемые программисты, подскажите, пожалуйста, мне ответ на следующий вопрос:...

LibGDX вращение текстуры
Здравствуйте, есть ли в llibGDX какой-нибудь способ повернуть текстуру кроме...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru