Форум программистов, компьютерный форум, киберфорум
Наши страницы
SFML
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
legozaur
8 / 8 / 13
Регистрация: 03.02.2013
Сообщений: 152
1

SFML Создание массива экземпляров класса

15.05.2015, 18:49. Просмотров 1616. Ответов 7
Метки нет (Все метки)

В ActionScript3.0 такой безысходности небыло)
Работаю с SFML
Проблема собственно в том, что я не могу создать N экземпляров объекта, через цикл for
При N=1000
такое не прокатит наверное
C++
1
Object mass[1000] = {бла-бла-бла1, бла2, бла3, ... бла1000}
Итак, объясняю:

Я хочу создать массив объектов, типо цели, которые "летают в воздухе".

C++
1
Object mass[20];
что у меня получилось, но возможно не правильно, т.к. я заметил ругань компилятора на то, что нет пустого конструктора. Я ему дал этот конструктор:

C++
1
2
3
4
5
6
7
8
9
10
Object()
    {
        x = 0;
        y = 0;
        width = 0;
        height = 0;
        dx = 0;
        dy = 0;
        speed = 0;
    }
После этого я захотел сделать в main цикл для описания всех 20 объектов

C++
1
2
3
4
for(i=0; i<CountTarget; i++)
    {
        mass[i] = new Object("ball.png",50+10*i,50,50,50);
    }
Так-же я пробовал множество других способов, дело дошло даже до такого:

C++
1
2
3
4
for(i=0; i<CountTarget; i++)
    {
        mass[i].init("ball.png",50+10*i,50,50,50);
    }
Весь ко программы: (в итоге вместо 20 кружочков я получаю 1(первый)), а хотелось бы 20

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
#include <SFML/Graphics.hpp>
#include <iostream>
 
class Object
{
public:
    double x; // координата Х
    double y; // координата Y
    double dx; // перемещение пл X
    double dy; // перемещение по Y
    double width; // ширина
    double height; // высота
    double speed; // скорость
 
    sf::String File; // Файл с расширением
    sf::Image image; // SFML изображение
    sf::Texture texture; // SFML текстура
    sf::Sprite sprite; // SFML спрайт
 
    Object()
    {
        x = 0;
        y = 0;
        width = 0;
        height = 0;
        dx = 0;
        dy = 0;
        speed = 0;
    }
    void init(sf::String _f, double _x, double _y, double _width, double _height)
    {
        width = _width;
        height = _height;
        dx = 0;
        dy = 0;
        speed = 0;
 
        File = _f;
        image.loadFromFile("images/" + File); //загружаем картинку
        texture.loadFromImage(image); // закидываем наше изображение в текстуру
        sprite.setTexture(texture); // заливаем спрайт текстурой
        x = _x;
        y = _y;
        sprite.setTextureRect(sf::IntRect(0,0,_width,_height)); // задаём српайту один прямоугольник для вывода
    }
};
 
/*
class Ball: public Object
{
public:
    Ball()
    {
    }
}
*/
 
 
 
 
 
 
 
int main()
{
    int i = 0;
    const int CountTarget = 20; // количество целей
 
    Object mass[CountTarget]; // массив из целей
    
    for(i=0; i<CountTarget; i++)
    {
        std::cout << "Sozdau " << i << "circle" << std::endl; 
        mass[i].init("ball.png",50+10*i,50,50,50);
    }
    
    sf::RenderWindow window(sf::VideoMode(480, 480), "test 7");
 
 
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        /*
        for(i=0; i<CountTarget; i++)
        {
            mass[i].sprite.move(0.1,0.1);
        }
        */
        //ball1.sprite.move(0.1,0.1);
        //window.clear();
        window.clear(sf::Color(255,255,255));
 
        //window.draw(ball1.sprite);
        
        for(i=0; i<CountTarget; i++)
        {
            window.draw(mass[i].sprite);
        }
        
        //std::cout << "..." << "\n";
        window.display();
    }
 
    return 0;
}
Заранее благодарен за подсказки и помощь.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2015, 18:49
Ответы с готовыми решениями:

SFML + Удаление экземпляров класса
Вопрос: как грамотно написать деструктор или нечто удаляющее всё сущее, то что я создал. Немного...

Создание релиза exe файла SFML C++ на VS 2017 (не удается открыть входной файл "sfml-graphics-s.lib")
не могу собрать решение релиз версии, не пойму что я делаю не так постоянно выдает ошибку 1&gt;LINK...

SFML создание кнопки
Подскажите, как создать кнопку с помощью SFML, т.е. загрузить картинку, которая будет реагировать...

Создание игры на sfml
Помогите создать игру: снизу экрана бегает существо(не важно кто), им управляет пользователь, а...

Создание игры на C++/ SFML введение
добрый день! попробовал что-нибуть написать по урокам с названием как название темы и столкнулся с...

7
rikimaru2013
2517 / 1179 / 355
Регистрация: 30.11.2013
Сообщений: 3,792
15.05.2015, 18:54 2
Цитата Сообщение от legozaur Посмотреть сообщение
Object mass[1000] = {бла-бла-бла1, бла2, бла3, ... бла1000}
надо компилятор поддержующий с++ 11. Для массива вызывается конструктор по умолчанию. Если не проинициализоровать массив сразу.

C++
1
Object mass[1000] = {{1,3,4},{1,3,1},{8,12,0}};
0
legozaur
8 / 8 / 13
Регистрация: 03.02.2013
Сообщений: 152
15.05.2015, 19:03  [ТС] 3
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
надо компилятор поддержующий с++ 11.
т.е. в Visual Studio 2012 такого не сделать? Должен же быть какой-то тайный ход, ну или не такой уж и тайный.

Возможно лучше воспользоваться другим типом данных? типа списка, или ещё чего.
0
ssXXss
266 / 188 / 33
Регистрация: 15.01.2011
Сообщений: 681
15.05.2015, 19:05 4
а что мешает использовать ,например, std::vector :
C++
1
2
3
4
 std::vector<MyClass*> vc_MyClass;
 for(int i = 0; i < 5000; i++){
    vc_MyClass.push_back(new MyClass(.....));
}
1
15.05.2015, 19:05
legozaur
8 / 8 / 13
Регистрация: 03.02.2013
Сообщений: 152
15.05.2015, 19:09  [ТС] 5
Цитата Сообщение от ssXXss Посмотреть сообщение
std::vector
, попробую
0
ssXXss
266 / 188 / 33
Регистрация: 15.01.2011
Сообщений: 681
15.05.2015, 19:12 6
контейнеры с++
1
lss
931 / 860 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
15.05.2015, 20:13 7
Лучший ответ Сообщение было отмечено legozaur как решение

Решение

Цитата Сообщение от legozaur Посмотреть сообщение
а хотелось бы 20
По-быстрому:
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
113
114
115
116
117
118
119
#include <SFML/Graphics.hpp>
#include <iostream>
 
 
class Object
{
public:
    double x; // координата Х
    double y; // координата Y
    double dx; // перемещение пл X
    double dy; // перемещение по Y
    double width; // ширина
    double height; // высота
    double speed; // скорость
 
    sf::FloatRect rect;
 
    sf::String File; // Файл с расширением
    sf::Image image; // SFML изображение
    sf::Texture texture; // SFML текстура
    sf::Sprite sprite; // SFML спрайт
 
    Object(sf::String _f, double _x, double _y, double _width, double _height)
    {
        width = _width;
        height = _height;
        dx = 0;
        dy = 0;
        speed = 0;
 
        File = _f;
        image.loadFromFile("images/" + File); //загружаем картинку
        texture.loadFromImage(image); // закидываем наше изображение в текстуру
        sprite.setTexture(texture); // заливаем спрайт текстурой
        x = _x;
        y = _y;
        rect = sf::FloatRect(x, y, width, height);
        sprite.setPosition(rect.left, rect.top);
        //sprite.setTextureRect(sf::IntRect(0.0, 110.0, _width, _height)); // задаём српайту один прямоугольник для вывода
        //sprite.setTextureRect(sf::IntRect(sf::Vector2f(x, y), _width, _height)); // задаём српайту один прямоугольник для вывода
    }
    
    //void init(sf::String _f, double _x, double _y, double _width, double _height)
    //{
    //    width = _width;
    //    height = _height;
    //    dx = 0;
    //    dy = 0;
    //    speed = 0;
 
    //    File = _f;
    //    image.loadFromFile("images/" + File); //загружаем картинку
    //    texture.loadFromImage(image); // закидываем наше изображение в текстуру
    //    sprite.setTexture(texture); // заливаем спрайт текстурой
    //    x = _x;
    //    y = _y;
    //    sprite.setTextureRect(sf::IntRect(0,0,_width,_height)); // задаём српайту один прямоугольник для вывода
    //}
};
 
/*
class Ball: public Object
{
public:
    Ball()
    {
    }
}
*/
 
 
int main()
{
    int i = 0;
    const int CountTarget = 20; // количество целей
 
    Object* mass[CountTarget]; // массив из целей
    
    for(i = 0; i < CountTarget; i++)
    {
        std::cout << "Sozdau " << i << "circle" << std::endl; 
        //mass[i].init("ball.png",50+10*i,50,50,50);
        mass[i] = new Object("ball.png", 50 + 50 * i, 50 * i, 50, 50);
    }
    
    sf::RenderWindow window(sf::VideoMode(800, 800), "test 7");
 
 
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        /*
        for(i=0; i<CountTarget; i++)
        {
            mass[i].sprite.move(0.1,0.1);
        }
        */
        //ball1.sprite.move(0.1,0.1);
        //window.clear();
        window.clear(sf::Color(255,255,255));
 
        //window.draw(ball1.sprite);
        
        for(i=0; i<CountTarget; i++)
        {
            window.draw(mass[i] ->sprite);
        }
        
        //std::cout << "..." << "\n";
        window.display();
    }
 
    return 0;
}
1
Миниатюры
SFML Создание массива экземпляров класса  
legozaur
8 / 8 / 13
Регистрация: 03.02.2013
Сообщений: 152
15.05.2015, 21:07  [ТС] 8
Цитата Сообщение от lss Посмотреть сообщение
sprite.setPosition(rect.left, rect.top);
Мой косяк, все элементы выводились в одно место, и поэтому я не мог их посчитать, и соответственно ушёл в ненужном направлении. Большое спасибо!
0
15.05.2015, 21:07
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2015, 21:07

SFML, создание пустой текстуры
Есть класс GameCell в котором создаются текстура и спрайт, предположим так: void...

Создание GUI используя библиотеку SFML
Ребят ответьте на вопрос, как создать GUI т.е. поле ввода и кнопки и т д с используя SFML в Visual...

<SFML/Graphics.hpp> создание спрайта
Хочу создать спрайт, загрузить в него текстуру и вывести на экран. Проблема: Что не так? Дело...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.