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

SFML Sprite

13.09.2015, 22:08. Показов 2302. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Main.h
Кликните здесь для просмотра всего текста
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
#include  <SFML/Graphics.hpp>
 
using namespace std;
 
class Main
{
 
private:
    int x;
    int y;
    sf::RenderWindow *window;
    sf::Texture t_hero;
    sf::Sprite s_hero;
 
    void loadSprite()
    {
        t_hero.loadFromFile("D:/hero.png");
        s_hero.setTexture(t_hero);
        s_hero.setPosition(x,y);
        s_hero.setOrigin(56,56);
    }
 
public:
    Main(sf::RenderWindow &wind, int xx, int yy)
    {
        window = &wind;
        x=xx;
        y=yy;
        loadSprite();
 
    }
 
    void render()
    {
        sf::RenderWindow &w = *window;
        w.draw(s_hero);
    }
 
    void setPos(int xx,int yy)
    {
        x=xx;
        y=yy;
        s_hero.setPosition(x,y);
        
    }
 
};


Так спрайт отображается нормально:
Кликните здесь для просмотра всего текста
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
#include  <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
#include "Main.h"
 
using namespace std;
 
int main()
{
vector<Main> objArray;
 
 
sf::RenderWindow window(sf::VideoMode(800, 600), "Sprites");
sf::RenderWindow &wd = ref(window);
 
    Main mn (wd,100,100);
    objArray.push_back(mn);
 
while (window.isOpen())
{
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
 
        if (event.type == sf::Event::MouseButtonPressed)
         {
    if (event.mouseButton.button == sf::Mouse::Left)
    {
 
        std::cout << "the left button was pressed" << std::endl;
        std::cout << "mouse x: " << event.mouseButton.x << std::endl;
        std::cout << "mouse y: " << event.mouseButton.y << std::endl;
    }
          }
    }
 
    window.clear(sf::Color::Black);
 
    if(objArray.size()>0)
    {
    for(int f=0;f<objArray.size();f++)
    {
        objArray[f].render();
    }
    }
 
    window.display();
}
 
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
49
50
51
52
53
#include  <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
#include "Main.h"
 
using namespace std;
 
int main()
{
vector<Main> objArray;
 
 
sf::RenderWindow window(sf::VideoMode(800, 600), "Sprites");
sf::RenderWindow &wd = ref(window);
 
    
    objArray.push_back(Main (wd,100,100));
 
while (window.isOpen())
{
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
 
        if (event.type == sf::Event::MouseButtonPressed)
         {
    if (event.mouseButton.button == sf::Mouse::Left)
    {
 
        std::cout << "the left button was pressed" << std::endl;
        std::cout << "mouse x: " << event.mouseButton.x << std::endl;
        std::cout << "mouse y: " << event.mouseButton.y << std::endl;
    }
          }
    }
 
    window.clear(sf::Color::Black);
 
    if(objArray.size()>0)
    {
    for(int f=0;f<objArray.size();f++)
    {
        objArray[f].render();
    }
    }
 
    window.display();
}
 
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
49
50
51
52
#include  <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
#include "Main.h"
 
using namespace std;
 
int main()
{
vector<Main> objArray;
 
 
sf::RenderWindow window(sf::VideoMode(800, 600), "Sprites");
sf::RenderWindow &wd = ref(window);
 
 
while (window.isOpen())
{
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();
 
        if (event.type == sf::Event::MouseButtonPressed)
         {
    if (event.mouseButton.button == sf::Mouse::Left)
    {
         objArray.push_back( Main (wd,event.mouseButton.x,event.mouseButton.y));
 
        std::cout << "the left button was pressed" << std::endl;
        std::cout << "mouse x: " << event.mouseButton.x << std::endl;
        std::cout << "mouse y: " << event.mouseButton.y << std::endl;
    }
          }
    }
 
    window.clear(sf::Color::Black);
 
    if(objArray.size()>0)
    {
    for(int f=0;f<objArray.size();f++)
    {
        objArray[f].render();
    }
    }
 
    window.display();
}
 
return 0;
}

Вместо спрайтов белые квадраты, почему так?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2015, 22:08
Ответы с готовыми решениями:

SFML Sprite Trouble
Здравствуйте, возникла проблема в программе(пишу в SFML). Кратко: есть спрайт &quot;играть&quot;, нажимая на...

SFML в C::B пытается что-то найти в D:\sfml-release\ которого нет
Добрый день, вторые сутки пытаюсь подключить SFML библиотеку к C::B. При подключении по мануалу с...

D:\C++ Projekts\SFML\main.cpp [Error] SFML\Graphics.hpp: No such file or directory
Пытаюсь начать кодить на библиотеке SFML но при компиляции пучтого проэкта выдает ...

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

1
Неэпический
18099 / 10685 / 2061
Регистрация: 27.09.2012
Сообщений: 26,897
Записей в блоге: 1
14.09.2015, 03:55 2
Лучший ответ Сообщение было отмечено kaheu как решение

Решение

Цитата Сообщение от kaheu Посмотреть сообщение
Вместо спрайтов белые квадраты, почему так?
1) Нет конструктора копий, а значит после копирования (ну или после перемещения) s_hero объекта-приемника будет содержать указатель на t_hero объекта-источника и получится
в случае 1:
C++
1
2
3
4
5
vector<Main> objArray;
//... 
    Main mn (wd,100,100); //<-- Этот объект будет уничтожен незадолго до уничтожения вектора
    objArray.push_back(mn);//Здесь при копировании в новом объекте спрайт s_hero будет "ссылаться" на текстуру из объекта mn 
//Как написано выше, объект mn будет жить почти столько же, сколько и вектор, поэтому указатель в спрайте будет вылиден (с точки зрения объектной модели, но не с точки зрения логики) большую часть времени
в случае 2:
C++
1
2
3
objArray.push_back(Main (wd,100,100));//В новом объекте спрайт также будет "ссылаться" на текстуру из источника
//Источник в данном случае - временный объект, и он будет уничтожен в конце full-expression,
//так что указатель в спрайте окажется не валидный(на уничтоженный объект будет "указывать"), да и текстура будет выгружена.
в случае 3:
C++
1
objArray.push_back( Main (wd,event.mouseButton.x,event.mouseButton.y));//тоже самое, что и в случае 2
2) Нет проверок на успешность загрузки
3) Каждый раз загружать текстуру, да потом еще и её копированием заниматься - глупо. Текстура ресурс достаточно тяжелый.
4) Может немного сначала в плюсах освоиться?
1
14.09.2015, 03:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2015, 03:55
Помогаю со студенческими работами здесь

Возврат объекта Sprite из функции
Возврат объекта Sprite из функции. Подскажите, пожалуйста (всем привет). Есть функция: ...

Как изменить размеры sprite в px
Добрый день всем! допустим sprite.setTextureRect(IntRect(0, 0, 80, 80)); я создал спрайт с...

Qt + SFML
Вообщем скачал сорсы sfml собрал их cmake'om (в этот адресс &quot;F:\sfmllib\build&quot;) все собралось без...

Qt + SFML
Подключил библиотеку SFML к Qt, но при компиляции выдает ошибки: (Файл .pro и список ошибок) ...


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

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