Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 21.11.2015
Сообщений: 217
1

SFML: Как сделать чтобы каждая буква отдельно выходила из разной точки и собиралась в одно слово?

16.03.2016, 23:02. Просмотров 1324. Ответов 12
Метки нет (Все метки)

скажите пожалуйста можно ли сделать так чтоб каждая буква отдельно выходила из разной точки и собиралась в одно слово??? желательно с примером)(хотя бы 2 буквы)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2016, 23:02
Ответы с готовыми решениями:

Как сделать, чтобы ссылки были обрамлены тегом h3 - каждая отдельно
Это для примера. Мне нельзя более ничего нарушать в порядке. Спасибо заранее. <div...

Написать слово, так чтобы каждая буква была разным цветом
Помогите пожалуйста: 1. Написать слово, так чтобы каждая буква была разным цветом. 2. Создать...

Как сделать, чтобы в RTF после точки писалась большая буква?
Как сделать, чтобы в RTF после точки писалась большая буква? Если можно примерчик.

Как в примере кода сделать так, чтобы страничка при изменении масштаба собиралась в середину?
Здравствуйте, решил попрактиковаться в стилях и вроде как сделал страничку, но не так, как...

12
Грамотный. Безпорно.
16860 / 9756 / 1880
Регистрация: 27.09.2012
Сообщений: 24,168
Записей в блоге: 2
17.03.2016, 04:17 2
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Светлана Слонь,
была ночь, но делать было нефиг.
Начал клепать, захотел спать,
потом меня отвлекли хорошенько,
затем я еще больше спать захотел,
голова уже раскалывалась.
Продолжил писать, но в силу обстоятельств,
думать было совсем не охота,
поэтому всё было сделано тяп-ляп,
решение не расширяемое, и не гибкое,
почти везде одна магия,
так еще, естественно, ошибки закрались.
Вроде поправил, понаставив костылей,
а потом костылям понадобились костыли, и т.д.
Короче, говнокод под спойлером, скорее всего может с ошибками.
Кликните здесь для просмотра всего текста
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
#include <cstdlib>
#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <tuple>
 
#include <SFML/Graphics.hpp>
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <SFML/Graphics/Font.hpp>
#include <SFML/Graphics/Glyph.hpp>
#include <SFML/Graphics/Drawable.hpp>
#include <SFML/Graphics/Transformable.hpp>
#include <SFML/Graphics/VertexArray.hpp>
#include <SFML/Graphics/RenderStates.hpp>
#include <SFML/Graphics/RenderTarget.hpp>
 
class Symbol
    : public sf::Drawable
    , public sf::Transformable
{
public:
    Symbol()
        : m_vertices(sf::Triangles)
        , m_font()
        , m_char()
        , m_charSize()
        , m_color()
        , m_bounds()
        , m_needUpdate(true)
    {
    }
 
    void setFont(const sf::Font& fnt)
    {
        m_font = &fnt;
        m_needUpdate = true;
    }
 
    void setChar(sf::Uint32 value)
    {
        m_char = value;
        m_needUpdate = true;
    }
 
    void setCharSize(int size)
    {
        m_charSize = size;
        m_needUpdate = true;
    }
 
 
    void setColor(sf::Color color)
    {
        m_color = color;
        m_needUpdate = true;
    }
 
    sf::Uint32 getChar() const
    {
        return m_char;
    }
 
 
    void draw(sf::RenderTarget &target, sf::RenderStates states) const override
    {
        updateGeometry();
        states.transform *= getTransform();
        states.texture = &m_font->getTexture(m_charSize);
        target.draw(m_vertices, states);
    }
 
 
    sf::FloatRect getLocalBounds() const
    {
        updateGeometry();
        return m_bounds;
    }
 
 
    sf::FloatRect getGlobalBounds() const
    {
        return getTransform().transformRect(getLocalBounds());
    }
 
private:
    void updateGeometry() const
    {
        if(!m_needUpdate){
            return;
        }
        m_vertices.clear();
        m_needUpdate = false;
        const sf::Glyph &glyph = m_font->getGlyph(m_char, m_charSize, false);
 
        if(m_char == L' '){
            m_bounds.left = static_cast<float>(glyph.bounds.left);
            m_bounds.top = static_cast<float>(glyph.bounds.top);
            m_bounds.width = static_cast<float>(m_font->getGlyph(m_char, m_charSize, false).advance);
            m_bounds.height = static_cast<float>(m_font->getLineSpacing(m_charSize));
            return;
        }
 
 
        m_bounds.left = static_cast<float>(glyph.bounds.left);
        m_bounds.top = static_cast<float>(glyph.bounds.top);
        m_bounds.width = static_cast<float>(glyph.bounds.width);
        m_bounds.height = static_cast<float>(glyph.bounds.height);
 
        float left = static_cast<float>(glyph.bounds.left);
        float top = static_cast<float>(glyph.bounds.top);
        float right = static_cast<float>(glyph.bounds.width+glyph.bounds.left);
        float bottom = static_cast<float>(glyph.bounds.height+glyph.bounds.top);
 
 
        float l = static_cast<float>(glyph.textureRect.left);
        float t = static_cast<float>(glyph.textureRect.top);
        float r = static_cast<float>(glyph.textureRect.left + glyph.textureRect.width);
        float b = static_cast<float>(glyph.textureRect.top  + glyph.textureRect.height);
 
        m_vertices.append(sf::Vertex(sf::Vector2f(left,top), m_color, sf::Vector2f(l, t)));
        m_vertices.append(sf::Vertex(sf::Vector2f(right, top), m_color, sf::Vector2f(r, t)));
        m_vertices.append(sf::Vertex(sf::Vector2f(left, bottom), m_color, sf::Vector2f(l, b)));
        m_vertices.append(sf::Vertex(sf::Vector2f(left,bottom), m_color, sf::Vector2f(l, b)));
        m_vertices.append(sf::Vertex(sf::Vector2f(right, top), m_color, sf::Vector2f(r, t)));
        m_vertices.append(sf::Vertex(sf::Vector2f(right, bottom), m_color, sf::Vector2f(r, b)));
    }
 
    mutable sf::VertexArray m_vertices;
    const sf::Font *m_font;
    sf::Uint32 m_char;
    int m_charSize;
    sf::Color m_color;
    mutable sf::FloatRect m_bounds;
    mutable bool m_needUpdate;
};
 
 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
 
 
 
constexpr float PI = 3.141592;
 
 
 
int get_random(int min, int max)
{
    static std::mt19937 gen(std::chrono::system_clock::now().time_since_epoch().count());
    if(max<min)
        std::swap(min, max);
    std::uniform_int_distribution<int> dist(min, max);
    return dist(gen);
}
 
 
 
class Linear
{
public:
    Linear(float angle, float speed, const sf::Vector2f& sV = sf::Vector2f(1.f,0.f))
        : m_moveVector()
    {
        angle *= PI/180.0f;
        m_moveVector.x = sV.x*cos(angle) - sV.y*sin(angle);
        m_moveVector.y = sV.x*sin(angle) + sV.y*cos(angle);
        m_moveVector *= speed;
    }
 
 
    Linear(const sf::Vector2f& start, const sf::Vector2f& finish, float speed)
        : m_moveVector(finish-start)
    {
        normalize(m_moveVector);
        m_moveVector *= speed;
    }
 
 
    sf::Vector2f operator()(const sf::Vector2f& pos){
        return pos + m_moveVector;
    }
 
    sf::Vector2f getMoveVector() const
    {
        return m_moveVector;
    }
 
private:
    void normalize(sf::Vector2f &vec){
        float len = sqrt(vec.x*vec.x + vec.y*vec.y);
        vec.x /= len;
        vec.y /=len;
    }
 
    sf::Vector2f m_moveVector;
};
 
 
 
 
class RandomMovedString : public sf::Drawable
{
public:
    RandomMovedString(sf::String str, const sf::Font& fnt, int size, sf::Vector2f end_pos)
    {
        Symbol sym;
        sym.setCharSize(size);
        sym.setFont(fnt);
        for(auto e: str){
            sym.setChar(e);
            sym.setPosition(get_random(1, 800), get_random(1, 600));
            auto bound = sym.getLocalBounds();
            sf::Vector2f pos(end_pos.x+bound.left, end_pos.y+bound.top);
            Linear lin(sym.getPosition(), end_pos, 3.0f);
            m_data.emplace_back(sym, lin, end_pos, true);
            end_pos.x += bound.width+bound.left;
        }
    }
 
    void update()
    {
        for(auto& e: m_data){
            if(std::get<3>(e)){
                sf::Vector2f new_pos(std::get<0>(e).getPosition());
                auto x_s = new_pos.x-std::get<2>(e).x;
                auto y_s = new_pos.y-std::get<2>(e).y;
 
                auto len = x_s * x_s + y_s * y_s;
 
                auto x_ms = std::get<1>(e).getMoveVector().x;
                auto y_ms = std::get<1>(e).getMoveVector().y;
 
                float speed = x_ms * x_ms + y_ms * y_ms;
                if(len < speed){
                    new_pos = std::get<2>(e);
                    std::get<3>(e) = false;
                }else{
                    new_pos = std::get<1>(e)(new_pos);
                }
                std::get<0>(e).setPosition(new_pos);
            }
        }
    }
 
    void draw(sf::RenderTarget &target, sf::RenderStates states) const override
    {
        (void)states;
        for(const auto& e: m_data){
            std::get<0>(e).draw(target, states);
        }
    }
 
private:
 
    mutable std::vector<std::tuple<Symbol, Linear, sf::Vector2f, bool>> m_data;
};
 
 
 
 
 
int main()
{
    constexpr size_t update_rate = 60;
    constexpr float diff_time = 1.0f/update_rate;
    const sf::Time update_time = sf::seconds(diff_time);
 
    sf::Font font;
    if(!font.loadFromFile("/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf")){
        return EXIT_FAILURE;
    }
    RandomMovedString str(L"Для пользователя Светлана Слонь с cyberforum.ru", font, 32, sf::Vector2f(0,300));
 
    sf::RenderWindow wnd(sf::VideoMode(800, 600), "SFML");
    wnd.setFramerateLimit(update_rate);
 
    sf::Clock clock;
    sf::Time lastTime = clock.restart();
    while(wnd.isOpen()){
        sf::Event event;
        while(wnd.pollEvent(event)){
            if(event.type == sf::Event::Closed){
                wnd.close();
            }
        }
 
 
 
        sf::Time nowTime = clock.restart()+lastTime;
        while(nowTime >= update_time){
            str.update();
            nowTime -= update_time;
        }
        lastTime = nowTime;
 
 
 
        wnd.clear(sf::Color::Cyan);
 
        wnd.draw(str);
 
        wnd.display();
 
 
    }
 
}
видео с результатом

7
rikimaru2013
17.03.2016, 11:17
  #3

Не по теме:

Croessmah, увидить гавкокод от эксперта с++ - это как увидить сапожника без сапог! Это бесценно! Сделаю скрин на память )))))

0
Croessmah
17.03.2016, 14:06
  #4

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
увидить гавкокод от эксперта с++
эт дааа :)
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Это бесценно! Сделаю скрин на память
Покажете? Я тоже хочу посмотреть где Вы такое нарыли.

0
GbaLog-
17.03.2016, 14:19
  #5

Не по теме:

rikimaru2013, Croessmah не состоит в банде экспертов С++. :D

0
rikimaru2013
17.03.2016, 14:37
  #6

Не по теме:

GbaLog-, зато он сердцем с ними))

0
Croessmah
17.03.2016, 14:52
  #7

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
зато он сердцем с ними
неа :no:

0
0 / 0 / 1
Регистрация: 21.11.2015
Сообщений: 217
17.03.2016, 22:50  [ТС] 8
Croessmah, спасибо)))

Добавлено через 6 часов 1 минуту
а вы мне можете объяснить код?
0
Croessmah
17.03.2016, 23:25
  #9

Не по теме:

Цитата Сообщение от Светлана Слонь Посмотреть сообщение
а вы мне можете объяснить код?
лень, чес слово :)

0
0 / 0 / 1
Регистрация: 21.11.2015
Сообщений: 217
18.03.2016, 00:45  [ТС] 10
((((((((((пожаааааалуйста
0
0 / 0 / 1
Регистрация: 21.11.2015
Сообщений: 217
19.03.2016, 22:58  [ТС] 11
Croessmah, а где скачать #include <chrono>???
я не найду прост((((((
0
10 / 10 / 0
Регистрация: 04.03.2013
Сообщений: 661
19.03.2016, 23:47 12
Цитата Сообщение от Светлана Слонь Посмотреть сообщение
а где скачать #include <chrono>???
в VS он есть по стандарту, по крайней мере в 2015
В других компиляторах тоже должен быть, тк стандарт http://www.cplusplus.com/reference/chrono/
0
0 / 0 / 1
Регистрация: 21.11.2015
Сообщений: 217
20.03.2016, 00:55  [ТС] 13
спасибо)))

Добавлено через 52 минуты
у меня 10 стоит
15 не скачался(((
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2016, 00:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как сделать, чтобы Форма2 не выходила за границы Формы1?
В проекте 2 формы. При нажатии на кнопку появляется Form2 как сделать: 1. Что бы форма2...

Расположить слова так, чтобы буква, на которую заканчивается слово, была такой же, как первая буква следующего слова
Даны простые слова. Нужно составить такой порядок, чтобы буква на которую заканчивается слово была...

Как сделать чтобы по нажатию на кнопку чтобы выводилась буква и тд? в этом совсем не шарю а нужно сделать клавиатуру
Вообще 1 день работаю с делфи а завтра сдавать практику, хелп ми)

Как сделать что бы не каждая строка выводилась, а только одно значение?
Как сделать что бы не каждая строка выводилась, а только одно значение using System; using...

Каждая буква входит в слово не менее двух раз
Используя класс string, решить задание: Дана строка. Между соседними словами - не менее одного...

Каждая буква входит в слово не менее двух раз (на си)
Дана строка, состоящая из слов, разделенных пробелами (одним или несколькими). Напечатать все...


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

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

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