Войти
Box2DФорумОбщее

Ошибка в Box2D (C++).

#0
(Правка: 16:29) 16:28, 20 дек. 2020

Пишу взаимодействие персонажа и мяча в игре (волейбол), то есть их столкновение. При выполнении кода появляется ошибка. Буду рад, если кто поможет решить проблему.

Ошибка:

Assertion failed: fixture->m_body == this, file d:\c++\box2d_v2.3.0\box2d\box2d\dynamics\b2body.cpp, line 222

Код создания мяча:

body_def.position.Set(10, 0);
  b2CircleShape ball_shape;
  ball_shape.m_radius = 32 / SCALE;
  b2Body* ball = World.CreateBody(&body_def);

  b2FixtureDef ball_fixture;
  ball_fixture.shape =  &ball_shape;
  ball_fixture.filter.categoryBits = 0x2;
  ball_fixture.filter.maskBits = 0x4;

  ball_fixture.restitution = 0.75;
  ball_fixture.density = 0.5;
  b2Fixture* fixture = ball->CreateFixture(&ball_fixture);

  const char* ball_name[] = { "ball" };
  ball->SetUserData(ball_name);

Условие нажатия клавиши:

if (Keyboard::isKeyPressed(Keyboard::Q)) 
    {
      ball->DestroyFixture(fixture);

      // Creating CircleShape object
      b2CircleShape ball_shape;
      ball_shape.m_radius = 32 / SCALE;
      b2Body* ball = World.CreateBody(&body_def);

      b2FixtureDef ball_fixture;
      ball_fixture.shape = &ball_shape;
      ball_fixture.restitution = 0.75;
      ball_fixture.density = 0.5;

      ball_fixture.filter.categoryBits = 0x3;
      ball_fixture.filter.maskBits = 0x3;

      //b2Fixture* ball->CreateFixture(ball_fixture);
      b2Fixture* fixture = ball->CreateFixture(&ball_fixture);

      const char* ball_name[] = { "ball" };
      ball->SetUserData(ball_name);

      position = ball->GetPosition();
      int a = position.y;
      position = body_1->GetPosition();
      int b = position.y;
      if (a < b) {
        if (is_contact)
        {
          std::cout << position.Length() << std::endl;
          float S = 35 - ball->GetPosition().Length();  //расстояние от центра поля до мяча
          float h = 250 / SCALE;  //высота сетки
          float t = h / 9.81;
          ball->SetLinearVelocity(b2Vec2((S / t) * 8, t * 32));
          std::cout << S << " " << h << " " << t << " (" << (S / t) << ", " << t * 2 << ")" << std::endl;
        }
      }
    }

#1
5:53, 21 дек. 2020

в box2d ошибок нет (относящихся к твоему случаю). ошибки есть в твоём коде, который его использует. так как ошибки совершенно бессмысленные, я бы рекомендовал для начала попытаться понять, что ты написал.

#2
8:33, 21 дек. 2020

Не правильно сформулировал, ясно, что в движке не будет ошибок. Код я свой понимаю. Я сначала создаю Fixture для моего Body, потом пытаюсь изменить путем удаления старого и созданием нового.

#3
8:35, 21 дек. 2020

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

Box2DФорумОбщее