Бесконечный двухмерный массив на C#

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

Поддерживает динамическое добавление/удаление данных из него. Оптимизирован на быстрое выполнение операций (в основе массива лежит хеш-таблица, которая предоставляет доступ к данным со “скоростью” О(1)) и малое использование памяти (под ячейку не выделяется память, пока в этом не появится необходимость). Позволяет добавлять в себя данные не только поштучно, но и способен “проглотить” статический массив.

Примеры:

Создание массива

Добавление единичного значения в массив:

Добавление статического массива со сдвигом offset относительно начала координат[0,0] бесконечного массива:

Получение значения из массива:

Исходный код c#

Внимание! В массиве, как ключ используется тип Point из System.Drawing. Если вы в своем проекте используете другой тип Point (например из XNA, monoGame или OpenTK), то вам необходимо будет изменить зависимость в библиотеке.

Nancy Framework

Nancy – это легковесный веб-фреймворк для .net. Я уже имел возможность использовать этот фреймворк для написания нескольких коммерческих проектов и могу сказать, что работать с ним – одно удовольствие. Причем он подходит не только для начинающих веб-разработчиков, но и для профессионалов своего дела.

Начнем по-порядку.

Установка Nancy

PM> Install-Package Nancy

или с сайта  http://nancyfx.org/

Пишем первый сайт

Готово!

Сайт на Nancy готов.

C# Отложенное получение данных

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

В моей программе, я использую BackgroundWorker’ы для выполнения длительных вычислений. BackgroundWorker асинхронно выполняет поставленную ему задачу (в событии DoWork), а после ее выполнения может сделать еще какие-нибудь действия (событие RunWorkerCompleted):

К сожалению, если мы передадим переменную, которая должна измениться в результате выполнения асинхронного запроса с модификаторами out или ref следующим образом:

, то это приведет к ошибке на этапе компиляции, т.к. передача ref/out переменных в анонимные методы запрещена.

Обойдем это с использованием собственного класса:

Класс очень простой: он состоит из свойства Value типа Т (т.е. любого, заявленного заранее, типа) и события, которое срабатывает, когда Value изменяется.

Пример использования класса:

В данном случае, strings перестанет равняться null в момент завершения асинхронной операции.

Diablo – .Net библиотеки

Promedeus выпустил в свет две библиотеки для .net, призванные облегчить жизнь разработчику .net приложений для Diablo 3.

Первая из них, D3MediaLib – библиотека, которая дает доступ к медиа-контенту Diablo 3 без необходимости осуществления сетевых запросов на battle.net и последующей обработки изображения. Библиотека проста в обращении и для получения данных достаточно запустить простой метод:

MediaLib.Get["ICON"];

На данный момент (версия 0.3) библиотека поддерживает следующие виды контента:

  • все предметы
  • все пассивные и активные скиллы
  • все руны для скиллов
  • все зелья, реагенты для крафта и краски
  • все драг. камни
  • все портреты (персонажей и npc)

Сайт проекта – http://d3medialib.codeplex.com/

Вторая библиотека призвана облегчить взаимодействие между приложением и грядущим Diablo 3 API. D3API.Net позволяет получать доступ к Diablo 3 API и формировать объекты из полученных данных представления. Нет необходимости в сетевых запросах, парсинге и сериализации.

Сайт проекта – http://d3api.codeplex.com/

Обе библиотеки распространяется под GPL v2.

Windows Forms – создание собственного интерфейса

Наверняка, вам когда-нибудь хотелось заменить стандартное оформление приложения Windows на что-то собственное. Например, как в лаунчерах современных игр:

Такое оформление не сложно создать самому (при наличии, конечно, навыков дизайнера). Для создания такого приложения будем использовать исключительно стандартные средства Windows Forms. Read the rest of this entry »

Пишем tooltip всплывающую подсказку

Привет, сегодня рассказываю примерный алгоритм того, как реализованы всплывающие подсказки в Ignite . Основным требованием к всплывающей подсказке будет ее масштабируемость в зависимости от того, сколько информации в ней рисуется. Итоговый результат выглядит вот так:

 

Первое, что необходимо сделать – это подсчитать какой размер занимает информация, содержащаяся в подсказке. Сделать это можно совершенно различными способами. Я записываю в структуру Point вектор расстояния от левого-верхнего угла до правого-нижнего:

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

Я принимаю две структуры Point: положение левого-верхнего угла и размер всплывающей подсказки. gui – это текстура, с которой рисуется на экран картинка. Первый прямоугольник – положение, куда рисуется уголок, второй – его положение на текстуре gui. Заметьте, что я сдвигаю положение уголков на 5 пикселей от всплывающей подсказки. Я это буду делать и для остальных 4х сторон.

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

Рисуем стороны:

После того, как нарисованы стороны, не забудьте добавить фон. Я использую полупрозрачное изображение, которое отделяет текст подсказки от игрового поля. Это изображение я растягиваю до размера size:

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

C#: отправка email

В net framework невероятно просто отправлять сообщения электронной почтой. Для примера напишем метод, который будет отправлять электронную почту через сервер Google – GMail:

Тоже самое, только немного сложнее:

В случае, если необходимо добавить приложение к письму (файл):

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

Добавление справки в скриптовую систему Lua

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

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

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

Построение скриптовой системы LUA на базе C# приложения

Привет! Сегодня я хочу поговорить о решении интересной на мой взгляд проблемы: создании скриптовой системы для С# приложения. Сразу оговорюсь, что, несмотря на то, что я буду использовать скриптовый язык LUA, данную проблему можно было решить исключительно средствами языка C#, компилируя исходный код в процессе выполнения программы, но это достаточно сильно усложняет реализацию, т.к. требует от программиста реализации достаточно сильного контроля над кодом скрипта. Реализация же с помощью LUA намного более проста с одной стороны и, в следствии своей простоты, имеет намного более низкий порог вхождения.

Read the rest of this entry »

Ignite: Простая реализация динамических облаков

Эта запись является продолжением рассказа про использование алгоритма Perlin Noise . В этом посте я расскажу о том, как я реализовал динамическое изменение карты теней от облаков в своем проекте. Вот видео, того, что получилось в итоге:

В начальный момент времени генерируется карта теней алгоритмом Perlin Noise. Методика перехода состоит в создании дополнительной карты теней и слияние обоих этих карт в новую. Важно запомнить, что генерация карты теней достаточно ресурсоемкий процесс и должен выполнятся или в моменты простоя CPU, во-втором потоке или на GPU.

Дополнительная карта генерируется точно также, как и первая. Их объединения я производил по достаточно простому алгоритму:

Коэффициенты 0,3 и 0,7 вы можете подобрать самостоятельно. Однако нужно запомнить две вещи:

  • Их сумма должна быть равна 1
  • Чем больше число рядом с old[i,j] тем больше новая карта теней будет похожа на предыдущую

Это практически все. Остается только в нужный момент изменить старую карту теней на обновленную: