<MyRusakov.ru />

Программирование на C++ в Unreal Engine 5

Программирование на C++ в Unreal Engine 5

Данный курс научит Вас созданию игр на C++ в Unreal Engine 5. Курс состоит из 12 разделов, в которых Вас ждёт теория и практика. Причём, в качестве практики будет создан весьма крупный проект объёмом свыше 5000 строк качественного кода, который уже на практике познакомит Вас с принципами создания игр на C++ в Unreal Engine 5.

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

Помимо самого курса Вас ждёт ещё и очень ценный Бонус: «Тестирование Unreal-проектов на Python», в рамках которого Вы научитесь писать очень полезные тесты для тестирования самых разных аспектов разработки игр.

Подробнее
Подписка

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

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Обёртка для работы с IndexedDB на JavaScript: класс IndexedDBWrapper

Обёртка для работы с IndexedDB на JavaScript: класс IndexedDBWrapper

IndexedDBWrapper предоставляет высокоуровневый интерфейс для выполнения основных операций с IndexedDB: открытия базы данных, добавления, получения, обновления и удаления записей. Использование асинхронного программирования через async/await обеспечивает более читаемый и поддерживаемый код.

// Класс-обёртка для удобной работы с IndexedDB
export default class IndexedDBWrapper {
    /**
     * Конструктор класса
     * @param {string} dbName - Имя базы данных
     * @param {number} version - Версия базы данных (по умолчанию 1)
     * @param {function} onUpgradeNeededCallback - Функция, вызываемая при обновлении базы данных
     */
    constructor(dbName, version = 1, onUpgradeNeededCallback = null) {
        this.dbName = dbName;
        this.version = version;
        this.db = null;
        this.onUpgradeNeededCallback = onUpgradeNeededCallback;
    }

    /**
     * Открытие базы данных с использованием async/await
     */
    async open() {
        try {
            this.db = await this.openDB();
            console.log(`Database ${this.dbName} opened successfully`);
        } catch (err) {
            console.error("Error opening database", err);
        }
    }

    /**
     * Открытие базы данных и обработка обновления версии
     * @returns {Promise<IDBDatabase>}
     */
    openDB() {
        return new Promise((resolve, reject) => {
            const request = indexedDB.open(this.dbName, this.version);

            // Обработка события обновления базы данных
            request.onupgradeneeded = (event) => {
                if (this.onUpgradeNeededCallback) {
                    this.onUpgradeNeededCallback(event);
                }
            };

            // Успешное открытие базы данных
            request.onsuccess = (event) => resolve(event.target.result);

            // Ошибка открытия базы данных
            request.onerror = (event) => reject(event.target.error);
        });
    }

    /**
     * Добавление данных в указанное хранилище
     * @param {string} storeName - Имя хранилища объектов
     * @param {Object} data - Данные для добавления
     */
    async add(storeName, data) {
        try {
            const result = await this.transaction(storeName, 'readwrite', (store) => store.add(data));
            console.log('Data added', result);
            return result;
        } catch (err) {
            console.error('Error adding data', err);
        }
    }

    /**
     * Получение данных по ключу из указанного хранилища
     * @param {string} storeName - Имя хранилища объектов
     * @param {IDBValidKey} key - Ключ для поиска
     */
    async get(storeName, key) {
        try {
            const result = await this.transaction(storeName, 'readonly', (store) => store.get(key));
            console.log('Data retrieved', result);
            return result;
        } catch (err) {
            console.error('Error retrieving data', err);
        }
    }

    /**
     * Обновление данных в указанном хранилище
     * @param {string} storeName - Имя хранилища объектов
     * @param {Object} data - Данные для обновления (должны содержать ключ)
     */
    async update(storeName, data) {
        try {
            const result = await this.transaction(storeName, 'readwrite', (store) => store.put(data));
            console.log('Data updated', result);
            return result;
        } catch (err) {
            console.error('Error updating data', err);
        }
    }

    /**
     * Удаление данных по ключу из указанного хранилища
     * @param {string} storeName - Имя хранилища объектов
     * @param {IDBValidKey} key - Ключ записи для удаления
     */
    async delete(storeName, key) {
        try {
            await this.transaction(storeName, 'readwrite', (store) => store.delete(key));
            console.log('Data deleted');
        } catch (err) {
            console.error('Error deleting data', err);
        }
    }

    /**
     * Выполнение транзакции с использованием async/await
     * @param {string} storeName - Имя хранилища объектов
     * @param {string} mode - Режим транзакции ('readonly' или 'readwrite')
     * @param {function} callback - Функция, выполняющая операцию над хранилищем
     * @returns {Promise<any>}
     */
    transaction(storeName, mode, callback) {
        return new Promise((resolve, reject) => {
            const transaction = this.db.transaction(storeName, mode);
            const store = transaction.objectStore(storeName);

            const request = callback(store);

            request.onsuccess = (event) => resolve(event.target.result);
            request.onerror = (event) => reject(event.target.error);
        });
    }

    /**
     * Закрытие соединения с базой данных
     */
    close() {
        if (this.db) {
            this.db.close();
            console.log('Database closed');
        }
    }
}

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.