Создание b2ContactListener
У меня есть class CONTACT_LISTENER : public b2ContactListener{...}, и класс игрока и мяча. Проблема заключается в том, что ContactListener не обнаруживает контакт двух тел (в каждой функции ContactListener я поставил вывод сообщений, и ни одно сообщение не выводилось). Хотя я запускал обычный цикл вне класса ContactListener и контакт находился. Мне кажется, что проблема состоит в SetContactListener, или как по сути активировать ContactListener. В статье я нашел следующие строки и использую их:
CONTACT_LISTENER contact_listener_instance;
World.SetContactListener(&contact_listener_instance);
Классы персонажа и мяча:
class PLAYER
{
public:
Texture texture_player_move;
Sprite sprite_player_move;
b2BodyDef body_def;
b2PolygonShape player_shape;
b2Body *body;
b2FixtureDef body_fixture;
PLAYER* player_data = this;
bool canHit = false;
PLAYER(String path, int X_rect, int Y_rect, int W_rect, int H_rect, float X_pos, float Y_pos)
{
std::cout << "player ready";
texture_player_move.loadFromFile(path);
texture_player_move.setSmooth(true);
sprite_player_move.setTexture(texture_player_move);
sprite_player_move.setOrigin(135, 240);
sprite_player_move.setTextureRect(IntRect(X_rect, Y_rect, W_rect, H_rect));
body_def.type = b2_dynamicBody;
body_def.position.Set(X_pos, Y_pos);
player_shape.SetAsBox(60 / SCALE, 160 / SCALE);
body = World.CreateBody(&body_def);
body_fixture.shape = &player_shape;
body_fixture.filter.categoryBits = 0xFFFF; // 0x0004
body_fixture.filter.maskBits = 0xFFFF; // 0x0002 | 0x0008
body_fixture.density = 1;
body->CreateFixture(&body_fixture);
body->SetFixedRotation(true);
body->SetUserData(this);
}
};
class BALL
{
public:
Texture texture_ball;
Sprite sprite_ball;
b2BodyDef body_def;
b2CircleShape ball_shape;
b2Body* ball;
b2FixtureDef ball_fixture;
BALL* ball_data = this;
BALL()
{
texture_ball.loadFromFile("C://Users/1/source/repos/Game Volley/Game Volley/images/ball.png");
texture_ball.setSmooth(true);
sprite_ball.setTexture(texture_ball);
sprite_ball.setOrigin(32, 32);
body_def.type = b2_dynamicBody;
body_def.position.Set(10, -5);
ball_shape.m_radius = 32 / SCALE;
ball = World.CreateBody(&body_def);
ball_fixture.shape = &ball_shape;
ball_fixture.filter.categoryBits = 0xFFFF; //0x0008
ball_fixture.filter.maskBits = 0xFFFF; //0x0002
ball_fixture.restitution = 0.75;
ball_fixture.density = 0.2;
ball->CreateFixture(&ball_fixture);
ball->SetUserData(this);
}
};
ContactListener:
class CONTACT_LISTENER : public b2ContactListener
{
void BeginContact(b2Contact* contact)
{
std::cout << "beginContact";
}
void EndContact(b2Contact* contact)
{
std::cout << "endContact";
}
void PreSolve(b2Contact* contact, b2Manifold* oldManifold)
{
std::cout << "preSolve";
if (contact->GetFixtureA()->GetBody() == Player_1.body && contact->GetFixtureB()->GetBody() == Ball.ball
|| contact->GetFixtureA()->GetBody() == Ball.ball && contact->GetFixtureB()->GetBody() == Player_1.body)
{
if (Player_1.canHit and onGround) {
std::cout << "preSolve";
//меняем направление
float ball_x = Ball.ball->GetPosition().x; // нахожу позицию мяча по X
float Distance = (1920 / 2) - (ball_x * SCALE); //Окно 1920x1080, делю на 2 - нахожу центр, перевожу в метры и отнимаю позицию мяча по X.
float Height = 250; //высота моей сетки 250 пикселей, делю, перевожу в метры
float Time = Height / 9.81; //Рассчет времени
Ball.ball->SetLinearVelocity(b2Vec2(Distance / Time, Time)); //Изменение скорости мяча
}
contact->SetEnabled(false);
}
}
void PostSolve(b2Contact* contact, b2ContactImpulse* impulse)
{
std::cout << "postSolve";
}
};
Буду рад помощи! Заранее спасибо!