понедельник, 27 января 2014 г.

Загрузчик контента в отдельном потоке SFML Часть 1

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

Начнём с того, что неплохо было бы выделить всю загрузку в отдельный поток. Ну это совсем просто:
1) Главная функция потока-загрузчика
void loaderThread();
Пока что в ней ничего не будет. Разве что сделать в ней бесконечный цикл¸ внутри которого будет находиться вся логика загрузчика.
2) Добавляем следующие строки в функцию основного потока, где должен создаваться дочерний поток (чаще всего int main())
sf::Thread thread(&loaderThread);
thread.launch();
Эти строки создают новый поток и запускают его.

Теперь перейдём непосредственно к самому интересному - архитектуре загрузчика.

воскресенье, 24 ноября 2013 г.

Подключаем SFML к проекту QtCreator, Linux

Доброго времени суток, давненько я ничего не писал, чемпионаты по программированию, другие проекты, переход на Linux, QtCreator, gcc и SFML.

Эта статья будет посвящена установки SFML на Linux Distro (в моём случае openSUSE 12.3).
Я бы даже сказал, что это будет перевод статьи https://github.com/LaurentGomila/SFML/wiki/Tutorial%3A-Compile-and-Link-SFML-with-Qt-Creator с авторскими комментариями.

понедельник, 9 сентября 2013 г.

За что я люблю C++

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

Ну начать можно пожалуй со сравнения с другими высокоуровневыми языками. Чаще всего высокоуровневые ООП языки поддерживают механизм ссылок. Работает он очень легко, создаёте объект - раздаёте ссылки всем нужным классам - PROFIT. Кто бы его ни менял - у всех один и тот же объект. Вот в плюсах такое не прокатит =) Конечно, если вы не удивительный везунчик, но везти может тоже не всегда. Пока вы используете объекты и обмениваетесь ссылками - всё ничего, но кошмар поджидает совсем рядом - как только вы решите использовать динамические массивы или STL - проблемы не заставят себя долго ждать. Скажем, вы создаёте новый объект, затем вам ссылочку надо бы сохранить, но при этом не мешало бы запихнуть объект в std::vector. Не тут-то было. При добавлении элементов vector начинает таскать ваш объект в памяти как ему взблагоразумится, так что не удивляйтесь, что в один прекрасный момент по ссылке вы ничего не обнаружите. А изменять объект как-то нужно из разных частей кода, т.е. копирование ну никак не подходит. В таком случае на помощь нам приходит то, от чего в большинстве языков открещиваются - указатели. Итак создаём указатель на объект, по указателю передаём массив указателей. Оператором new создаём объект, а адрес записываем в указатель, потом сохраняем указатель в массив указателей, Вот и долгожданный профит. Как бы вы не таскали массив в памяти - достаточно переписать указатели и всё будет хорошо. Так же не стоит беспокоиться, что тот же SDL их погрохает. Тут главное самому не перестараться и не снести случайно нужный объект.

четверг, 29 августа 2013 г.

Создаём пустое приложение. SDL

Доброго времени суток, сегодня мы будем создавать самое простое приложение, инициализирующее SDL.

Для этого создадим новый файл Core.h в котором опишем класс TCore - ядро нашего приложения.

#ifndef __CORE_H__
#define __CORE_H__

#include <SDL.h>

class TCore
{
public:
  TCore();
  int Launch();
};

#endif

В методе Launch будет начинаться и заканчиваться вся логика нашего приложения. Отроем файл main.cpp и удалим из него всё лишнее, кроме точки входа int main(...) Затем подключим заголовочный файл Core.h и создадим экземпляр класса TCore. После чего вызовем метод Launch. Если вы всё сделали правильно, то получиться у вас должно было примерно следующее:

#include "SYS\Core.h"

int main( int argc, char* argv[] )
{
  TCore Core;
  return Core.Launch();
}
 
На этом закроем main.cpp - он нам больше никогда не понадобится.

среда, 28 августа 2013 г.

Hello World с использованием SDL? Легко!

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

  1. Идём на страницу загрузки на официальном сайте libsdl.org (я использую самый актуальный на момент написания статьи SDL2 )
  2. Нам понадобятся исходники (Source Code)
  3. После загрузке в архиве будут лежать дальнейшие инструкции по установке, следуйте им и у Вас всё получится. Для пользователей Visual Studio я детально опишу процесс.
Итак у нас есть исходники SDL и Visual Studio 2008 или новее.
Смело распаковываем архив в любое удобное для вас место - ищем внутри папку VisualC

Что же такое SDL

SDL это кросс-платформенная библиотека предназначенная для низкоуровнего доступа к аудио, вводу, аппаратной графике через OpenGL и DirectX. В настоящее время SDL достаточно популярно и мы можем увидеть её применение повсеместно, начиная от плееров, эмуляторов и заканчивая большим количеством игр, заслуживших высокую оценку игрового сообщества.
На данный момент SDL полностью поддерживает Windows, Mac OS X, Linux, iOS и Android.
Сама библиотека написана на языке C, при этом нативно поддерживает язык C++. Так же можно найти версии библиотеки для таких языков, как C#, Pyhon и Pascal.

Перевод статьи About SDL.

От себя хочу добавить, что после работы с разными движками и библиотеками - эта показалась мне наиболее привлекательной, поскольку она сочетает в себе мощь низкоуровнего программирования с простотой высокоуровнего. Так же библиотека обеспечивает неплохую гибкость архитектуры вашей разработки, в отличии от многих движков. Кросс-платформенность тоже немаловажна: даже если сейчас большая часть целевой аудитории разработчиков игр - пользователи Windows, то совсем не факт, что это не изменится в ближайшие годы.

Куваев Александр.
ICQ: 472811290
e-mail: vinetorul@yandex.ru

вторник, 20 августа 2013 г.

Как быстро выделить все дочерние элементы данного элемента в TTreeView, Delphi? Есть ответ!

Просто "становимся" на его первый дочерний элемент и выделяем до последнего, для последнего проделываем то же самое, пока не закончатся =)

// Powered By Magic
procedure TfmMain.TreeMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);

  procedure Select(const aNode: TTreeNode);
  var
    i: Integer;
  begin
    if not aNode.HasChildren then
      Exit;
    TreeView.Select(aNode.getFirstChild, [ssCtrl, ssShift]);
    TreeView.Select(aNode.GetLastChild, [ssCtrl, ssShift]);
    Select(aNode.GetLastChild);
  end;

var
  vNode: TTreeNode;
begin
  vNode := TreeView.GetNodeAt(X, Y);
  if Assigned(vNode) then
  begin
    Select(vNode);
  end;
end;

С наилучшими пожеланиями,
Куваев Александр.
ICQ: 472811290
e-mail: vinetorul@yandex.ru