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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android BluetoothAdapter - теряется объект после блокировки/выключения экрана http://www.cyberforum.ru/android-dev/thread1263089.html
Всем привет. Ситуация следующая. Написал тестовое приложение, которое соединяется c блутус модулем (с таким, если это важно) и отсылает на него сообщения по нажатию кнопки. Всё нормально коннектится...
Программирование Android Как в Canvas взять значение Preference из Engine? LiveWallpaperService.java public class SampleEngine extends Engine implements SharedPreferences.OnSharedPreferenceChangeListener { private LiveWallpaperPainting painting; ... http://www.cyberforum.ru/android-dev/thread1263079.html
Программирование Android Тема для дипломной работы
Скоро уже нужно определиться с темой для бакалаврской работы,хотелось бы какое нибудь приложенице под android написать, но в голову ничего путного не лезет, может у кого есть какие нибудь идеи на...
Программирование Android Как сделать, чтобы данные, введенные в EditText, сохранялись и пополнялись в новом активити?
как сделать что бы данные введенные в EditText сохранялись и пополнялись в новом активити... Идея такая: вводим текст в edittext нажимаем кнопку и данные сохраняются и выводятся в новом активити,...
Программирование Android Куда бы выбросить Яндекс-карты? http://www.cyberforum.ru/android-dev/thread1262860.html
Привет! Понимаю, что здесь не любят отвечать по теме Яндекс-карт, но всё равно поделюсь. Может, кто одумается. Многие знают, что развитие этого творения закончилось 2 года назад. Я мучался с ними...
Программирование Android Put / Get Extra A1.class Intent in = new Intent(a1.this, a2.class); startActivity(a2); Toast.makeText(getBaseContext(), Integer.toString(i), Toast.LENGTH_SHORT).show(); ... подробнее

Показать сообщение отдельно
nnnikotinnn995
4 / 4 / 0
Регистрация: 07.07.2011
Сообщений: 314

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

26.09.2014, 11:38. Просмотров 1316. Ответов 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 Мб, 8 просмотров)
Тип файла: 7z Racing2.7z (5.45 Мб, 9 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru