Попробовал сегодня FBA The Creator. Это что-то похожее на IDE для создания игр для PDA и смартфонов под управлением Windows Mobile. Имеет очень удобное API для работы с изображениями различных форматов, звуковыми файлами и др. Язык разрботки напоминает гибрид Pascal’я и Basic’а (знаю, многие не любят ни тот ни другой, но на самом деле плеваться нечего ибо такая аццкая смесь вполне может помочь какому-нибудь новичку с минимальными усилиями слепить несложную игру) (UPD: После прочтения документации оказалось что это LUA, да уж, век живи, век учись).

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

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

И все это совершенно бесплатно! И весит мало. Дистрибутив FBA The Creator весит всего около 2х мегабайт.

Из недостатков хотелось бы отметить вот что: отказалось работать под Vista’ой из-под обычной учетки, пришлось запускать из-под административного аккаунта. Также при тестировании примеров на эмуляторе видно что при запуске программы секунд на 30 в левом нижнем углу появляется небольшой баннер с информацией о том что игра создана с помощью FBA Creator и со ссылкой на сайт продукта. Не скажу что это критично, но не очень приятно.

Ну а вцелом очень удачная штука.

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

This post has 3 Comments

3
  1. Интересная вещь. Только я упускаю один момент… Для сборки проекта помимо самой проги еще что-нибудь нужно? Не могу понять, то ли я туплю, то ли под wine она все-таки кривовато работает.

  2. Не, вроде ничего не надо. LUA ж скриптовый язык. Я думаю там приложение получается в виде интерпретатора и просто скрипта в ресурсах. Можно поковырять, но не вижу смысла. Оно просто работает.

  3. Ясно… вернусь домой – буду ломать, оно мне так и не дало собрать ничего 🙁

Leave a Reply

Your email address will not be published. Required fields are marked *

C.

Compact Framework: Грани прозрачности

Еще одна интересная статья от Андрея Коновалова. В статье рассмотрены особенности реализации отрисовки изображений с прозрачностью при использовании .NET Compact Framework.

Вступление

К большому сожалению разработчиков, Compact Framework, да и native-функции тоже, не поддерживают альфа-канал с разной прозрачностью у индивидуальных пикселей. Это означает, что нет возможности создавать красоту неописуемую с плавными переходами между изображениями. Однако, что же делать, если хочется иметь хотя бы подобие “полного” альфа-канала, а именно, выводить полупрозрачные изображения, у которых есть ещё и полностью прозрачные участки?

Рассмотрим два способа вывода изображений с прозрачностью.

Способ №1. Фиксированый цвет является прозрачным

public static void DrawImageTransparent(Graphics g, 
  Bitmap b, Point location, Color transColor)
{
  if (b == null || g == null)
    return;

  ImageAttributes attrib = new ImageAttributes();
  attrib.SetColorKey(transColor, transColor);

  Rectangle destRect = new Rectangle(location.X, location.Y, b.Width, b.Height);
 
  g.DrawImage(b, destRect, 0, 0, b.Width, b.Height, GraphicsUnit.Pixel, attrib);
}

Стоит заметить, что только эта хитрая разновидность DrawImage позволяет выводить изображение с указанным ColorKey, по которому определяется, какие пиксели не рисовать. Шикарный набор параметров, не находите? 🙂 Куда рисовать, мы задаём через Rectange, а откуда — через 4 параметра. Ну это я так, лирическое отступление в сторону Microsoft.

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

Пример:

Compact Framework - Грани прозрачности
На самом деле, вполне неплохо, можно на этом и остановиться. Но хочется-то большего 🙂

Способ №2. У всего изображения фиксированный коэффициент непрозрачности

В этом случае без DllImport уже не обойтись, приготовим всё, что для этого необходимо:

public struct BlendFunction
{
  public byte BlendOp;
  public byte BlendFlags;
  public byte SourceConstantAlpha;
  public byte AlphaFormat;
}

public enum BlendOperation : byte
{
  AC_SRC_OVER = 0x00
}

public enum BlendFlags : byte
{
  Zero = 0x00
}

public enum SourceConstantAlpha : byte
{
  Transparent = 0x00,
  Opaque = 0xFF
}

public enum AlphaFormat : byte
{
  AC_SRC_ALPHA = 0x01
}

public class PlatformAPI
{
  [DllImport("coredll.dll")]
  extern public static Int32 AlphaBlend(IntPtr hdcDest, 
    Int32 xDest, Int32 yDest, Int32 cxDest, Int32 cyDest, 
    IntPtr hdcSrc, Int32 xSrc, Int32 ySrc, Int32 cxSrc, 
    Int32 cySrc, BlendFunction blendFunction);        
}

Как видно, обрезано всё, что только можно обрезать — в enum-ах по одному параметру и т.д. Но тем не менее, продолжаем. Собственно, наша функция:

public static void DrawAlpha(Graphics g, Bitmap b, Point location, byte opacity)
{
  if (b == null || g == null)
    return;

  using (Graphics gxSrc = Graphics.FromImage(g))
  {
    IntPtr hdcDst = g.GetHdc();
    IntPtr hdcSrc = gxSrc.GetHdc();
    BlendFunction blendFunction = new BlendFunction();
    blendFunction.BlendOp = (byte)BlendOperation.AC_SRC_OVER;
    blendFunction.BlendFlags = (byte)BlendFlags.Zero;
    blendFunction.SourceConstantAlpha = opacity;
    blendFunction.AlphaFormat = (byte)0;    
    PlatformAPI.AlphaBlend(hdcDst, location.X, location.Y, 
      b.Width, b.Height, hdcSrc, 0, 0, b.Width, b.Height, blendFunction);
    g.ReleaseHdc(hdcDst);
    gxSrc.ReleaseHdc(hdcSrc);
  }
}

Небольшие комментарии по коду — параметры у BlendFunction нельзя менять, они проставляются единственно возможные. Это обидно, но делать нечего.

Пример:
Compact Framework - грани прозрачности
Жутковато, да? Противные фиолетовые пиксели никуда не делись и тоже стали немного прозрачными 🙁

Комбинированное использование обоих способов

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

Итак, решение следующее. Раз мы не можем одновременно задать ColorKey и вызвать AlphaBlend, будем использовать их по очереди. Сначала нарисуем фон стандартным спосбом без изысков, затем кнопку первым спосбом, а в конце… вторым спосбом нарисуем поверх фон с небольшим коэффициентом непрозрачности!

g.DrawImage(background, 0, 0);
DrawImageTransparent(g, button, new Point(10, 10), Color.FromArgb(255, 0, 255));
DrawAlpha(g, background, new Point(0, 0), 75);

Результат:
Compact Framework - Грани прозрачности

Описанный выше способ вполне жизнеспособен. Я им пользуюсь и вполне удовлетворён скоростью работы — на отрисовку всех элементов интерфейса в подобном стиле уходит в среднем от 60 до 80 миллисекунд (проверялось на разнообразных устройствах). Для создания приложения в таком стиле, безусловно, стандартные контролы не подойдут, но а кто обещал, что будет легко? В любом случае, для создания неописуемой красоты без собственного фреймворка рендеринга графических элементов не обойтись.

Оригинал статьи на Хабре.

В.

Вышла MOTODEV Studio for WebUI 1.0

Вышла финальная версия IDE MOTODEV Studio for WebUI 1.0 от компании Motorola.

MOTODEV Studio for WebUI – это IDE на базе Eclipse для создания виджетов и приложений в стиле Web 2.0 для открытой платформы MOTOMAGX™. IDE доступна для ОС Windows и Linux. Дистрибутив, помимо инструментария, содержит полный пакет документации, необходимой разработчику.

Загрузить MOTODEV Studio for WebUI можно здесь.

Интересно что в требованиях для этой IDE значится VMWare Player. Занятно наблюдать, как знаменитые вендоры используют продукты от VMWare в качестве базы для разработки ПО для своих устройств.