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

Проблема с коллизией

30.07.2023, 01:45. Показов 920. Ответов 7

Author24 — интернет-сервис помощи студентам
Здравствуйте, возникла такая проблема, не могу вызвать функцию collision в функции update

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    void update(float time, Map& map1)
    {
        switch (dir) //направление
        {
        case 0: dx = speed; dy = 0; break;
        case 1: dx = -speed; dy = 0; break;
        case 2: dx = 0; dy = speed; break;
        case 3: dx = 0; dy = -speed; break;
        }
 
        x += dx * time;
        y += dy * time;
 
        speed = 0;
        s.setPosition(x, y); 
        map1.collision(x, y, dx, dy, h, w);
    }
};
Пишет: "использование неопределенного типа "Map" "
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2023, 01:45
Ответы с готовыми решениями:

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

Проблемы с коллизией
Давно столкнулся с такой проблемой, что в 3d шутере персонаж, передвигаемый transform`ом застревает...

Беды с коллизией
На оба объекта повешены Rigidbody и Коллайдеры Как поправить?

Зачем придумали борьбу с коллизией?
Добрый день! Можете мне пожалуйста на простом языке объяснить зачем придумали борьбу с коллизией?...

7
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
30.07.2023, 01:51 2
Цитата Сообщение от XAKEPL Посмотреть сообщение
Пишет: "использование неопределенного типа "Map"
В cpp файле, где показанный тобой код находится сделай инклуд заголовка с определением класса Map.
1
7 / 7 / 0
Регистрация: 22.08.2019
Сообщений: 10
30.07.2023, 01:52  [ТС] 3
да, именно там и пишет
0
18901 / 9859 / 2410
Регистрация: 30.01.2014
Сообщений: 17,304
30.07.2023, 01:56 4
XAKEPL, ну по этому коду мало что понятно, но я попробую угадать: у вас взаимное включение заголовочных файлов?
1
Вездепух
Эксперт CЭксперт С++
11696 / 6375 / 1724
Регистрация: 18.10.2014
Сообщений: 16,078
30.07.2023, 01:56 5
Цитата Сообщение от XAKEPL Посмотреть сообщение
Пишет: "использование неопределенного типа "Map" "
Ну значит так и есть. И?
1
7 / 7 / 0
Регистрация: 22.08.2019
Сообщений: 10
30.07.2023, 02:01  [ТС] 6
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
#include <iostream> 
#include <SFML\Graphics.hpp>
#include "map.h" //файл с классом Map
#include "player.h"
#include "camera.h"
using namespace sf;
 
int main()
{
    RenderWindow window(VideoMode(1600, 900), "Dead strike");
 
    Clock clock;
    Camera came;
    Player p("ChellSheet.png", 750, 50, 331, 454);
    p.s.setPosition(p.x, p.y);
    string mapP = "PropSheet.png";
    Map map1(10, 10, 200, 200, mapP);
    came.cam.reset(FloatRect(0, 0, 640, 480));
    came.cam.setCenter(331, 454);
 
    while (window.isOpen()) //пока открыто окно, делаем то или это
    {
        float time = clock.getElapsedTime().asMicroseconds();
        clock.restart();
        time = time / 800;
        Event event;
 
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        //ПОШЁЛ РОДНОООООЙ!!!!!!!!!!
        if ((Keyboard::isKeyPressed(Keyboard::A))) {
            p.dir = 1; p.speed = 0.2;//см .update()
            p.s.setScale(-0.2, 0.2);
            p.s.setTextureRect(IntRect(331, 0, 331, 454));
            came.getPlayerXYCamera(p.x, p.y);
        }
        if ((Keyboard::isKeyPressed(Keyboard:: D))){ 
            p.dir = 0; p.speed = 0.2;
            p.s.setTextureRect(IntRect(331, 0, 331, 454));
            p.s.setScale(0.2, 0.2);
            came.getPlayerXYCamera(p.x, p.y);
        }
        if ((Keyboard::isKeyPressed(Keyboard::W))) {
            p.dir = 3; p.speed = 0.2;
            p.s.setTextureRect(IntRect(700, 0, 331, 454));
            came.getPlayerXYCamera(p.x, p.y);
        }
        if (Keyboard::isKeyPressed(Keyboard::S)) {
            p.dir = 2; p.speed = 0.2;
            p.s.setTextureRect(IntRect(331, 0, 331, 454));
            p.s.setScale(0.2, 0.2);;
            came.getPlayerXYCamera(p.x, p.y);
        }
 
        map1.drawMap(window);
        window.draw(p.s);//рисуем игрока
        window.display();
        came.viewMap(time);
        window.setView(came.cam);
        p.update(time, map1);
        //map1.collision(p.x, p.y, p.dx, p.dy, p.h, p.w);
        window.clear(Color(163, 140, 114));
    }
    return 0;
 
}
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
 //player.h
#include <iostream>
#include <SFML\Graphics.hpp>
#include "map.h"
#include "camera.h"
using namespace std;
using namespace sf;
 
class Player { // класс Игрока
public:
    float x, y, w, h, dx, dy, speed = 0; //координаты игрока х и у, высота ширина, ускорение (по х и по у), сама скорость
    int dir = 0; //направление
    string File; //файл
    Texture tex;//текстура
    Sprite s;//спрайт
 
    Player(string F, float X, float Y, float W, float H) {  //Конструктор лего
        File = F;//имя файла
        w = W; h = H;//высота и ширина
 
        tex.loadFromFile(File);
        s.setTexture(tex);
        tex.setRepeated(true); //сглаживание
        x = X; y = Y;//координата появления спрайта
        s.setTextureRect(IntRect(0, 0, w, h));  //ставим нужный прямоугольник
        s.setScale(0.2, 0.2);
    }
 
    friend class Map;
 
    void update(float time, Map& map1) // update - обновление даёт персонажу движение.
    {
        switch (dir) //направление
        {
        case 0: dx = speed; dy = 0; break;// персонаж идет вправо
        case 1: dx = -speed; dy = 0; break;//персонаж идет влево
        case 2: dx = 0; dy = speed; break;//персонаж идет вниз
        case 3: dx = 0; dy = -speed; break;//персонаж идет вверх
        }
 
        x += dx * time;
        y += dy * time;
 
        speed = 0;//зануляем скорость, чтобы персонаж остановился
        s.setPosition(x, y); //выводим спрайт в позиции
        map1.collision(x, y, dx, dy, h, w);
    }
};
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
 //map.h
#pragma once
#include <SFML\Graphics.hpp>
#include "player.h"
#include <iostream>
 
using namespace std;
using namespace sf;
 
class Map {
public:
    int _hMap, _wMap, _h, _w = 0;
    string _ff;
    Texture mapProp;
    Sprite PropsMap;
 
    Map(){
    
    }
    Map(const int hm, const int wm, int h, int w, string file) {
        _hMap = hm; _wMap = wm; _ff = file; _h = h; _w = w;
 
        mapProp.loadFromFile(file);
        mapProp.setRepeated(true);
        PropsMap.setTexture(mapProp);
        PropsMap.setScale(0.5, 0.5);
        PropsMap.setTextureRect(IntRect(0, 0, w, h));
    }
    ~Map() {}
    //PropsMap.setScale(0.5, 0.5);
 
    sf::String mapa[10] = { "*********",
                                            "*888*g*_*",
                                            "*_s_*_*_*",
                                            "*sbs*_*_*",
                                            "*___*_*_*",
                                            "**+**+*_*",
                                            "*w_g*_*_*",
                                            "*ss+e+__*",
                                            "*___*_*_*",
                                            "*********" };
 
    void drawMap(RenderWindow& window) {
        for (int i = 0; i < _hMap; ++i) for (int j = 0; j < _wMap; ++j) {
            if (mapa[i][j] == '*') { PropsMap.setTextureRect(IntRect(0, 0, 200, 200)); PropsMap.setPosition(i * 100, j * 100);  window.draw(PropsMap); }
        }
 
    }
    void collision(float& x, float& y, float& dx, float& dy,float& h, float& w) {
        for (int i = y / 32; i < (y + h) / 32; i++)
            for (int j = x / 32; j < (x + w) / 32; j++)
            {
                if (mapa[i][j] == '*')//если наш квадратик соответствует символу 0 (стена), то проверяем "направление скорости" персонажа:
                {
                    if (dy > 0)//если мы шли вниз,
                    {
                        y = i * 32 - h;//то стопорим координату игрек персонажа. сначала получаем координату нашего квадратика на карте(стены) и затем вычитаем из высоты спрайта персонажа.
                    }
                    if (dy < 0)
                    {
                        y = i * 32 + 32;//аналогично с ходьбой вверх. dy<0, значит мы идем вверх (вспоминаем координаты паинта)
                    }
                    if (dx > 0)
                    {
                        x = j * 32 - w;//если идем вправо, то координата Х равна стена (символ 0) минус ширина персонажа
                    }
                    if (dx < 0)
                    {
                        x = j * 32 + 32;//аналогично идем влево
                    }
                }
 
            }
    }
};
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
30.07.2023, 02:30 7
Лучший ответ Сообщение было отмечено XAKEPL как решение

Решение

XAKEPL, как правильно угадал DrOffset, у тебя взаимное включение заголовков.
Это решается через предварительное объявление одного из классов и переносом реализации методов другого в отдельный cpp.
Только для твоего кода это пока не нужно, т.к. достаточно убрать
Цитата Сообщение от XAKEPL Посмотреть сообщение
#include "player.h"
из map.h, не вижу, зачем он там нужен.

Добавлено через 2 минуты
И почему в map.h у тебя есть #pragma once, а в player.h нет?
0
7 / 7 / 0
Регистрация: 22.08.2019
Сообщений: 10
31.07.2023, 01:02  [ТС] 8
Благодарю, всё заработало
0
31.07.2023, 01:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2023, 01:02
Помогаю со студенческими работами здесь

Проблема с кодом. Выдает ошибку, я не могу понять в чем проблема
Работаю первый раз с Maple. Установлен версии 2015 года. Выдает ошибку я не могу понять в чем...

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

Проблема с движением объекта через компьютерную мышь, и также проблема, со сменой камеры
Делаю игру на unity, где будет танк. Тут у меня появились две проблемы. 1) При нажатии С, должна...

проблема при работе с китайским J-LINK 8 или же проблема с с
Всем привет. Решил Сам собрать себе дисковери кит на базе at91sam7s64-ek. Подарили мне китайский...

Проблема собственной массы и энергии электрона в классической электродинамике и проблема абсолютно твердого тела в СТО
Проблема собственной массы и энергии электрона в классической электродинамике и проблема абсолютно...

Проблема с пингом, проблема которой не могу объяснить
Такая ситуация стряслась, поменяли роутер, у всех все нормально, но у меня на ноутбуке прыгает пинг...

Проблема с Linux Mint 20(А может и не проблема)
Когда нажимаю на sk Hynix появляется это окошко(так должно быть или нет)?


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

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