boulat5280
@boulat5280
linux

Как исправить ошибку out of memory?

Я делаю 3д программу:
#include <SFML/Graphics.hpp>
#include <cstdlib>
#include <cmath>
int WIDTH = 800;
int HEIGHT = 600;
float p_x_pos=0,p_y_pos=0;
int m_p_x = 0, m_p_y = 0;
int map[10][10] = {
    {1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
    {0, 1, 0, 0, 0, 0, 1, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
    {0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 0, 1, 0, 0},
    {0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
    {0, 0, 0, 0, 1, 0, 0, 0, 0, 0}
};

sf::Color cast_ray(float x, float y, float angle, int max_dist) {
    float x_pos = x;
    float y_pos = y;
    float x_step = sin(angle);
    float y_step = cos(angle);
    for (int i = 0; i < max_dist; i++) {
        x_pos += x_step;
        y_pos += y_step;
        int x_ = x_pos / x_step;
        int y_ = y_pos / y_step;
        //printf("%f %f\n", x_pos, y_pos);
        try{
        if (map[x_][y_] == 1) {
            return sf::Color(255, 255, 255);
        }
        } catch(std::exception ex){
            
        }
    }
    return sf::Color(0, 0, 0, 0);
}
int main() {
    //window
    sf::RenderWindow window(sf::VideoMode(WIDTH, HEIGHT, 32), "3D Game");

    //fps text
    sf::Text fps;
    fps.setPosition(20, 0);
    sf::Font font;
    if (!font.loadFromFile("font.ttf")) {
    }
    fps.setFont(font);
    fps.setCharacterSize(52);
    fps.setColor(sf::Color(0, 0, 0));
    short fps_num = 0;
    int c_fps = 0;
    int fps_n = 0;
    int fps0 = 0, fps1 = 0, fps2 = 0, fps3 = 0, fps4 = 0;

    //clock time
    sf::Clock clock;
    sf::Time time;

    //window is open while
    while (window.isOpen()) {

        //events
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                window.close();
            }
            if (event.type == sf::Event::MouseMoved) {
                m_p_x = sf::Mouse::getPosition().x;
                m_p_y = sf::Mouse::getPosition().y;
            }
        }

        //time=clock.restart();
        time = clock.restart();

        //clear
        window.clear(sf::Color(0, 100, 255));

        //drawing
        for (int i = 0; i < 180; i++) {
            sf::RectangleShape pix;
            pix.setPosition(i * 10, 400);
            pix.setSize(sf::Vector2f(10, 10));
            pix.setFillColor(cast_ray(p_x_pos, p_y_pos, i, 10));
            window.draw(pix);
        }
        //printf("%f %f\n",p_x_pos,p_y_pos);
        
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                sf::RectangleShape pix;
                pix.setPosition(i * 10, 500 + j * 10);
                pix.setSize(sf::Vector2f(10, 10));


                if (map[i][j] == 1) {
                    pix.setFillColor(sf::Color(255, 0, 0));
                } else {
                    pix.setFillColor(sf::Color(0, 255, 0));
                }
                window.draw(pix);
            }
        }
        //fps text creating
        c_fps = 1 / time.asSeconds();
        fps.setString("fps: " + std::to_string(fps_n));

        switch (fps_num) {
            case 0:
                fps0 = c_fps;
                break;
            case 1:
                fps1 = c_fps;
                break;
            case 2:
                fps2 = c_fps;
                break;
            case 3:
                fps3 = c_fps;
                break;
            case 4:
                fps4 = c_fps;
                fps_n = (fps0 + fps1 + fps2 + fps3 + fps4) / 5;
                fps_num = -1;

                break;
        }
        fps_num++;
        window.draw(fps);

        //display
        window.display();
    }
    return 0;
}

она прекрасно работает но когда я решаю изменять позицию игрока вылетает ошибка out of memory. и да я знаю что это значит
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Так если знаете, то почему не проверяете, что ваши x_ и y_ лежат в пределах массива?
Например, при вызове cast_ray(5, 5, 0, 10), последняя проверяемая точка будет иметь координаты x_ == 5 и y_ == 15.

P.S. Хотя стоп, там вообще бред написан. При angle == 0 будет деление на ноль (причём, деление там вообще не нужно). Затем, в функцию передаётся угол в градусах (судя по диапазону 0:180, а функции sin и cos принимают радианы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы