Реклама
20 сентября 2015 г. 16:08

QtКак написать игру на Qt - Урок 3. Взаимодействие с другими объектами

GameDev, QGraphicsItem, QGraphicsScene, QPainter, Qt, написать игру

После того, как в игре присутствует анимированная Муха , которая передвигается под воздействием клавиш клавиатуры, настало время добавить смысл в игру. Добавим цель Мухе , например, она будет поедать яблоки, которые будут подсчитываться. То есть необходимо настроить взаимодействие Мухи с другими объектами, в данном случае с яблоками.

Для яблок необходимо создать отдельный класс, который также будет отнаследован от QGraphicsItem. При создании яблоки должны иметь случайный цвет, что также будет инициализироваться в конструкторе класса яблок с помощью функции qrand() .

Когда Муха натыкается на яблоко, необходимо передавать данную информацию в ядро игры, которое находится в классе widget. Для этого будем при движении Мухи анализировать объекты, которые попадают в поле её зрения, и с которыми необходимо отработать взаимодействие.

    /* Производим проверку на то, наткнулась ли муха на какой-нибудь
     * элемент на графической сцене.
     * Для этого определяем небольшую область перед мухой,
     * в которой будем искать элементы
     * */
    QList<QGraphicsItem *> foundItems = scene()->items(QPolygonF()
                                                           << mapToScene(0, 0)
                                                           << mapToScene(-20, -20)
                                                           << mapToScene(20, -20));
    /* После чего проверяем все элементы.
     * Один из них будет сама Муха - с ней ничего не делаем.
     * А с остальными высылаем сигнал в ядро игры
     * */
    foreach (QGraphicsItem *item, foundItems) {
        if (item == this)
            continue;
        emit signalCheckItem(item);
    }
19 сентября 2015 г. 15:33

QtКак написать игру на Qt - Урок 2. Анимация героя игры (2D)

GameDev, QPainter, Qt, анимация, написать игру

Во втором уроке подойдём к следующему аспекту написания игры - Анимация героя игры. В прошлом уроке было рассмотрено, как управлять объектом на графической сцене, и главным героем выступал красный треугольник, но это не очень интересно. Поэтому превратим треугольник в одушевленный объект, а именно в Муху , которая будет ползать под управлением клавиатуры и двигать ножками при движении.

В данном уроке корректировка программного кода производилась в главным образом в файлах triangle.h, triangle.cpp и самую малость в файле widget.cpp.

Анимация Мухи по шагам

Опишем  алгоритм, по которому будет производиться отрисовка Мухи:

  1. Инициализируем в конструкторе класса переменную, которая будет отвечать за номер положения ножек. Всего будет три положения ножек мухи.
  2. Инициализируем в конструкторе класса переменную, которая будет считать полезные тики игрового таймера, то те тики, во время которых Муха передвигалась. Это необходимо, чтобы отсеять те тики, в которых не было движения Мухи , иначе Муха будет постоянно перебирать ножками, даже если мы не будем управлять Мухой .
  3. Отрисовываем Муху в методе paint, выбирая, какое из положений ножек мухи будет отрисовываться.
  4. В слоте, который обрабатывает событие отсчета игрового таймера производит накопление и обнуление счетчика полезных тиков игрового таймера и в зависимости от его величины устанавлвиваем положение ножек Мухи , а именно полностью перерисовываем Муху с нужным положением ножек.
18 сентября 2015 г. 14:54

QtКак написать игру на Qt - Урок 1. Управление объектом

GameDev, getasynckeystate, QGraphicsItem, QGraphicsScene, Qt, WinAPI, написать игру

С этого урока начинается серия статей о том, как написать игру на Qt. В предыдущей статье было рассказано о системе позиционирования графических элементов QGraphicsItem в графической сцене QGraphicsScene. Был нарисован треугольник и помещён в центр графической сцены, размеры которой были 500 на 500 пикселей. А теперь настало время этот треугольник оживить, а вернее начать им управлять.

Составим техническое задание урока:

  • В окне располагается графическая сцена с размерами 500 на 500 пикселей (это уже сделано в предыдущем уроке);
  • В центре графической сцены находится красный треугольник (что также уже сделано в прошлом уроке);
  • Треугольник должен перемещаться при нажатии клавиш со стрелками Up, Down, Left, Right;
  • Треугольник не должен выходит за пределы графической сцены, то есть должен быть ограничен размерами графической сцены.

Примечание. В данном проекте используется WinAPI, поэтому проект применим для использования в операционной системе Windows, а для Linux и MacOS применим лишь алгоритм, который используется в данном уроке. Поэтому если Вы желаете написать игру под эти ОС, то необходимо будет использовать библиотеки этих ОС для асинхронной обработки нажатия клавиш.

17 сентября 2015 г. 14:22

QtQt/C++ - Урок 019. Рисуем треугольник в Qt5. Позиционирование в QGraphicsScene

QGraphicsItem, QPainter, QPolygon, Qt, Qt5, Рисование Qt, Рисование Qt5, треугольник

Рисование интерфейсов, формирование таблиц баз данных, работа с сетью - это всё хорошо, но иногда хочется просто, что-нибудь нарисовать, например треугольник . А потом конечно же оживить этот объект, чтобы им можно было управлять, и в последствии превратить этот проект в маленькую игру. Ну кто не хочет написать собственную игру, даже самую простую?

Давайте тогда сделаем первый шаг в сторону простенькой игры, а именно разберемся с рисованием объектов в Qt, попробовав нарисовать треугольник .

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта "Треугольник"

Опишем структуру проекта, в котором будем рисовать треугольник:

  • Triangle.pro - профайл проекта, создается по умолчанию и в данном проекте не требует корректироваки;
  • main.cpp - файл, с которого стартует приложение, в данном файле вызывается widget, в котором будет располагаться графическая сцена с треугольником;
  • widget.h - заголовочный файл, вызываемого виджета с графической сценой;
  • widget.cpp - файл исходных кодов виджета;
  • triangle.h - заголовочный файл класса Треугольника , который наследован от QGraphicsItem;
  • triangle.cpp - файл исходных кодов класса Треугольник.
16 сентября 2015 г. 9:14

Технологии передачи данныхТехнология Frame Relay

Frame Relay, виртуальный канал

Зарождение технологии Frame Relay относится к концу 80-х годов. В это время всё большее распространение начали получать надёжные цифровые каналы систем плезиохронной и синхронной цифровых иерархий (PDH и SDH). Данные технологии предоставляли надежный высокоскоростной канал с низким уровнем помех и ошибок.

Стек протоколов X.25, который существовал до появления Frame Relay, включал в себя множество систем проверок на ошибки и восстановления данных, поскольку использовался в низкоскоростных каналах с большим уровнем помех. Но с приходом технологий PDH и SDH качество связи значительно улучшилось и отпала необходимость в сложной системе проверок, которая присутствовала в X.25. В итоге на смену данного стека протоколов пришла технология Frame Relay, которая обладала лишь необходимым минимумом для доставки информации от отправителя к получателю. Также прорывом данной технологии явилось то, что она предоставляла гарантированную пропускную способность, чего не могли предоставить ранние технологии.

15 сентября 2015 г. 15:44

QtQt/C++ - Урок 024. Сигналы и слоты в Qt5

Qt5, пример, example, сигнал, сигналы Qt, сигналы слоты Qt, сигналы слоты Qt5, слот, слоты Qt

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

Введение

При программировании GUI, когда изменяется один из виджетов, мы зачастую хотим, чтобы другие виджеты были об этом уведомлены. В общем случае, мы хотим, чтобы объекты могли взаимодействовать друг с другом. Например, если пользователь нажал кнопку Закрыть , мы вероятно захотим, чтобы объект window вызвал функцию close().

Другие инструменты разработки обеспечивают подобный функционал использованием callback. callback являет указателем на функцию, и если Вы хотите выполнить функцию, которая уведомит Вас о каком-либо событии, то Вы передаёте указатель на другую функцию, то есть callback. Работающая функция вызывает callback тогда, когда это уместно. В то время как существуют фреймворки, которые успешно используют callback функции, тем не менее callback являются неинтуитивным способом, который может вызывать проблемы с обеспечением корректности возвращаемых аргументов.

14 сентября 2015 г. 16:36

QtQt/C++ - Урок 018. QGraphicsItem - наследование и СЛОТы

QGraphicsItem, QGraphicsItem example, QGraphicsItem Qt, QGraphicsItem слот, Qt, множественное наследование

А теперь поговорим немного о наследовании от QGraphicsItem и применении системы СИГНАЛ ов и СЛОТ ов при взаимодействии с графическими объектами на графической сцене QGraphicsScene. В задачу данного урока входит создание приложения, в котором на графической сцене будет отображаться объект класса QGraphicsItem , по нажатию на который будет появляться диалоговое окно QMessageBox , сигнализирующее о событии нажатия на графический объект.

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта для работы с QGraphicsItem

В структура данного проекта входят:

  • TestPoint.pro - профайл проекта;
  • mainwindow.h - заголовочный файл основного окна приложения;
  • mainwindow.cpp - файл исходных кодов основного окна приложения;
  • mypoint.h - заголовочный код класса, отнаследованного от QGraphicsItem;
  • mypoint.cpp - соответственно исходный код;
  • main.cpp - основной файл, с которого стартует приложение, в уроке не рассматривается, поскольку создаётся по умолчанию;
  • mainwindow.ui - файл дизайна главного окна.
13 сентября 2015 г. 2:05

ПрограммыКак конвертировать mkv в avi

vlc, mkv, avi, конвертирование

"Как конвертировать mkv в avi?" - казалось бы заезженная тема, но и тут можно кое-что добавить. Вы не устали от того, что когда делаешь подобный запрос, то поисковики вываливают целые пачки неизвестно какого программного обеспечения, которое ещё ко всему предлагает установить дополнительный софт, сходит на какой-нибудь сайт, или установить что-нибудь вроде яндекс-бара. Лично я от этого уже устал. Поэтому хотелось бы предложить простой вариант, как конвертировать видео из формата .mkv в .avi, .webm, .mp4 и т.д. А также наоборот.

Этим вариантом является VLC-плеер , который справляется с этой задачей на отлично и при этом не имеет выше перечисленных минусов. А также обладает широким функционалом и замечательной поддержкой различный видео и аудио кодеков.

А теперь приступим к пошаговому руководству по конвертированию видео.

Как конвертировать mkv в avi

Шаг Первый

Для начала необходимо скачать и установить VLC-плеер. Скачивание производим с официального сайта, представленного на ссылке выше. Устанавливаем и запускаем.

12 сентября 2015 г. 16:12

QtQt/C++ - Урок 017. QGraphicsScene или как работать с графикой в Qt

QGraphicsScene, QGraphicsScene example, QGraphicsScene Qt5, QGraphicsScene пример, Qt

Начиная с этой статьи Мы приступаем к изучению графических библиотек Qt, а если быть точнее, QGraphicsScene. Данный класс предоставляет функционал по управлению большим количеством 2D объектов. QGraphicsScene устанавливается в QGraphicsView.

Опишем функционал, который необходимо будет реализовать в нашем приложении:

  • Добавление графической сцены в QGraphicsView.
  • Отрисовка двух объектов на графической сцене с помощью линий, а именно прямоугольника и квадрата.
  • Динамическое изменение размеров графической сцены в зависимости от изменения размеров QGraphicsView.
  • Динамическое изменение объектов на графической сцене в зависимости от размеров самой графической сцены.

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1.

Структура проекта для работы с QGraphicsScene

Структура проекта для работы с QGraphicsScene

К структуре проекта "по умолчанию" добавляется ещё один класс MyGraphicView.

Дело в том, что для удобства работы с QGraphicsScene было принято решение создать класс, который наследуется от QGraphicsView и уже внутри него работать с графической сценой и её объектами.

11 сентября 2015 г. 10:00

ВОЛСВОЛС - Урок 011. OTDR - Принцип действия оптических рефлектометров

fiber, волс, OTDR, рефлектометр

Импульсные рефлектометры OTDR  (Optical Time Domain Reflectometer) работают по аналогичному принципу, который используется в рефлектометрах для тестирования электрических кабелей. Рефлектометр подаёт мощный световой импульс в оптическое волокно , также как электрический рефлектометр подаёт мощный зондирующий импульс в электрический кабель. При этом осуществляется измерение мощности и времени запаздывания импульсов, которые возвращаются обратно в рефлектометр. Отличие электрического рефлектометра состоит в том, что металлический проводник возвращает лишь импульсы, которые были отражены от сильных неоднородностей в кабеле, то есть от мест деформации кабеля, тогда как оптическое волокно возвращает импульсы не только от мест больших неоднородностей, но также и за счёт эффекта рэлеевского рассеяния. Рэлеевское рассеяние возникает за счёт изменения показателя преломления оптического волокна при его вытяжке во время изготовления. Подобные неоднородности, возникающие при изготовлении оптического волокна крайне малы, но при этом оказывают некоторое влияние на рассеяние светового пучка, который рассеивается от данных неоднородностей во все стороны, в том числе и обратно к OTDR .

Прохождение светового пучка от OTDR по оптическому волокну
Реклама

Qt - Тест 001. Сигналы и слоты

  • Результат 5 баллов
  • Очки рейтинга -10

C++ - Тест 003. Условия и циклы

  • Результат 57 баллов
  • Очки рейтинга -2

C++ - Тест 003. Условия и циклы

  • Результат 7 баллов
  • Очки рейтинга -10
Последние комментарии
  • EVILEG
  • 7 декабря 2017 г. 9:47

Django - Урок 011. Добавление комментариев на сайт с Django

Визуальный пример чего? комментариев? При ответе на конкретный комментарий рядом с ником отвечающего будет стрелочка и указание ник другого пользователя. Который будет ссылкой на коммента...

  • Bernar
  • 7 декабря 2017 г. 9:24

Django - Урок 011. Добавление комментариев на сайт с Django

есть визуальный пример ?

  • EVILEG
  • 6 декабря 2017 г. 11:30

Django - Урок 011. Добавление комментариев на сайт с Django

Да, так будет даже лучше, я на сайте уже обновил до такого вида код Вот это уже не нужно if request.method == 'POST': Поскольку Вы и так используете метод post, то есть эта про...

  • Bernar
  • 6 декабря 2017 г. 11:19

Django - Урок 011. Добавление комментариев на сайт с Django

сделал немного по другому class EArticleView(View): template_name = 'knowledge/article.html' comment_form = CommentForm def get(self, request, *args, **kwargs): ...

Сейчас обсуждают на форуме
  • Миша
  • 15 декабря 2017 г. 11:26

Как найти в QVector макс и мин

Спасибо

  • Galant
  • 14 декабря 2017 г. 19:58

LPT

Понял! Спасибо!

  • EVILEG
  • 14 декабря 2017 г. 13:38

QCustomPlot можно ли построить прерывистую линию на одном графике?

Во-первых: В pro файле проект по идее достаточно указать следующий define для включения возможности рендеринга через OpenGL DEFINES += QCUSTOMPLOT_USE_OPENGL И во вторых:...

  • EVILEG
  • 13 декабря 2017 г. 8:05

В многопоточности выполнять действие только в одном из потоков

Статическиe методs QThread::currentThread(); и QThread::currentThreadId() могут возвращать указатель на поток и его handle id соответственно. Можете попробовать через как...

  • EVILEG
  • 13 декабря 2017 г. 7:57

А что по поводу авторизации ?

Наличие токена - это правильный подход. Например, у меня на сайте в каждой форме есть токен, чтобы не было возможности подделки запросов. Что касается SSL, то стоит поискать информацию н...