С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 29.12.2020
Сообщений: 21

Создание b2ContactListener

04.01.2021, 13:55. Показов 383. Ответов 0

Студворк — интернет-сервис помощи студентам
Добрый день. У меня есть class CONTACT_LISTENER : public b2ContactListener{...}, и класс игрока и мяча.
Проблема заключается в том, что ContactListener не обнаруживает контакт двух тел (в каждой функции ContactListener я поставил вывод сообщений, и ни одно сообщение не выводилось). Хотя я запускал обычный цикл вне класса ContactListener и контакт находился. Мне кажется, что проблема состоит в SetContactListener, или как по сути активировать ContactListener. В статье я нашел следующие строки и использую их:

C++
1
2
CONTACT_LISTENER contact_listener_instance;
World.SetContactListener(&contact_listener_instance);
Классы персонажа и мяча:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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";
    }
};
Буду рад помощи! Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2021, 13:55
Ответы с готовыми решениями:

Проблема создания b2ContactListener
Добрый день. У меня есть class CONTACT_LISTENER : public b2ContactListener{...}, и класс игрока и мяча. Проблема заключается в том, что...

Создать базу данных с(Создание функции БД, Создание процедуры БД, Создание тригера БД)
В задание для курсовой работы по БД входят вот такие пункты: 1.2 Создание функции БД. 1.3 Создание процедуры БД 1.4 Создание...

Создание базы данных, создание таблиц в MS SQL Server из программы на C++ Builder 6.0
Здравствуйте. Не могу найти источника знаний по созданию базы данных в удалённом MS SQL Servere. В базе данных необходимо создать таблицы и...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.01.2021, 13:55
Помогаю со студенческими работами здесь

Хочу освоить и применить на практике создание локальной сети, создание домена
Доброго времени суток. Господа, на днях начал осваиваю win server 2003. Хочу освоить и применить на практике создание локальной сети,...

Создание лямбда-выражения средствами Expression (динамическое создание LINQ-запроса)
Доброго времени суток, уважаемые форумчане, вот такая проблема. Есть класс Man. public class Man { public string FirstName {...

Не работает создание формы вручну и создание объекта ProgressBar на ней
Здравствуйте. Имеется основная форма в программе, но понадобилось сделать на отдельной форме объект ProgressBar type ...

Создание локальной БД. Создание класса для работы с БД. Ошибка подключения к БД
Доброго времени суток! Нужно создать БД и создать класс для работы с ним - методы: добавление, удаления, просмотр самой базы,...

Создание кнопок в рантайме по клику мыши. Как прекратить создание?
Здравствуйте форумчане. Столкнулся со следующей проблемой. В поле Edit1 я ввожу число(например 5) и хочу создать такое количество кнопок на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru