Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Box2D] Не срабатывает определение столкновений (http://www.flasher.ru/forum/showthread.php?t=166115)

MrCyber 30.08.2011 11:47

Не срабатывает определение столкновений
 
Всем привет.
В одном из классов с помощью цикла создаются статические тела-сенсоры, являющиеся бонусами в игре, которые необходимо собирать. Как-то так:
Код AS3:

for (var i:int = 0; i<3; i++) {
  var newCoin:Coin = new Coin();
  newCoin.x = 50 + 30 * i;
  newCoin.y = 100;
  coinsContainer.addChild(newCoin);
  /*
  Создается тело с userData == [newCoin, "coin"]
  */

]

При тестировании все создается.
С помощью класса MyContactListener (наследника b2ContactListener) пытаюсь проверить на столкновение с динамическим телом ball.
Код AS3:

if (contact.GetFixtureA().GetBody().GetUserData()[1]=="coin" && contact.GetFixtureB().GetBody().GetUserData()[1]=="ball") {
        trace('true');
} else trace('false');

При тестировании динамическое тело явно контактирует со статическим, однако 'true' не выводит.
Экземпляр MyContactListener добавлен в главный класс и связан с миром. Как решить проблему?

goodguy 30.08.2011 12:04

Цитата:

Как решить проблему?
Написать правильный код.
Динамические тела в бокс2д точно контактируют со статичекими и с кинетическими.

Вот этот код мне вообще не понятен:
Код AS3:

contact.GetFixtureA().GetBody().GetUserData()[1]=="coin"

Зачем там [1]? Точнее, зачем вообще туда передавать массив? Чаще всего в качестве пользовательских данных передается ссылка на экземпляр класса.

В общем, вот пример того, как у меня проверяется столкнулся ли солдат с чем либо:
Код AS3:

override public function BeginContact(contact:b2Contact):void {
                        contact.FlagForFiltering();
                        var aFixture:        b2Fixture        = contact.GetFixtureA();
                        var bFixture:        b2Fixture        = contact.GetFixtureB();
                        var aBody:                b2Body                = aFixture.GetBody();
                        var bBody:                b2Body                = bFixture.GetBody();
                        if (bBody.GetUserData() is ISoldier) {
                                bBody.GetUserData().enabled = false;
                                bBody.GetLinearVelocity().NegativeSelf();
                        } else if (aBody.GetUserData() is ISoldier) {
                                aBody.GetUserData().enabled = false;
                                aBody.GetLinearVelocity().NegativeSelf();
                        }
 
                }

А вот так назначаются пользовательские данные:
Код AS3:

public function build(x:Number, y:Number, radius:Number, world:b2World, userData:ISoldier, ratio:Number = 30):void {
                        _ratio                                                                        = ratio;
                        _world                                                                        = world;
                        var shape:                                b2CircleShape        = new b2CircleShape(radius / _ratio);
                        var circleBodyDef:                b2BodyDef                = new b2BodyDef();
                        var circleFixtureDef:        b2FixtureDef        = new b2FixtureDef();
                        circleFixtureDef.isSensor                                = false;
                        circleFixtureDef.shape                                        = shape;
                        circleFixtureDef.filter.maskBits                = ~CategoryBits.PASS_THRU;
                        _direction                                                                = new b2Vec2(x / _ratio, y / _ratio);
                        circleBodyDef.position.Set(_direction.x, _direction.y);
                        _body                                                                        = world.CreateBody(circleBodyDef);
                        _body.SetType(b2Body.b2_dynamicBody);
                        _body.CreateFixture(circleFixtureDef);
                        _body.SetLinearDamping(10);
                        _body.SetAngularDamping(10);
                        _body.SetUserData(userData);                                        // передается класс, применяющий интерфейс ISoldier
                }



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

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