© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
17 октября 2015 г. 10:42

Графика и ДизайнКак нарисовать sprite sheet в Adobe Illustrator

adobe, adobe illustrator, sprite sheet, sprite, спрайт

Мне надоело тестировать процессы GameDev с помощью треугольников и прямоугольников. Это скучно и не интересно, поэтому настало время что-нибудь взорвать. Но с чего начать? - спросите Вы. А я отвечу, нужно нарисовать sprite взрыва, если быть точным, то нарисовать sprite sheet для взрыва, который будет представлять анимацию взрыва.

Но как это сделать? - этим вопросом озадачился я. После изучения нескольких форумов и видеоуроков, я решил собрать полученную информацию в один урок на своём сайте. Итак у нас следующее технической задание на этот урок:

  1. Нарисовать несколько sprite картинок, из которых мы сделаем sprite sheet для анимации взрыва;
  2. Собрать сам sprite sheet и сохранить его в PNG файл;
  3. Сделать всё это, используя ПО Adove Illustrator .
16 октября 2015 г. 16:25

QtQt/C++ - Урок 025. Создание проекта файлов для сборки утилитой qmake

sources, headers, qt, config, libs, qt5, qmake

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

Элементы проектного файла

Формат проектного файла используемый qmake может быть использован для поддержки как простых, так и довольно сложных систем. Простой проект файлов использует простой декларативный стиль, объявляющий переменные идентифицирующие исходные и заголовочные файлы в проекте. Комплексные проекты могут использовать структуры потоков для управления процессом сборки.

Переменные

В проектном файле, переменные используются для хранения списка строк. В простейшем проекте, эти переменные информируют qmake о настройке параметров для использования, или поставляют имена файлов и используемых путей в процессе сборки.

qmake ищет эти переменные в каждом проектном файле, и используется содержимой для определения того, что должно быть записано в Makefile. Например, список значений в переменных HEADERS и SOURCES используются для уведомления qmake об исходных и заголовочных файлах в некоторых директориях.

Переменные могут также использоваться внутри для хранения временных списков значений, а существующие списки значения могут быть перезаписаны или расширены новыми значениями.

Присваивание списка значений переменной:

HEADERS = mainwindow.h paintwidget.h

Список значений переменных расширяется следующим образом:

SOURCES = main.cpp mainwindow.cpp \
          paintwidget.cpp
CONFIG += console

Примечание: Первое задание значений включает только те значения, которые указаны в одной строке с переменной HEADERS. Второе объявление разделяет значения как в переменной SOURCES через обратный слеш ("\").

Переменная CONFIG является другой специальной переменной, которая используется qmake, когда генерируется Makefile.

15 октября 2015 г. 16:05

QMLQML - Урок 004. Сигналы и слоты в Qt QML

connections, example, qml, qml урок, qt, qt qml, qt урок, signal qml, slot qml, сигналы и слоты qml

А вот мы и добрались до передачи данных между слоем QML и слоем C++. Честно говоря, принцип настолько же простой, как и просто использование сигналов и слотов в одном слое C++. Особенно в Qt 5.5.

Пример будет показан на основе программного кода из предыдущего урока , где мы создали диалоговое окно. Но скриншотов примера работы на Android не будет показано, но заверяю Вас - Всё работает как швейцарские часы.

Структура проекта с QML

структура проекта с qml

По сравнению с предыдущим уроком, у нас появились некоторые изменения. А именно, добавился новый класс, который будет являться ядром приложения.

  • appcore.h - заголовочный файл ядра приложения;
  • appcore.cpp - файл исходных кодов ядра приложения.

А продолжать работать мы также будем с QQMLApplicationEngine. Нужно будет просто взять от движка QML контекст и загрузить в него объект нового класса, от которого будут поступать сигналы и в который будут передаваться данные.

13 октября 2015 г. 15:37

QMLQML - Урок 003. Custom Dialog in QML Android

custom dialog, dialog android, qml custom dialog, qml custom dialog example, qml dialog android, qt, qt android, qt qml dialog

После того, как Мы сделали кастомизированные кнопки в предыдущем уроке , настало время сделать Custom Dialog , который будет выглядеть более нативно для Android устройства, а может даже и смахивать по дизайну на IOS устройство. Во всяком случае Вы сможете более основательно подойди к реализации гайдов этих устройств.

Для создания диалога будет использоваться объект Dialog из библиотеки QtQuick.Dialog . А нюанс при работе с Custom Dialog под Android заключается в том, что Стандартные Кнопки, которые адекватно выглядят при разработке под Desktop, под Android выглядят вырвиглазно, да и ещё их проблематично кастомизировать для начинающего разработчика. Проще реализовать собственные кнопки с собственной стилизацией.

Разработка Custom Dialog

Разработку кастомизированного диалога продолжим на основе проекта из предыдущего урока. Там у нас были созданы две Custom Button , которые мы немного подправим по цветовой гамме, чтобы они лаконично выглядели по отношению к Диалогу. А также, используя прием по их стилизации, стилизуем кнопки диалогового окна, в которому будут присутствовать две кнопки: "OK" и "Cancel". Эти кнопки будут закрывать диалог.

Кнопки диалогового окна нужно будет прибить к нижней части диалога, а остальную часть отдадим под сообщение "Hello, World!!!", а также разделим кнопки серой линией друг с другом, и такой же линией отделим эти кнопки от сообщения. Будет похоже немного на IOS диалог. В качестве линии будет выступать прямоугольник Rectangle, такой же приём применяется и при разработке под Android на Java , только вместо QML используется XML вёрстка.

Для того, чтобы сделать нормальное кастомизированное содержимое диалогового окна, необходимо задать его параметру contentItem тот объект, который заменит содержимое. Наиболее удобным объектом является Rectangle , а уже в нём будем размещать все остальные объекты. Естественно никаких стандартных кнопок там уже и в помине не будет, так что можете о них забыть, но это не большая потеря на самом деле.

12 октября 2015 г. 15:15

QMLQML - Урок 002. Custom Button in QML Android

Android, qml, qml button, qml button android, qml custom button, qml custom button android, qt, qt qml

Начну серию уроков по QML Android с кастомизации кнопки, или правильнее сказать со стилизации , поскольку в данном случае такой термин подходит больше. Мы не будем вызывать диалоговые окна в данном уроке, а просто сделаем свой QML Cutom Button , который будет менять цвет при нажатии на него. А для наглядности таких кнопок будет две.

Первая кнопка будет красного цвета с черным ободком и чёрным текстом, а при нажатии она будет менять цвет фона на черный с красным ободком и красным цветом. А вторая кнопка будет иметь те же цвета, но в противоположной последовательности.

Структура проекта QML Custom Button

Проект создаётся в QtCreator как проект приложения Qt Quick с элементами Quick Controls. Фактически там уже будет менюбар, несколько диалогов и пара кнопок. Так вот, выкидываем всё, кроме двух кнопок и поехали их кастомизировать.

А структура проекта в данном случае получится следующая:

  • QMLCutomButton.pro - Знакомый нам профайл проекта;
  • deployment.pri - файл для установки исходного кода на устройство;
  • main.cpp - давно знакомый стартовый файл приложения
  • qml.qrc - файл ресурсов проекта, там и складируются qml файлы
  • main.qml - файл qml главного окна приложения
  • MainForm.ui.qml - и опять ресурсный файл дизайнера, да простят меня хардкорщики. В нём и будут прятаться кнопки. Проект создавался под минимальную версию Qt 5.5.
8 октября 2015 г. 17:03

QtGameDev на Qt - Урок 4. Обнаружение коллизий в Qt (2D)

GameDev, Qt, Collision, Коллизия

Обнаружение коллизий является одним из важных аспектов в GameDev . Поскольку к коллизиям относится абсолютно всё: попадание пуль в противника, попадание пуль в вашего героя, пересечение тела героя со стенами, пересечение тела героя с противниками и т.д. И важным моментов является то, что герой не должен застрять в инородном объекте, впрочем как и любой другой объект, а должен в самом простом варианте оттолкнуться от него, чтобы остаться на месте. Именно для этих целей и служит обнаружение коллизий.

7 октября 2015 г. 15:26

QtQt/C++ - Урок 023. Перетаскивание QGraphicsItem на QGraphicsScene мышью

QGraphicsScene, Qt, Qt урок, перетаскивание, QGraphicsItem

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

Давайте разберёмся, как это сделать.

Структура проекта

Для демонстрации примера создаём новый проект и добавляем в него новый класс, отнаследованный от QGraphicsItem .

  • MoveGraphicsItem.pro - профайл проекта;
  • main.cpp - запускающий файл;
  • widget.h - заголовочный файл главного окна;
  • widget.cpp - файл исходных кодов главного окна;
  • moveitem.h - заголовочный файл графического элемента;
  • moveitem.cpp - файл исходных кодов графического элемента.
  • widget.ui - форма главного окна.
6 октября 2015 г. 17:13

QtQt WinAPI - Урок 007. Работаем с ICMP Ping в Qt

WinAPI, Qt, ICMP, PING

Сходу хочу расстроить Вас, Дорогой Читатель. Qt не обладает функционалом для работы с протоколом ICMP и соответственно придется использовать для этих целей API целевой операционной системы. Впрочем, это не удивительно. Протокол ICMP является низкоуровневым протоколом, и для работы с ним требуется использование сырых сокетов, которые не реализованы в Qt .

Но это не является особой проблемой, поскольку в основных целевых платформах имеется необходимый API для реализации ping посылок. Например Microsoft предоставляет простое использование ICMP протокола на основе функции IcmpSendEcho.

Описание IcmpSendEcho

Функция IcmpSendEcho отсылает эхо запросы IPv4 ICMP и возвращает ответы на эхо запросы. Вызов возвращается когда выходит время ожидания или заполняется буфер ответа.

DWORD IcmpSendEcho(
  _In_     HANDLE                 IcmpHandle,
  _In_     IPAddr                 DestinationAddress,
  _In_     LPVOID                 RequestData,
  _In_     WORD                   RequestSize,
  _In_opt_ PIP_OPTION_INFORMATION RequestOptions,
  _Out_    LPVOID                 ReplyBuffer,
  _In_     DWORD                  ReplySize,
  _In_     DWORD                  Timeout
);
5 октября 2015 г. 14:58

QtGameDev на Qt - Урок 3. Уничтожение противников

GameDev, Qt, Enemy

В двух предыдущих статьях, где мы научили героя отслеживать перемещения курсора и стрелять в направлении цели , настало время добавить в игру мишени и начать их уничтожать. Уничтожение мишеней будет происходить тогда, когда у мишеней закончится жизнь. При этом у каждой из мишеней будет случайное количество очков жизни, а каждая пуля будет наносить случайное количество урона. Также у каждой мишени будет находиться полоска жизни, которая будет уменьшаться при нанесении урона.

Уничтожение на основе CallBack функции

Для реализации данного алгоритма создадим класс мишени Target , а также добавим в класс Bullet возможность вызова CallBack функции , которая будет реализована в классе главного окна приложения и будет наносить урон мишеням.

3 октября 2015 г. 16:56

QtQt/C++ - Урок 026. Применение CallBack функции

callback c++, callback, callback функция, Qt callback, Qt урок

Для передачи данных в Qt используется система сигналов и слотов, но это не означает, что нельзя применить старый проверенный способ, а именно использование CallBack функций. Дело в том, что использование CallBack функции является несколько более быстродействующим вариантом, чем сигналы и слоты. А также может быть более легким в применении, что касается того, что сигналы желательно отсоединять от слотов, когда объект посылающий сигнал уничтожается в программе и больше не используется. Этот момент особенно актуален, если учитывать то, что в C++ отсутствует сборщик мусора, как в Java или C# .

Принцип работы CallBack функции

Принцип работы CallBack функции

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

Для примера будет использован класс, который отрисовывает квадрат на графической сцене и управляется клавишами W, A, S, D. При движении квадрат должен отсылать данные о своих координатах в класс, в котором был создан. То есть должен вызывать функцию данного класса в качестве своей CallBack функции.

22 июля 2018 г. 20:56
Тарас

C++ - Тест 001. Первая программа и типы данных

  • Результат 73баллов,
  • Очки рейтинга1
22 июля 2018 г. 18:29
Kaptn

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

  • Результат 100баллов,
  • Очки рейтинга10
22 июля 2018 г. 7:48
Kaptn

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

  • Результат 64баллов,
  • Очки рейтинга-1
Последние комментарии
18 июля 2018 г. 12:45
plgrm44

Qt/C++ - Урок 050. Логирование событий Qt приложения в текстовый файл

А что мешает сохранить адрес дефолтного обработчика и после вывода в файл вызывать и его?
17 июля 2018 г. 13:34
Arrow

Qt/C++ - Урок 049. QTranslator - динамический перевод мультиязычного приложения на Qt

Работает так: find_package (Qt5LinguistTools)file (GLOB TS_FILES ${SOURCE_DIR}/translations/*.ts)qt5_add_translation (QM_FILES ${TS_FILES})add_custom_target (translations ALL DEPE...
17 июля 2018 г. 9:53
Илья Чичак

Django - Урок 035. Различные шаблоны для рендеринга разных типов контента в поисковой выдаче

тут все упирается в то, что вы хотите дать поисковым роботам. был у меня опыт проектирования страницы для роботов - сделал точки входа - со статикой для роботов и АПИ для JS клиента=) а отлавл...
17 июля 2018 г. 9:43
Евгений Легоцкой

Django - Урок 035. Различные шаблоны для рендеринга разных типов контента в поисковой выдаче

Думаю, что это всё равно стоит оставить для индексирующих роботов поисковых систем, которые испоьлзуют простые GET запросы. Они же AJAX не используют. Так что полностью уйти от этого не получи...
Сейчас обсуждают на форуме
23 июля 2018 г. 11:24
Arrow

QComboBox делегат для QTableView

И можно еще один маленький вопрос: Как изменить значение в ячейке QTableView?
23 июля 2018 г. 8:56
Arrow

Получение прав пользователей на таблицу базы данных

Да, только самый основной прикол в том что для возможности редактирования таблицы пользователю одних прав на таблицу мало, нужны еще и на последовательность: GRANT USAGE O...
23 июля 2018 г. 8:52
Евгений Легоцкой

Перестал работать Qt Maintenance Tool

В настройках есть параметры прокси, возможно, через них сможете завести, через какой-нибудь прокси сервер. По поводу списка репозиториев. сам не в курсе. Спросил на официальном форум...
23 июля 2018 г. 7:59
Евгений Легоцкой

Qt Android

Так, по поводу ошибок, там в main.cpp ещё одна ошибка у вас Надо так написать QQmlApplicationEngine engine;engine.load(QUrl(QStringLiteral("qrc:/main.qml")));DBase myClas...
23 июля 2018 г. 6:44
Евгений Легоцкой

как проверить состояние у динамически созданного CheckBox в qml

Тогда можно расширить эту модель, наследоваться от неё. И добавить в качестве роли ещё и состояние чекбокса, для выбора. Также можно переопределить метод setData, чтобы можно было ус...

Рекомендуемые страницы