Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.11.2011, 20:42
Silencе вне форума Посмотреть профиль Отправить личное сообщение для Silencе Найти все сообщения от Silencе
  № 11  
Ответить с цитированием
Silencе

Регистрация: Aug 2011
Сообщений: 53
и все же, и все же.. вопрос открытый - как с минимум трудозатрат создать нужную мне произвольную фигуру? например хочу я создать трассу и чтобы эту трассу по бокам ограничивали стенки.(т.е. фактически две параллельные кривые).
допустим, когда рисуешь кривую в редакторе, как можно потом эту кривую разбить на отрезки?(не в ручную разумеется).
я слышал что в coreldraw можно нарисовать нужную мне фигуру, во что то ее экспортить, а потом это произведение скормить боксу. может кто нибудь знает о чем речь шла?

Старый 19.11.2011, 20:46
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 12  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
я слышал что в coreldraw можно нарисовать нужную мне фигуру, во что то ее экспортить
Вряд ли.
Цитата:
и все же, и все же.. вопрос открытый - как с минимум трудозатрат создать нужную мне произвольную фигуру?
Писать все это кодом - всегда трудозатратно. Я бы написал редактор, где просто мыской расставлял бы точки, и экспортировал все это, например, в XML. Потом уже XML грузил в игру, и на его основе расставлял вершины фигур.

Старый 20.11.2011, 10:15
Silencе вне форума Посмотреть профиль Отправить личное сообщение для Silencе Найти все сообщения от Silencе
  № 13  
Ответить с цитированием
Silencе

Регистрация: Aug 2011
Сообщений: 53
да так то игры небольшая, лень заморачиваться. просто бокс уже довольно взрослая либа, должно уже по нескольку раз все обсосано

Старый 20.11.2011, 10:58
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 14  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
бокс уже довольно взрослая либа, должно уже по нескольку раз все обсосано
Все, что от него требуется, он выполняет на все сто.
Есть еще на его основе либа QuickBox2d. Там подобные задачи выполнить проще

Старый 20.11.2011, 22:51
Silencе вне форума Посмотреть профиль Отправить личное сообщение для Silencе Найти все сообщения от Silencе
  № 15  
Ответить с цитированием
Silencе

Регистрация: Aug 2011
Сообщений: 53
если динамическое тело - мяч. и статическое тело, состоящее из двух шейпов в одном Боди.
при столкновение тел мое тело (динамическое) пролетает сквозь статическое тело. при этом динамическое тело тратит свою энергию на совершение работы по преодолению сопротивления статического тела.

Код AS1/AS2:
 
 
// Статическое тело:
            var bodyDef_:b2BodyDef;
            var polygonShape_:b2PolygonShape;
            var fixtureDef_:b2FixtureDef;
 
            var bodyLine_:b2Body;
            var wallStageThickness_:Number = 3;
            var ballDiameter_:Number = 20;
 
            // init
            bodyDef_ = new b2BodyDef();
            bodyDef_.position.Set((_mapBase.stage.stageWidth - (wallStageThickness_ + ballDiameter_ + 10)) / METERS, _mapBase.stage.stageHeight / METERS);
            bodyDef_.type = b2Body.b2_staticBody;
            bodyLine_ = _mapBase.world.CreateBody(bodyDef_);
            polygonShape_ = new b2PolygonShape();
            fixtureDef_ = new b2FixtureDef();
 
             //первый шейп
            polygonShape_.SetAsBox(wallStageThickness_ / METERS, -450 / METERS);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
 
             //второй шейп
             polygonShape_.SetAsArray([bodyLine_.GetLocalPoint(b2Vec2.Make(375 / METERS, 90 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(364 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(367 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(378 / METERS, 90 / METERS))]);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
если в коде приведенном выше изменить ширину первого шейпа:

Код AS1/AS2:
polygonShape_.SetAsBox(wallStageThickness_ / METERS, -450 / METERS);
вот так вот:
Код AS3:
 polygonShape_.SetAsBox(wallStageThickness_ / METERS, 450 / METERS);
        // убрали "-" перед 450
то при сталкивание с этой частью моего статического тела, мяч упруго отскакивает.

ладно с этим разобрался.
но в этом же теле существует другой шейп:


Код AS1/AS2:
      //второй шейп
             polygonShape_.SetAsArray([bodyLine_.GetLocalPoint(b2Vec2.Make(375 / METERS, 90 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(364 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(367 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(378 / METERS, 90 / METERS))]);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
мяч сквозь него пролетает, а надо чтобы отскакивал.

Добавлено через 1 час 25 минут
ответ:
для каждой фигуры(именно фигура, не путать с Телом = тело может состоять из нескольких фигур) нужно создавать отдельный bodyDef_ и переназначь позицию:

Код AS1/AS2:
      //Статическое тело
            bodyDef_ = new b2BodyDef();
            bodyDef_.position.Set((_mapBase.stage.stageWidth - (wallStageThickness_ + ballDiameter_ + 10)) / METERS, _mapBase.stage.stageHeight / METERS);
            bodyDef_.type = b2Body.b2_staticBody;
            bodyLine_ = _mapBase.world.CreateBody(bodyDef_);
            polygonShape_ = new b2PolygonShape();
            fixtureDef_ = new b2FixtureDef();
 
            // Первый шейп
            polygonShape_.SetAsBox(wallStageThickness_ / METERS, 450 / METERS);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
 
            // Второй шейп
            bodyDef_ = new b2BodyDef();
            bodyDef_.position.Set(375 / METERS, 90 / METERS);
            polygonShape_ = new b2PolygonShape();
            polygonShape_.SetAsEdge(b2Vec2.Make(5/METERS, 0/METERS), b2Vec2.Make(-20/METERS, -20/METERS));
            bodyLine_ = _mapBase.world.CreateBody(bodyDef_);
            fixtureDef_.userData = "left";
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
Добавлено через 5 часов 25 минут
[quote=Silencе;1047248]если динамическое тело - мяч. и статическое тело, состоящее из двух шейпов в одном Боди.
при столкновение тел мое тело (динамическое) пролетает сквозь статическое тело. при этом динамическое тело тратит свою энергию на совершение работы по преодолению сопротивления статического тела.

Код AS1/AS2:
 
 
// Статическое тело:
            var bodyDef_:b2BodyDef;
            var polygonShape_:b2PolygonShape;
            var fixtureDef_:b2FixtureDef;
 
            var bodyLine_:b2Body;
            var wallStageThickness_:Number = 3;
            var ballDiameter_:Number = 20;
 
            // init
            bodyDef_ = new b2BodyDef();
            bodyDef_.position.Set((_mapBase.stage.stageWidth - (wallStageThickness_ + ballDiameter_ + 10)) / METERS, _mapBase.stage.stageHeight / METERS);
            bodyDef_.type = b2Body.b2_staticBody;
            bodyLine_ = _mapBase.world.CreateBody(bodyDef_);
            polygonShape_ = new b2PolygonShape();
            fixtureDef_ = new b2FixtureDef();
 
             //первый шейп
            polygonShape_.SetAsBox(wallStageThickness_ / METERS, -450 / METERS);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
 
             //второй шейп
             polygonShape_.SetAsArray([bodyLine_.GetLocalPoint(b2Vec2.Make(375 / METERS, 90 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(364 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(367 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(378 / METERS, 90 / METERS))]);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
если в коде приведенном выше изменить ширину первого шейпа:

Код AS1/AS2:
polygonShape_.SetAsBox(wallStageThickness_ / METERS, -450 / METERS);
вот так вот:
Код AS3:
 polygonShape_.SetAsBox(wallStageThickness_ / METERS, 450 / METERS);
        // убрали "-" перед 450
то при сталкивание с этой частью моего статического тела, мяч упруго отскакивает.

ладно с этим разобрался.
но в этом же теле существует другой шейп:


Код AS1/AS2:
      //второй шейп
             polygonShape_.SetAsArray([bodyLine_.GetLocalPoint(b2Vec2.Make(375 / METERS, 90 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(364 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(367 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(378 / METERS, 90 / METERS))]);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
мяч сквозь него пролетает, а надо чтобы отскакивал.

Добавлено через 1 час 25 минут
/*неверно*/

Добавлено через 5 часов 37 минут
Код AS1/AS2:
 var body:b2Body; //тело
            var bodyDef:b2BodyDef; //геометрические настройки тела
            var bodyShapePoligon:b2PolygonShape;
            var wallThickness:Number = 5; //толщина стены в пикселях
            var fixDef:b2FixtureDef = new b2FixtureDef();
 
            //right
            bodyDef = new b2BodyDef(); //создаем b2BodyDef
            bodyDef.position.Set(156 / METERS, 108 / METERS);
            bodyShapePoligon = new b2PolygonShape();
            bodyShapePoligon.SetAsArray([b2Vec2.Make(0 / METERS, 0 / METERS), b2Vec2.Make(-13 / METERS, 11 / METERS), b2Vec2.Make(-20 / METERS, 47 / METERS)]);
            body = _mapBase.world.CreateBody(bodyDef);//создаем тело
            fixDef.userData = "right";
            fixDef.shape = bodyShapePoligon;
            body.CreateFixture(fixDef);
этот код представляет треугольник. почему при таких настройках мой динамический объект сквозь него пролетает?

Добавлено через 5 часов 48 минут
в коде выше изменяем метод SetAssArray
Код AS3:
bodyShapePoligon.SetAsArray([b2Vec2.Make(10 / METERS, -10 / METERS), b2Vec2.Make(-10 / METERS, -10 / METERS), b2Vec2.Make(0 / METERS, -37 / METERS)]);
все нормально. мяч не пролетает сквозь треугольник.

а теперь повернем треугольник на 90 градусов:
Код AS3:
bodyShapePoligon.SetAsArray([b2Vec2.Make(-10 / METERS, -10 / METERS), b2Vec2.Make(-10 / METERS, 10 / METERS), b2Vec2.Make(37 / METERS, 0 / METERS)]);
мяч вновь пролетает! wtf?!


Последний раз редактировалось Silencе; 21.11.2011 в 04:26.
Старый 21.11.2011, 10:32
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 16  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
У определения тела есть свойство isBullet. Его нужно поставить true в таком случае. Так же у тела есть метод SetBullet(value:Boolean);
При назначении тела пулей, просчеты для него происходят в десять раз чаще. Это стоит спользовать для быстродвижущихся тел.

Старый 21.11.2011, 11:56
Silencе вне форума Посмотреть профиль Отправить личное сообщение для Silencе Найти все сообщения от Silencе
  № 17  
Ответить с цитированием
Silencе

Регистрация: Aug 2011
Сообщений: 53
вроде трабла в том, что я строил полигон не по часовой стрелке.

Старый 21.11.2011, 13:34
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 18  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
это значения не имеет
Полигон строится в соответствии с порядком расположения точек в массиве, а не по часовой стрелке

Старый 21.11.2011, 13:50
Silencе вне форума Посмотреть профиль Отправить личное сообщение для Silencе Найти все сообщения от Silencе
  № 19  
Ответить с цитированием
Silencе

Регистрация: Aug 2011
Сообщений: 53
в моем случаи проблема была в том что я расположил вершины в массиве против часовой стрелки.

SetAsArray([....]) - надо вершины располагать по часовой стрелки. а я как раз таки делал в точности до наоборот - против часовой стрелки.

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:39.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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