Последние новости
Заявление о конфиденциальности "Vyacheslav Sustavov"
NoteKey приложение для Android получил функцию генерации паролей.
Набор кодеков K-Lite Codec обеспечит воспроизведение всех аудио и видео форматов на вашем компьютере.
Amazon выпустил свой бесплатный игровой движок.
Приложение "КапиталЪ" это мое второе приложение. Идея данного приложения у меня давно блуждала в голове. Теперь она реализована.

SFML и Qt - пишем первое приложение

Приветствую всех начинающих разработчиков игр!

Сегодня мы продолжаем изучать все тонкости создания игр с использованием библиотеки SFML и Qt.

Чем мы займемся на сегодняшнем занятии?

Вы может подумаете что будем опять что-то собирать или компилировать, но нет сегодня мы будем писать наше первое приложение.

  • Нам для этого потребуется подключить библиотеку SFML с Qt.
  • Написать связывающий класс SFML и Qt.
  • Написать тестовое приложение.

Перейдем от слов к делу. В прошлых уроках мы уже и из исходников специально для нашего компилятора MinGW.

Первое, что нам нужно сделать, это создать новый проект в Qt.

Создадим его выбрав в Qt Creator "Новый проект"

Новый проект

В открывшемся окне выбираем "Приложение Qt Widgets".

Приложение Qt Widgets

Назовем наше приложение"SFML-test".

SFML-test

Выбираем комплект с компилятором MinGW.

компилятор MinGW

После завершения работы мастера открывается окно с проектом.

Проект SFML-test состоит из следующих каталогов:

Qt Creator папки проекта
  • SFML-test (каталог проекта)
  • Заголовочные (каталог заголовочных файлов)
  • Исходники (каталог исходных файлов)
  • Формы (каталог форм проекта)

Теперь нам нужно подключить библиотеку SFML к Qt.

Для этого открываем файл SFML-test.pro и вносим в него изменения.

SFML-test.pro

Здесь нам нужно подключить библиотеку SFML. Для этого необходимо указать путь к файлам библиотеки Qt и SFML. Напишем следующий код:

LIBS+=-L"D:Program Files (x86)SFML232lib"

Теперь нужно указать используемые модули библиотеки SFML для «release» и «debug» конфигурации. Напишем следующий код:

CONFIG(release, debug|release): LIBS += -lsfml-audio -lsfml-graphics -lsfml-main -lsfml-network -lsfml-window -lsfml-system

CONFIG(debug, debug|release): LIBS += -lsfml-audio-d -lsfml-graphics-d -lsfml-main-d -lsfml-network-d -lsfml-window-d -lsfml-system-d

Следующее что нам нужно сделать это указать путь к каталогу с заголовочными файлами SFML библиотеки и зависимости необходимые при компиляции.

INCLUDEPATH+=D:Program Files (x86)SFML-2.3.2lib

DEPENDPATH+=D:Program Files (x86)SFML-2.3.2lib

Так должен выглядеть заполненный файл SFML-test.pro

заполненный SFML-test.pro

Все библиотеки подключены! Перейдем к написанию нашего первого приложения.

Добавим два заголовочных и исходных файла с именами «qtsfmlcanvas.h, qtsfmlcanvas.cpp» и «mycanvas.h, mycanvas.h».

Напишем код для файла «qtsfmlcanvas.h». Код выглядит следующим образом.

#ifndef QTSFMLCANVAS
#define QTSFMLCANVAS
#include < QWidget >
#include < SFML/Graphics.hpp >
#include < QTimer >
class QTSFMLCanvas : public QWidget, public sf::RenderWindow
{
//Q_OBJECT
public:
explicit QTSFMLCanvas(QWidget *parent, const QPoint& Position, const QSize& Size, unsigned int FrameTime = 0);
virtual void showEvent(QShowEvent*);
virtual QPaintEngine* paintEngine() const;
virtual void paintEvent(QPaintEvent*);
virtual ~QTSFMLCanvas();
virtual void OnInit();
virtual void OnUpdate();
private:
QTimer myTimer;
bool myInitialized;
};
#endif // QTSFMLCANVAS

Напишем код для файла «qtsfmlcanvas.cpp». Код выглядит следующим образом.

#include "qtsfmlcanvas.h"
#ifdef Q_WS_X11
#include < Qt/qx11info_x11.h >
#include < X11/Xlib.h >
#endif
#include < iostream >
QTSFMLCanvas::QTSFMLCanvas(QWidget* Parent, const QPoint& Position, const QSize& Size, unsigned int FrameTime) : QWidget(Parent), myInitialized (false)
{
// Setup some states to allow direct rendering into the widget
setAttribute(Qt::WA_PaintOnScreen);
setAttribute(Qt::WA_OpaquePaintEvent);
setAttribute(Qt::WA_NoSystemBackground);
// Set strong focus to enable keyboard events to be received
setFocusPolicy(Qt::StrongFocus);
// Setup the widget geometry
move(Position);
resize(Size);
// Setup the timer
myTimer.setInterval(FrameTime);
}
QTSFMLCanvas::~QTSFMLCanvas() {}
void QTSFMLCanvas::showEvent(QShowEvent*)
{
if (!myInitialized)
{
// Under X11, we need to flush the commands sent to the server to ensure that
// SFML will get an updated view of the windows
#ifdef Q_WS_X11
//XFlush(QX11Info::display());
#endif
// Create the SFML window with the widget handle
RenderWindow::create(reinterpret_cast((void *) winId()));
// Let the derived class do its specific stuff
OnInit();
// Setup the timer to trigger a refresh at specified framerate
connect(&myTimer, SIGNAL(timeout()), this, SLOT(repaint()));
myTimer.start();
myInitialized = true;
}
}
QPaintEngine* QTSFMLCanvas::paintEngine() const
{
return 0;
}
void QTSFMLCanvas::paintEvent(QPaintEvent*)
{
// Let the derived class do its specific stuff
OnUpdate();
// Display on screen
RenderWindow::display();
}
void QTSFMLCanvas::OnInit() {}
void QTSFMLCanvas::OnUpdate() {}

Перейдем к написанию следующего связующего класса «mycanvas.cpp mycanvas.h».

Напишем код для файла «mycanvas.h».

#ifndef MYCANVAS
#define MYCANVAS
#include "qtsfmlcanvas.h"
#include < SFML/Graphics.hpp >
class MyCanvas : public QTSFMLCanvas
{
public :
MyCanvas(QWidget* Parent, const QPoint& Position, const QSize& Size);
void OnInit();
void OnUpdate();
private :
sf::Clock myClock;
sf::Texture myImage;
sf::Sprite mySprite;
};
#endif // MYCANVAS

Напишем код для файла «mycanvas.cpp». Код выглядит следующим образом.

#include "mycanvas.h"
#include < iostream >
#include < string >
#include < Qtqdir.h >
MyCanvas::MyCanvas(QWidget* Parent, const QPoint& Position, const QSize& Size) : QTSFMLCanvas(Parent, Position, Size)
{
}
void MyCanvas::OnInit()
{
// Load the image
std::cout << "onInit" << std::endl;
QString dir = QDir::currentPath();
std::string utf8_text = dir.toUtf8().constData();
std::cout << "HELLO: " << utf8_text << std::endl;
if (!myImage.loadFromFile(utf8_text + "/sfml2.jpg")) {
std::cout << "Loading error"<< std::endl;
} else {
std::cout << "Image was loaded fine" << std::endl;
}
// Setup the sprite
mySprite.setTexture(myImage);
mySprite.setPosition(150, 150);
std::cout << "setting the texture of the sprite" << std::endl;
myClock.restart();
}
void MyCanvas::OnUpdate()
{
// Clear screen
RenderWindow::clear(sf::Color(0, 128, 0));
// Rotate the sprite
mySprite.rotate(myClock.getElapsedTime().asSeconds() * 100.f);
// Draw it
RenderWindow::draw(mySprite);
myClock.restart();
}

Связующие классы и процедуры мы написали.

Теперь напишем код который будет рисовать SFML окно. Для этого перейдем в файл main.cpp и добавим немного кода. Курсивным шрифтом выделен добавленный фрагмент кода.

#include "mainwindow.h"
#include < QApplication >
#include< mycanvas.h >
#include< QFrame >
int main(int argc, char *argv[])
{ QApplication a(argc, argv);
MainWindow w;
QFrame* MainFrame = new QFrame;
MainFrame->setWindowTitle("Qt SFML");
MainFrame->resize(400, 400);
MainFrame->show();
MyCanvas* SFMLView = new MyCanvas(MainFrame, QPoint(20, 20), QSize(560, 460));
SFMLView->show();
w.show();
return a.exec();
}

Теперь собираем проект и запускаем его. Нам остается добавить в папку с релизом все библиотеки используемые при разработке, а также файл «sfml2.jpg»

Вставь описание

Наслаждаемся вращением картинки.

Надеюсь данная статья была полезной и интересной, если есть пожелания, предложения и просто хотите сказать спасибо, пишите в комментариях или на почту gearsofgame@mail.ru.

Видео версия урока будет готова к концу этой недели.

А на сегодня я с вами прощаюсь.

Комментарии: