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

SFML. Как сделать увеличение/уменьшение камеры на колёсико мыши?

13.05.2020, 19:57. Показов 4479. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
SFML. Как сделать увеличение/уменьшение масштаба камеры на колёсико мыши?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2020, 19:57
Ответы с готовыми решениями:

Как сделать увеличение/уменьшение суммы платежа и ее отображение?
Есть приложение на c sharp. (красная линия) Никак не могу понять как сделать так, чтобы при...

Как повесить функцию на колесико мыши?
как отследить колесико мыши и как повесить на него функцию

Как заставить колесико мыши прокручивать форму, а не записи?
Добрый день уважаемые форумчане! Может кто-нибудь сталкивался с такой проблемой: колесико мыши...

Плавное увеличение и цикл увеличение/уменьшение
Приветствую! Подскажите пожалуйста: Пи старте сцене у объекта по оси X, Scale равняется 0 т.е....

12
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
14.05.2020, 08:11 2
Лучший ответ Сообщение было отмечено Baderov как решение

Решение

Baderov,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//...
sf::View camera;
//...
// в цикле обработке событий
if (event.type == sf::Event::MouseWheelScrolled)
{
    if (event.mouseWheelScroll.delta < 0)
        camera.zoom(1.1f); // нужный фактор масштабирования сам подберёшь
    else if (event.mouseWheelScroll.delta > 0)
        camera.zoom(0.9f);
}
//...
// перед командами рисования
window.setView(camera);
//...
3
0 / 0 / 0
Регистрация: 12.05.2020
Сообщений: 41
14.05.2020, 17:00  [ТС] 3
zayats80888,
Благодарю, можешь еще пожалуйста объяснить, что значит буква f тут -> (1.1f) ? и почему именно 1.1?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
14.05.2020, 17:23 4
Цитата Сообщение от Baderov Посмотреть сообщение
буква f тут
это значит явно указать что ты используешь float значение
Цитата Сообщение от Baderov Посмотреть сообщение
и почему именно 1.1?
потому что он так значение поставил таким образом можно поставить свое
2
0 / 0 / 0
Регистрация: 12.05.2020
Сообщений: 41
14.05.2020, 17:26  [ТС] 5
Antikl, Спасибо!
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
14.05.2020, 17:35 6
Цитата Сообщение от Baderov Посмотреть сообщение
и почему именно 1.1?
масштабирование(scale) - относительная операция.
Базовое значение всегда 1.
Применяется умножение - scale = scale * factor
Т.е. если умножаешь на factor > 1 - то увличиваешь, factor < 1 - уменьшаешь.
Я выбрал +-10%.
1
0 / 0 / 0
Регистрация: 12.05.2020
Сообщений: 41
14.05.2020, 17:40  [ТС] 7
zayats80888, понятно, спасибо)
0
2 / 2 / 0
Регистрация: 15.03.2021
Сообщений: 81
26.11.2021, 12:46 8
zayats80888, а можно ли как-то сделать что бы менялось только при прокрутке, а не что бы прокрутил 1 раз и оно продолжало увеличивать или уменьшать
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
26.11.2021, 12:57 9
Цитата Сообщение от vokir Посмотреть сообщение
а не что бы прокрутил 1 раз и оно продолжало увеличивать или уменьшать
код покаж
0
2 / 2 / 0
Регистрация: 15.03.2021
Сообщений: 81
26.11.2021, 14:04 10
zayats80888,
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
#include <SFML/Graphics.hpp>
#include <windows.h>
#include <iostream>
 
using namespace sf;
 
int main()
{
    double k = 50.0f;
    int w = 1000;
    int h = 1000;
    float speed = 100.0f;
    Clock timer;
    float x_centre = w / 2 - k;
    float y_centre = h / 2 - k;
    sf::RenderWindow window(sf::VideoMode(w, h), "Figure");
    sf::View view(sf::FloatRect(0, 0, w, h));
    sf::CircleShape shape(k);
    Vector2f position = shape.getPosition();
    shape.setFillColor(sf::Color::Black);
    shape.setPosition(x_centre, y_centre);
    sf::View camera;
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        
        if (event.type == sf::Event::MouseWheelScrolled)
        {
            if (event.mouseWheelScroll.delta < 0)
                camera.zoom(1.01f); 
            else if (event.mouseWheelScroll.delta > 0)
                camera.zoom(0.99f);
        }
        window.setView(camera);
        window.clear(sf::Color::White);
        window.draw(shape);
        window.display();
    }
    return 0;
}
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
26.11.2021, 14:20 11
vokir, строки 32-38 должны быть в теле цикла в строках 26-30
В примере из поста 2 в строке 4 есть комментарий, где это должно быть.

Цитата Сообщение от vokir Посмотреть сообщение
sf::View view(sf::FloatRect(0, 0, w, h));
Это зачем?
Цитата Сообщение от vokir Посмотреть сообщение
sf::View camera;
Инициализировать нужно:
C++
1
sf::View camera = window.getView();
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
26.11.2021, 16:04 12
Цитата Сообщение от zayats80888 Посмотреть сообщение
if (event.mouseWheelScroll.delta < 0)
        camera.zoom(1.1f); // нужный фактор масштабирования сам подберёшь
    else if (event.mouseWheelScroll.delta > 0)
        camera.zoom(0.9f);
Что-то я не помню, в SFML zoom не от текущего размера берется?
1 * 1.1 == 1.1, но 1.1 * 0.9 == 0.99, т.е. к начальному масштабу мы не возвращаемся.
0
6105 / 3460 / 1406
Регистрация: 07.02.2019
Сообщений: 8,799
26.11.2021, 17:07 13
Цитата Сообщение от Croessmah Посмотреть сообщение
т.е. к начальному масштабу мы не возвращаемся.
Ну да, правильно, я округлил просто отношение 1 / 1,1.
0
26.11.2021, 17:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.11.2021, 17:07
Помогаю со студенческими работами здесь

Как написать функцию увеличение\уменьшение в TrackBar (Builder)
void __fastcall TForm1::TrackBar1Change(TObject *Sender) { // нужно, чтобы...

Как сдлелать увеличение и уменьшение громкость спомощью trackBar
Здраствуйте, подскажите пожалуйста как сдлелать увеличение и уменьшение громкость спомощью...

Как отцентровать форму по положению курсора мыши при нажатии на колесико или ПКМ+ЛКМ?
При щелчке центральной клавиши мыши или обоих крайних клавишей форма центрируется по указателю...

Увеличение/уменьшение проецируемого изображения, как правильно реализовать. Посоветуйте
Доброго времени суток! Есть лазерная указка, с насадкой. Если посветить на стену например с 2-3...

Колёсико мыши
Где и какой код вставить для прокрутки колёсиком, пытался разными способами но выдаёт &quot;expected '='...

Колёсико мыши
Пишу код: if (e.KeyCode == Keys./*Колёсико мыши вверх*/) Как называется колёсико мыши в...


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

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