Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
nnnikotinnn995
 Аватар для nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 292
#1

Физика в libGDX - Android

26.09.2014, 11:38. Просмотров 1142. Ответов 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.
Миниатюры
Физика в libGDX   Физика в libGDX   Физика в libGDX  

Вложения
Тип файла: 7z Racing.7z (4.75 Мб, 8 просмотров)
Тип файла: 7z Racing2.7z (5.45 Мб, 9 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2014, 11:38     Физика в libGDX
Посмотрите здесь:

LibGDX загрузка аудио Android
SQLite и libGDX Android
Android Libgdx AI
Android Splash на libgdx
Android Libgdx polygon
Libgdx. Задержка перед выполнением действия Android
Android LibGDX. TexturePacker. Не пакует текстуры
Android LibGDX, не получается создать apk файл
Android Столкновение в libgdx через overlaps
Компиляция игры, libGDX Android
Android Libgdx уроки посоветуйте
LibGDX вращение текстуры Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 03:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru