SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › SFML окно внутри окна виндовс на С++
В этой теме 5 ответов, 2 участника, последнее обновление KindRedSand 5 года/лет, 11 мес. назад.
-
АвторСообщения
-
Всем привет!
Мне интересно, возможно ли впихнуть окно SFML во внутрь окна WindowsForm(или какой нибудь аналог для C++)?
Я написал для своей игры, редактор тайл мапы. Задумка была такая, есть палитра с загружаемого спрайта, от куда копируются тайлы, а потом ими рисуем на карте. Хотелось бы это сделать таким образом, что бы сама карта была в одно окне, как вьюпорт в каком нить фотошопе, а палитра была как панель с боку. Но из за не хватки знаний SFML, С++ и программирования в целом, мне пришлось немного схитрить с этим. И я создал эту палитру как один большой спрайт.
Еще набросал в фотшопе пример того какой я бы хотел видеть свою программу
Вложения:
You must be logged in to view attached files.Я всё же не очень понял твою задумку. Если ты хочешь отдельно плавающее окно – используй второй RenderWindow в главном цикле. Если же ты хочешь всё распологать в одном окне – используй несколько View в каждом указываея viewport и делая отрисовку в окне с использованием каждого View.
Учти что тут задаётся множитель от 0 до 1 относительно размера окна.
Кнопочки на sf::Text особо проблем сделать не должно предоставить(text.getGlobalBounds().contain(Vector2f(Позиция курсора))).C++123456// Это заставит View использовать всё пространство// справа и до центра окна на всю высоту окнаtileMapView.setViewport(sf::FloatRect(0, 0, 0.5f, 1));// С центра и до левого края окна на всю высоту окнаtilePalitreView.setViewport(sf::FloatRect(0.5f, 0, 0.5f, 1));я хотел сделать что бы окно SFML было внутри windows Form, со всеми его кнопочками, чекбоксами и т.п. Но я не нашел примеров как связать SFML с ним и нашел альтернативу в виде QT))) Даже интегрировал его с Visual Studio, а то уж очень к ней привык)
Короче говоря, я почти сделал свою задумку, но программирования оно такое… решишь одну проблему и тут же появится другая(
Так что пока удалось просто запустить самую простенькую сцену
а мой предыдущий проект, который я показывал выше, сюда встроить мне не получается((( так как там я не много намудрил с некоторыми переменными и функциями… тоисть у меня там есть переменные, которые обьявлены вне функций и классов, это сделано для того, чтобы разные классы и функии в других хедерах имели к ним доступ. По другому я пока не умею, а QT проект ругается на такое, говоря что такие переменные уже определены, хотя я уже по всякому их переименовывал и даже создавал для них пространство имен.
Можешь использовать глобальные или статические переменные.
Для глобальной переменной:
В main.cpp или где-то ещё определяешь int *имя*; Где нужно получить к ней доступ: extern int *имя*;
Если нужен доступ к методу делаеться аналогично void foo(int Num) {} И где нужно получить доступ: extern void foo(int Num);
Кстати, если предполагаеться что переменная в вызове метода может быть не переданна(void foo2(int Num = 0, String str = “”)) то значение по умолчанию должно указываться в extern void foo2(int Num = 0, String str = “”); а не в реализации.
Статические просто определяются как static и обращение идёт как Class::переменная/метод.
А вобще лучше сделать класс или структуру которые будут содержать в себе эти вещи и пихнуть их реализацию в .cppСпасибо большое за ответ)))
Я как раз подумывал о последнем варианте, пока не увидел здесь ответ.Кстати пока писал это сообщения то успел попробовать эти варианты. И на глобальные переменные он также ругается как и на обычные, а со статиками норм.
Так вот получилось, что программирования я учил практически по примерам SFML, разве что самые основы, типа переменные и что это такое, я узнал с видео уроков по С++. И не успев дойти к классам я наткнулся на SFML и все остальное я учил уже по его примерам. Ну и если натыкался на какие то проблемы то сразу их гуглил в итоге знаю мало и код… ну там ваше ппц. Например проект qt сразу разделил классы на cpp и hpp, из-за чего я просто был в замешательстве, что и куда… а я всегда привык делать, так называемые встроенные классы и все гордить в 1 hpр. Тоисть 1 main.cpp и все остальное хедеры с их классами. Такой подход видимо нубский, но мне реально не удобно переписывать что то сразу в 2 файлах и постоянно играться с прототипами и их реализациями. По этому следуя своему кодексу нуба я взял и переделал сpp и hpp в 1 хедер, что по сути результат не изменило, но зато теперь у меня 2 хедера и я знаю как они устроены.
Ну в хидере всегда висит обьявление, в cpp реализация. Если тебе нужно хранить в классе какой либо другой класс или передовать его в метод используй forward declaration(Т.е. сразу после include выписать используемые классы но header содержащий этот класс подключить в cpp файле!)
C++12345678910//class1.h#include <iostream>class Class2//Здесь мы даём понять линковщику что о этом классе он узнает позже//По сути это уже можно назвать forward declarationclass Class1{public:void foo(Class2 in);//Мы обьявили метод, но его реализацию мы поместим в cpp файл}C++12345678//class2.h#include <iostream>class Class2{public:void foo2() { std::cout << "I summoned!" << std::endl}}C++1234567891011//class1.cpp#include "class1.h"#include "class2.h"void Class1::foo(Class2 in){std::cout << "Start summoning.." << std::end;in.foo2();//Если бы мы попытались вызвать метод в хидере - получили бы ошибку "Недопустимый не полынй тип"//При этом появляется возможность сделать два и более классов, которые могут включать в себя элементы друг друга//всё что о нас думает}Если работаешь из студии можешь использовать быстрые действия для генерации cpp файла.
Ну и на досуге стоит почитать это, да и любую другую литературу по плюсам. Хотя по сути я плюсы изучал по аналогии с тобой, вот только сам вопросы не кидал на форумы, а учился на чужих ошибках -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.