Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] У кого-нибудь есть опыт создания top-down гоночных игр на box2d? (http://www.flasher.ru/forum/showthread.php?t=145694)

goodguy 16.10.2010 19:56

У кого-нибудь есть опыт создания top-down гоночных игр на box2d?
 
Собственно сабж :)

Заинтересовался этим движком. Пока, к сожалению, нет времени серьезно сидеть с ним днями, изучать оф форум и т.п., так как работа + занят написанием довольно серьезной стратегии, но любопытство все-таки берет свое :D

И так, ближе к делу. Как создать мир бокс2д с гравитацией понятно, как создавать тела и их описания тоже (в общем ничего сложного), интересует другое. А именно:

При создании игры с видом сверху гравитация естественно отключается, но ей насмену приходит linearDamping. Собственно это помогает останавливать "автомобиль" после разгона, но как применять angularDamping? Или, если я что-то неправильно понял, то как заставить этот прямоугольник (машину), реалистично поворачивать? То есть, если я при движении нажму клавишу поворота, чтобы машину слегка заносило, но это не было похоже на движение по льду (пока у меня получалось сделать только подобное)

Если есть те, кто мог бы набросать простенький пример, буду признателен :victory:

з.ы. Пример искал, и даже находил, но все сайты типа emanueleferonato и.п. полная лажа, во-первых в основном все примеры с видом сбоку, во-вторых все сделано дочтаточно коряво, как например это http://www.emanueleferonato.com/2009...ke-box2d-cars/

Такого движения мне не нужно :)

NikolyA 16.10.2010 20:10

ну обычно берут движок и далее его наворачивают

goodguy 16.10.2010 20:37

Это больше походит на офтоп.

Движок взят, box2d. Вопрос, по-моему задан конкретный, а не о том, что обычно делают с движком ;)

Если имелось в виду, доработка того примера Эмануэле, то это я делать пробовал, не получилось. Но он, видимо сам сделать ничего не смог, по-этому выложил такое "роботоподобное движение", так сказать, чем богаты, тому и рады.

Александр 17.10.2010 00:10

Раз просто поворт тела не катит)
и кол-во машин не много
предлогаю такие варианы:
http://savepic.ru/1856253.jpg
http://savepic.ru/1866492.jpg

по мне той проблемы которой у тебя не будет.
попробуй расскажешь тоже гонки думаю сделать

Ralph_DiMarko 18.01.2011 23:45

Код AS3:

                private function moveCar():void
                {
                        if (bleft) {
                                carAng ++;
                        }else if (bright) {
                                carAng --;
                        }
                        if (bup) {
                                speed += accel;
                        }else if (bdown) {
                                speed -= accel;
                        }
                        var angle:Number = carAng * Math.PI / 180;
                        var speedX:Number = speed * Math.cos(angle);
                        var speedY:Number = speed * Math.sin(angle);
                        boxBody.SetAngle(angle);
                        boxBody.ApplyForce(new b2Vec2(speedX, speedY), boxBody.GetPosition());
                }

Вроде что-то получается, но ее просто нимеренно заносит, как будто по льду катаюсь...

Dukobpa3 19.01.2011 00:16

Так а чем пример Эмануэля не нравится? вполне реалистично. Разгон, занос.

Добавлено через 56 секунд
Это не оффтоп, просто сам в свое время с него передирал, может если подробнее скажешь что именно надо - смогу помочь.

Ralph_DiMarko 19.01.2011 00:58

Вложений: 1
Эмануэля вариант слишком большой и пока что немного не понятный для меня, хочется понимать что делаю, и тем более в моем случае колеса как бы не нужны. Плюс уже три раза пытался обрезать вариант Эмануэля, там все между собой связано и одно без другого не работает.

Я пытаюсь сделать top-down машинку, все работает кроме поворотов.
Объект начинает двигаться, начинаю поворачивать, сам объект меняет свой угол куда нужно, но инерция неправильно отрабатывает, как будто на машине заехал на каток, начинаешь набирать скорость и поворачиваешь, машину несет боком, потом она по чуток уже двигается в правильном направлении. Надеюсь смог выразится :)

swf прикрепил

goodguy 19.01.2011 13:12

Цитата:

Так а чем пример Эмануэля не нравится? вполне реалистично. Разгон, занос.
Фуфло его пример. Движется не реалистично, доработке практически не полежит. У эмануэле вообще все примеры конченые.
Самый лучший пример гонок на бокс 2д, что я видел, была игра Lil Racerz http://www.playground.ru/flash/racing/3733/ автор которой рашьше зависал на флешките. Но автору я писал, он куда-то бесследно исчез :D

Я на сколько мог его игру растребушил, но так и не понял как машины собраны, точнее как они управляются.

Division 19.01.2011 15:27

Я в свое время делал гонки. Не на флеше правда. Физику свою юзал, некое подобие верлетовой.
На бокс 2д я бы делал примерно как эмануэле. только вместо 4 колес сделал бы 2. Одно спереди одно сзади.
Ключевая идея в том чтоб гасить боковую скорость у колес.
Есть вектор направления колеса. Есть вектор скорости колеса (колесо двигается по этому вектору). Нужно спроецировать вектор скорости на вектор направления колеса. Тогда машинка будет вести себя реалистично, ехать только вдоль направления колес.
Повороты машины осуществляются путем поворота вектора колеса.
В бокс2д колеса можно сделать просто кругами, которые "прибиты" к корпусу машины. Одно спереди, одно сзади.
Если нужны заносы, проецирование вектора скорости осуществляется не сразу, а за несколько итераций.

Ralph_DiMarko 19.01.2011 22:31

вау! Как бы это все перевести на as3 да еще и под box2d )
спасибо!
Буду колдовать и попробую еще с Nape поиграться..

goodguy 19.01.2011 22:32

Ralph_DiMarko, будет интересно посмотреть на результат ;)

Ralph_DiMarko 19.01.2011 22:35

договорились.
Как сделаю обещаю выложить сюда :)

goodguy 19.01.2011 22:41

ждемс :D

Я кстати это все делал. Но похоже что-то все-таки делал не так. angularDamping у меня так нормально и не заработал. Машина поворачивала, но при езде по горизонтали двигалась медленнее, чем по вертикали

Alex Lexcuk 20.01.2011 11:45

Цитата:

Сообщение от goodguy (Сообщение 966026)
ждемс :D

Я кстати это все делал. Но похоже что-то все-таки делал не так. angularDamping у меня так нормально и не заработал. Машина поворачивала, но при езде по горизонтали двигалась медленнее, чем по вертикали

То-же обратил на это внимание, в коробке2-1 работает как надо.

Ralph_DiMarko 20.01.2011 14:28

уря! получилось. Но как на зло вчера свет отключили не смог выложить, седня вечером выложу. Как оказалось я просто немного неправильно делал, а так бы и в боксе работало, хотя это только в теории. И кстати очень непривычно что для создания коробочки всего три строчки кода нужно, вместо чуть ли не 10 в Box2D.

Но теперь другая проблема.
Если в Nape отключить гравитацию, то объекты при столкновении входят в друг-друга как мягкие тела, где то до половины, а то и вообще насквозь проходят, а когда ставлю гравитацию то все нормально отрабатывает.

3p.station 20.01.2011 19:07

тоже заинтересовала тема. нашел вот такое - car parcing - но код так написан что плеваца хочется - нету силы у меня такое копать(вроде и ребята нормальные....)
я никогда не работал с движками физики - что посоветуете - Nape или Box2D 2.1a или 2.0.1? Nape быстрее - но там тока swc дают... где понятнее АПИ? где создать физичесоке взаимодействие объектов проще, прикрутить к телам формы...
спасибо за советы!

Division 20.01.2011 20:32

3p.station
Мне Nape больше нравится. Хотя Box2D для понимания проще.
В Nape более удобно(но сложнее для понимания) реализованы колбеки.
Также в Nape есть некоторые вкусности вроде marching squares, декомпозиции полигонов и другого. Меня больше всего радует marching squares.
Зато в бокс2д сделали какой-то жирный broad phase, которому не важно знать размер мира.
Фильтрация коллизий/сенсоров в Nape мне нравится больше.
В Nape есть партиклы.
В Nape объект который стоит на месте и только вращается делается одной строчкой. Без джоинтов.
А еще в Box2D есть CCD. В Nape нету, автор предлагает делать step несколько раз за кадр.

Я перешел на Nape с Box2D и в общем-то доволен.
Если решишь юзать Box2D, то бери тот что новее, 2.1а.

goodguy 20.01.2011 20:47

Цитата:

Сообщение от 3p.station (Сообщение 966319)
тоже заинтересовала тема. нашел вот такое - car parcing - но код так написан что плеваца хочется - нету силы у меня такое копать(вроде и ребята нормальные....)
я никогда не работал с движками физики - что посоветуете - Nape или Box2D 2.1a или 2.0.1? Nape быстрее - но там тока swc дают... где понятнее АПИ? где создать физичесоке взаимодействие объектов проще, прикрутить к телам формы...
спасибо за советы!

В принципе, при желании разобраться можно. Но что-то движение этой машины очень похоже на пример от эмануэле

3p.station 20.01.2011 21:55

спасибо Вам за ответы!
буду наверно ковырять Nape или вот еще нашел на базе бокса- http://code.google.com/p/quickb2/ с желешекой ((( :
goodguy - ну покажите что у вас там вышло (( :

goodguy 20.01.2011 22:00

Я уже вряд ли этот код найду. Тема то была создана довольно давно, а неудачные коды у меня долго не задерживаются :D

Ralph_DiMarko 20.01.2011 22:13

Вот что у меня вышло
http://megaswf.com/serve/101943/
Клик мышкой добавит новый бокс на поле.
Никак не могу исправить это вхождение в друг друга при столкновении.
Вот код

Код AS3:

        // Мир
        var gravity:Vec2 = new Vec2(0, 0);
        space = new UniformSleepSpace(new AABB(0, 0, 800, 600), 20, gravity);
 
        //Машина
        carPhObj = Tools.createBox(300, 200, 100, 50, 0, 0, 0, false, Material.Steel);
        space.addObject(carPhObj);
        addChild(carPhObj.graphic);
 
        //Пол
        floorPhObj = Tools.createBox(400, 500, 800, 50, 0, 0, 0, true, Material.Steel);
        space.addObject(floorPhObj);
        addChild(floorPhObj.graphic);

Код AS3:

 
private function moveCar():void
{
        if (isLeftKeyDown) {
                carAngle --;
        }else if (isRightKeyDown) {
                carAngle ++;
        }
        if (isUpKeyDown) {
                carSpeed += carAccel;
        }else if (isDownKeyDown) {
                carSpeed -= carAccel;
        }
        var angle:Number = carAngle * Math.PI/180 ;
        var speedX:Number = carSpeed * Math.cos(angle);
        var speedY:Number = carSpeed * Math.sin(angle);
        carPhObj.px += speedX;
        carPhObj.py += speedY;
        carPhObj.setPos (carPhObj.px, carPhObj.py, angle);
        carPhObj.update();
        space.sync(carPhObj);
}


Division 20.01.2011 22:18

Ralph_DiMarko, совершенно неверный подход. Прочитай мой пост на первой странице еще раз.

3p.station 20.01.2011 22:23

пишите разработчикам - может подскажут чего

goodguy 20.01.2011 22:25

У разработчиков глухо как в танке. Я первым делом писал им (точнее на их форуме), и не один раз. Ни одного ответа не было

Ralph_DiMarko 20.01.2011 22:30

Division, премного благодарен, но признаюсь мне тяжело это все перевести в код :(
Но ну допустим неверный подход, но это же не должно влиять на столкновение, может это не машина а просто коробочка, которую я сдвинул немного.

Division 20.01.2011 22:32

Очевидно же, застряет потому что setPos вызывается. Машина - динамический объект, который подчинается законам симуляции.

Я сам спрашивал что-то на форуме, Лука ответил, не сразу правда.

Повторюсь. Чтоб было нормально - делается два круга-колеса. Они цепляются PivotJointами(или скорее PinJoint) к корпусу. И влияние осуществляется на колеса(их скорость проецируется на вектор направления колеса), а не на саму машину.

Ralph_DiMarko 20.01.2011 22:34

а.. кажется понял.
ей просто нужно придать инерцию чтобы она сама покатилась, тогда наверняка не будет такого..

3p.station 24.01.2011 15:24

а вот это как вышло ? реалистично ?
(сама скорость одинкова - не делал ее увеличение снижение, тоесть если вы не жмете вперед - то машина не едет и влево вправо тока вмсте с перед работает)

goodguy 24.01.2011 16:19

катание по льду. Примерно тоже самое у меня получалось

goodguy 07.03.2011 14:16

Вложений: 1
Два дня работы, и получилось вот что.
Есть еще проблемы с задним ходом, и величины нужно подстроить, но уже прогресс.
Думаю так же сделать все-таки 4 колеса. Будет реалистичнее

На Box2D 2.0 работает, если делаю тоже самое на Box2D 2.1 linear и angular damping работают коряво. Похоже глюк движка

Ralph_DiMarko 07.03.2011 18:17

Прикольное управление - как рыбка в аквариуме :)

goodguy 07.03.2011 18:26

Теперь загорелся желанием сделать тоже самое на джаве, и прифигачить все это дело к андроиду :D

MXPain 21.06.2011 15:04

Кстати ни у кого нет мыслей на счет AI противника? В одном примере было сделано через массив углов, но мне кажется это черезчур громоздкий вариант.

goodguy 21.06.2011 16:42

Каких еще углов? Есть массив точек / векторов, противник движется по траектории заданной этими точками, приближается к одной, переключается на следующую. Keith Peters в своей книжке ADvanced Actionscript 3 Animation хорошо этот принцип расписал, и исходники на его сайте есть

MXPain 21.06.2011 21:55

Цитата:

Сообщение от goodguy (Сообщение 1005394)
Каких еще углов?

есть массив тайлов, и точно такой-же размерностью массив углов, машинка противника находясь на определенном тайле поворачивается на соответствующий угол.

а книжку почитаю, спасибо)


Часовой пояс GMT +4, время: 22:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.