rel='stylesheet' href='http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css'

понедельник, 23 июля 2012 г.

Работа понемногу ползет


Здравствуйте.
Немного новостей. 
Работа очень медленно начала ползти, я в расстройстве, потому что из-за грозы сгорела моя Wi-Fi точка доступа и я остался без интернета, а в ближайший месяц-два средств на новую к сожалению не предвидится. Так что связь с миром теперь только на работе :( Ну ничего прорвемся.
Ну и что касается проекта.
Наконец таки определился с инструментарием и сделал прототип, решился использовать Box2d давно хотел его попробовать, так что вооружившись демками lampogolovii принялся за работу.

Вроде как пока все получается, вот только остался один нерешенный вопрос, при создании мира указываем его размеры, а какие тут размеры укажешь если по сути бежать можно бесконечно. Что приходит в голову на данный момент, так это при достижении конца физического мира, все двигать на начало и надо бы придумать какую-то синхронизацию, что б не было подергиваний при перестройке с конца на начало, а может их и не будет) пока еще не пробовал, но думаю получится. Если у кого есть какие мысли по этому поводу рад послушать.

8 комментариев:

  1. Либо двигать мир, либо:
    http://code.google.com/p/box2d-delphi/

    :)

    (В новой версии box2d не нужно указывать пределы для мира)

    ОтветитьУдалить
  2. Спасибо большое, буду знать) Но пока покачаюсь по демкам lampogolovii, а потом можно будет пробовать новую версию. Вчера вечером сделал репид мира, все хорошо работает.

    ОтветитьУдалить
  3. Тоже использую бокс2д, не мог бы описать как заделал репид?

    ОтветитьУдалить
  4. Может и топорно (я только начал разбираться в бокс2д), но я сделал так)

    b2player - физическое динамическое тело персонажа
    SpritePlayer - спрайт игрока
    b2ground - физическое статичное тело - дом
    b2ground2 - физическое статичное тело - дом
    SpriteGround - спрайт дома для физ тела b2ground
    SpriteGround2 - спрайт дома для физ тела b2ground2


    //возврат на начало мира, ширина мира = 100
    if b2player.Position[0] > 90 then
    begin
    //возвращаю персонажа
    b2player.SetPositionAndRotation(VectorMake(b2player.Position[0] - 90, b2player.Position[1], b2player.Position[2]), b2player.Rotation);

    //тут удаляю блоки\дома потому что через сетпозишн они почему-то недвигались
    b2ground.free;
    b2ground2.free;
    //и снова их создаю в новом месте
    with fb2BodyList do
    begin
    //тела удалились а спрайты стоят еще в старом месте, начинаем плясать от координат спрайтов
    b2ground := AddSimpleBox(1, 0, 0, SpriteGround.Position.X - 90, SpriteGround.position.y, 0, SpriteGround.width / 2, 6);

    b2ground2 := AddSimpleBox(1, 0, 0, SpriteGround2.position.X - 90, SpriteGround2.position.y, 0, SpriteGround2.width / 2, 6);
    end;
    //тут теперь спрайтам присваиваем позицию физ тел
    SpriteGround.Position.SetPoint(VectorMake(b2ground.position[0],b2ground.position[1],b2ground.position[2]));

    SpriteGround2.Position.SetPoint(VectorMake(b2ground2.position[0],b2ground2.position[1],b2ground2.position[2]));
    end;

    SpritePlayer.Position.SetPoint(VectorMake(b2player.Position[0],b2player.Position[1],b2player.Position[2]));

    Ну вот))

    ОтветитьУдалить
  5. радостно, что кто-то использует наработки по боксу! если что-то понадобится дополнительное - пиши, обязательно добавим!

    если физ. тела - статика, то их можно просто передвигать, указывая новую позицию. таким образом ничего не надо будет удалять! ты написал, что так почему-то не работает, можешь кинуть демку - я гляну...

    на самом деле как правильно сказал perfect daemon, в новой версии бокса, у мира нет размеров...

    в дальнейшем я хотел перейти на новую версию бокса, пересобрать dll и обновить заголовочные файлы... если будет желание и время - можно посотрудничать в этом вопросе!))

    ОтветитьУдалить
  6. хм, только хотел набросать снова такую же демку но все отлично работает через SetPositionAndRotation. Наверно я тогда что-то натупил.
    Кстате о дополнительном)) Мне нужно добавить второе динамическое тело, но нужно чтобы оно не реагировало на столкновение с b2player, а только с b2ground1 и b2ground2. Не подскажеш, пожалуйста, как такое реализовать?

    ОтветитьУдалить
  7. чтобы не казалось, что вопрос оставлен без ответа, решил перепостить кусок из нашей переписки:

    насчет столкновений... как я понял, ты юзаешь мою оболочку над длл-кой, то есть используешь TBox2d_CustomBody...
    если так, тогда смело вызывай
    SetFilterData()
    там три параметра, почитай у меня вот здесь (http://lampogolovii.blogspot.com/2011/11/glvehicles.html#more) про них... там немного, но все же достаточно для первого понимания!
    после выставления фильтров всем телам, нужно вызвать ReFilter у мира, он тогда обновит все связи между объектами и начнет правильно сталкивать их, пропуская "ненужные" тела...

    если же напрямую используешь только длл-ку, без моей обертки, тогда нужно юзать эти две функции:
    b2_Shape_SetFilter()
    b2_World_ReFilter()

    ОтветитьУдалить