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

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

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

Физика в libGDX - Программирование Android

26.09.2014, 11:38. Просмотров 1237. Ответов 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 AI - Программирование Android
Добрый день , кто нибудь пользовался данной вещью? https://github.com/libgdx/gdx-ai/wiki Просто кроме этой страницы нигде информации...

Libgdx polygon - Программирование Android
Добрый день, возникла следующая проблема : создаю объект класса Polygon (com.badlogic.gdx.math.Polygon) , поворачиваю его, рисую: poly...

Splash на libgdx - Программирование Android
Всем привет есть 2 атласа 2048x2048 на андроиде 4.2 и выше, работает все отлично, все что ниже версией ошибка, причем инициализации....

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

Нужен ли мне LibGDX? - Программирование Android
Уважаемые программисты, подскажите, пожалуйста, мне ответ на следующий вопрос: - Я хочу написать очень простую игру (для себя... с целью...

LibGDX загрузка аудио - Программирование Android
Ни как не получается загрузить музыку. В папку assets помещаю drop.wav rain.mp3 в методе create делаю так Sound dropSound; Music...

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

Libgdx уроки посоветуйте - Программирование Android
Привет! Посоветуйте уроки по LibGDX плиз. В гугле на первом месте сайт - http://suvitruf.ru/libgdx/ Он норм? Может что то еще можно...

Столкновение в libgdx через overlaps - Программирование Android
Есть два списка Rectangle экземпляров. Мне нужно проверить пересечение через if (bullet.overlaps(enemyK) и удалить их оба. С одним объектом...

LibGDX. TexturePacker. Не пакует текстуры - Программирование Android
Sync Project with Gradle Files нажимал. Помогите починить, пожалуйста. Для наглядности: package...

LibGDX, не получается создать apk файл - Программирование Android
Не могу создать apk файл. С libgdx первый опыт. Ошибка на фото. Час уже бьюсь, интернеты говорят, что надо добавить строку...

Libgdx. Задержка перед выполнением действия - Программирование Android
Здравствуйте. Как сделать, чтобы при нажатии на тачскрин какое-нибудь действие выполнялось не сразу, а с задержкой? Нажатие обрабатывается...


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

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

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