Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/35: Рейтинг темы: голосов - 35, средняя оценка - 4.60
4 / 4 / 0
Регистрация: 28.06.2019
Сообщений: 16
1

Как сделать столкновение?

27.06.2021, 18:12. Показов 6322. Ответов 6
Метки c++, sfml (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос: у меня есть код, который рисует "стены" и "игрока"(точку). Как мне сделать так чтобы при столкновении игрока об стену, он не проходил сквозь неё? я могу сделать с одной стенкой, но сложность заключается в том, что у меня массив стен, как сделать так, чтобы на всех стенах из массива была эта проверка или возможно это можно сделать другим способом?


Вот код:
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <SFML/Graphics.hpp>
 
using namespace sf;
 
int main()
{
    RenderWindow window(VideoMode(1000, 600), "SFMLworks");
    int h = 25;
    
    sf::String TileMap[25] =
   {"AAAAAAAAAAAAAAAAAAAA",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "A                  A",
    "AAAAAAAAAAAAAAAAAAAA"};
    
    const int SCALE = 20;
 
    RectangleShape rectangle;
    rectangle.setSize(sf::Vector2f(SCALE, SCALE));
    rectangle.setOutlineColor(sf::Color::Red);
    rectangle.setOutlineThickness(3);
 
 
    Texture t;
    t.loadFromFile("C:/Users/Andrey/Documents/Visual Studio 2013/Projects/Тест/rob.png");
 
    Sprite s;
    s.setPosition(100, 100);
    s.setTexture(t);
    s.setOrigin(10, 10);
 
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Left)){
            s.move(-0.02,0);
        }
        if (Keyboard::isKeyPressed(Keyboard::Right)){
            s.move(0.02, 0);
        }
        if (Keyboard::isKeyPressed(Keyboard::Down)){
            s.move(0, -0.02);
        }
        if (Keyboard::isKeyPressed(Keyboard::Up)){
            s.move(0, 0.02);
        }
 
        if (Keyboard::isKeyPressed(Keyboard::Q)){
            s.rotate(-0.02);
        }
        if (Keyboard::isKeyPressed(Keyboard::E)){
            s.rotate(0.02);
        }
 
 
        window.clear(Color::White);
 
 
        for (int i = 0; i < h; i++)
        {
            int w = TileMap[i].getSize();
            for (int j = 0; j < w; j++)
            {
                if (TileMap[i][j] == 'A') rectangle.setFillColor(Color::Black);
 
                if (TileMap[i][j] == ' ') continue;
 
                rectangle.setPosition(j*SCALE, i*SCALE);
                window.draw(rectangle);
            }
        }
 
 
        window.draw(s);
        window.display();
    }
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2021, 18:12
Ответы с готовыми решениями:

В упор не понимаю как сделать столкновение персонажа с объектами. Как мне это сделать?
//Source.cpp #include &lt;SFML/Graphics.hpp&gt; #include &lt;iostream&gt; #include &lt;string&gt; #include...

Из массива прямоугольников создать карту и сделать столкновение
Нужно построить карту из прямоугольников и реализовать столкновение прямоугольника игрока с...

Как сделать столкновение в pygame
как сделать столкновение? вот код main.py import pygame from texturelod import * from logic...

Как сделать столкновение мяча с квадратом?
Писал простенькую программу, решил сделать мячик, летающий по окну, делал все в АБЦ НЕТ 3.7.1....

6
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,074
Записей в блоге: 3
27.06.2021, 20:46 2
Лучший ответ Сообщение было отмечено Дмитрий Кибер как решение

Решение

Дмитрий Кибер,
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
#define SFML_STATIC
#include <SFML/Graphics.hpp>
#include <vector>
#include <iostream>
 
using namespace sf;
 
    std::vector<sf::String> TileMap =
    {   "AAAAAAAAAAAAAAAAAAAAAAAAA",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A             AAA                             A",
        "A             A A                             A",
        "A             AAA                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "A                                             A",
        "AAAAAAAAAAAAAAAAAAAAAAAAA",
    };
 
int main()
{   RenderWindow window(VideoMode(1000, 600), "SFMLworks");
 
    const int SCALE = 20;
    const int THICK =  3;
 
    RectangleShape  rectangle;
                    rectangle.setSize            (sf::Vector2f(SCALE, SCALE));
                    rectangle.setOutlineColor    (sf::Color::Red            );
                    rectangle.setFillColor       (sf::Color::Black          );
                    rectangle.setOutlineThickness(THICK                     );
 
    RectangleShape  pers;
                    pers.setSize            (sf::Vector2f(SCALE*2, SCALE*2));
                    pers.setOutlineColor    (sf::Color::Blue               );
                    pers.setFillColor       (sf::Color::Green              );
                    pers.setOutlineThickness(THICK                         );
                    pers.setPosition        (50, 50                        );
 
    char dir = 0;
 
    sf::Clock clock;
 
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {        if (event.type == sf::Event::Closed) window.close();
 
            else if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {dir = 'W';}
            else if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {dir = 'A';}
            else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {dir = 'S';}
            else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {dir = 'D';}
        }
        window.clear(Color::White);
 
        double     d = clock.getElapsedTime().asMicroseconds();
        if(d > 0.) d = 1./ d;
        clock.restart     ();
 
        const float SPEED = 50.f * d;
 
        auto rect_pers = pers.getGlobalBounds();
        switch(dir)
        {   case 'W': rect_pers.top  -= SPEED; break;
            case 'A': rect_pers.left -= SPEED; break;
            case 'S': rect_pers.top  += SPEED; break;
            case 'D': rect_pers.left += SPEED; break;
            default:;
        }
 
        const int T = SCALE + THICK;
        bool   coll = false;
 
        for     (size_t i = 0, h = TileMap   .size   (); i < h; i++)
        {   for (size_t j = 0, w = TileMap[i].getSize(); j < w; j++)
            {   if (TileMap[i][j] == 'A')
                {   rectangle.setPosition(j * T, i * T);
                    window.draw(rectangle );
 
                    if(!coll &&
                        rectangle.getGlobalBounds().intersects(rect_pers))
                    {   coll = true;
                    }
                }
            }
        }
 
        if(dir != 0 && !coll)
        {   pers.setPosition(rect_pers.left + THICK,
                             rect_pers.top  + THICK);
        }
 
        window.draw(pers);
        window.display();
    }
 
    return 0;
}
Добавлено через 5 минут
Дмитрий Кибер,
хз, на тесте у мя заметен дефект:
зеленый квадрат при движении меняет скорость,
вроде сделал попытку привязать скорость перса ко времени фрейма,
но чёт артифакт не уходит.

подозреваю потери на конверте флот<>инт, но проверять буду уже не сёдня...

мож кто со свежим взглядом что нить подскажет ...
1
4 / 4 / 0
Регистрация: 28.06.2019
Сообщений: 16
27.06.2021, 21:13  [ТС] 3
При запуске вот что мне выдало
Миниатюры
Как сделать столкновение?  
0
4 / 4 / 0
Регистрация: 28.06.2019
Сообщений: 16
27.06.2021, 21:22  [ТС] 4
XLAT, вот что мне выдало
Изображения
 
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,074
Записей в блоге: 3
27.06.2021, 21:47 5
Лучший ответ Сообщение было отмечено Дмитрий Кибер как решение

Решение

Цитата Сообщение от Дмитрий Кибер Посмотреть сообщение
XLAT, вот что мне выдало
уберите 4 строку:
Цитата Сообщение от XLAT Посмотреть сообщение
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
#define SFML_STATIC
#include <SFML/Graphics.hpp>
#include <vector>
#include <iostream>
...
C++
1
2
3
4
5
6
7
8
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
 
#include <SFML/Graphics.hpp>
#include <vector>
#include <iostream>
...
Добавлено через 1 минуту
Кликните здесь для просмотра всего текста
Цитата Сообщение от XLAT Посмотреть сообщение
#define SFML_STATIC
я всегда компилирую в один ексешник без длл'ок.

но для этого нужно ещё настроить компилятор на соотвествующие библы...
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,074
Записей в блоге: 3
27.06.2021, 21:55 6
тест:
(Управление: WASD)
Вложения
Тип файла: rar Test.rar (422.2 Кб, 8 просмотров)
0
4 / 4 / 0
Регистрация: 28.06.2019
Сообщений: 16
27.06.2021, 22:01  [ТС] 7
Блин как тут цитировать.
Цитата Сообщение от XLAT
XLAT, Все равно та же ошибка, это из за того что вы по другому библиотеки подключаете?
Добавлено через 1 минуту
А НЕ ВСЕ ЗАРАБОТАЛО, СПАСИБО
1
27.06.2021, 22:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2021, 22:01
Помогаю со студенческими работами здесь

Как сделать столкновение объекта с формой
Пожалуйста помогите мне со столкновением объекта с формой Добавлено через 38 минут Вот как я...

Как сделать коллизию(столкновение) в игре?
Написал игру сделал карту , карта сделана с помощь двумерного массива Вопрос в том, как сделать...

Как сделать столкновение ImageView (игра гонки)
Как сделать столкновение ImageView ? У меня есть 3 машины, одна на месте стоит, я ее перемещаю...

Как сделать само столкновение с движущимися блоками?
Игра заключается в поднятии &quot;смайликом&quot; ключа, пройдя через движущиеся блоки. При достижении цели...

Как сделать, чтобы столкновение объектов было абсолютно неупругим
Нашел пример попиксельного столкновения. Работает прекрасно, но что делать в момент столкновения,...

Не получается сделать столкновение спрайтов
Здравствуйте форумчане , вообщем сделал я корабль с пушками и метеориты , поставил на них rigibody...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru