Уроки по созданию приложений для Windows в Visual Studio 2010 .Net (C#)
- Муслимова А. Г.
- Уроки по созданию приложений для Windows в MS Visual Studio 2010 .Net (C#)
- Просмотров: 27027
MS Visual Studio 2010. Использование битовых образов Bitmap
Для хранения изображений в библиотеке GDI+ предназначен класс Image и его потомок, класс Bitmap.
Для создания качественной анимации можно использовать битовые образы, основанные на классе Bitmap. Они позволяют хранить изображения, однажды загруженные с диска, в память ПК.
Объявляются переменные для хранения битовых образов так же, как и обычные переменные, например:
System.Drawing.Bitmap fon, kadr1,kadr2,oblako;
Здесь мы объявили 4 переменные для хранения битовых образов с именами fon, kadr1,kadr2 и oblako.
После того, как мы объявили переменные для хранения битовых образов, нужно загрузить в них эти самые битовые образы. Можно загружать картинки непосредственно из файлов, которые находятся на диске. А можно загружать картинки из файла ресурсов, предварительно создав его.
В первом случае при работе приложения необходимо, чтобы эти картинки всегда находились в той же папке, что и само приложение. Это, конечно же, не всегда целесообразно.
Пример загрузки картинки (битового образа) в переменную Bitmap из файла:
fon = new Bitmap("фон.bmp"); // фон
Естественно, файл "фон.bmp" должен лежать в папке Debug проекта.
Пример загрузки картинки (битового образа) в переменную Bitmap из файла ресурсов:
fon = Properties.Resources.Фон; // фон
Размещение битовых образов в файле ресурсов
Открыть окно свойств проекта (Проект®Свойства)
В левой части окна выбрать категорию «Ресурсы»:
Жмем черную стрелочку возле закладки «Добавить ресурс» и выбираем Добавить существующий файл.
Общий принцип создание мультипликации с помощью битовых образов Bitmap.
Так как отображение на экран битового образа довольно-таки медленная операция, то сначала изображение подготавливают в памяти, а на экран выводят уже в готовом виде.
Сначала создаются несколько вспомогательных объектов Bitmap:
«Фон» – хранит изображение фона;
«Кадры» – хранят отдельные кадры персонажей. Например, если для изображения идущего человека понадобится 4 кадра, каждый кадр должен храниться в отдельном объекте Bitmap.
На поверхность рисования копируется фон, и помещается нужный кадр с персонажем, потом весь лист копируется на форму. Затем эти действия повторяются, но уже со следующим кадром. Благодаря тому, что самая медленная операция – вывод на экран происходит один раз, весь процесс значительно ускоряется.
Пример создания мультипликации
Создайте новый проект с именем Kotik.
Поместите на форму ЭУ Timer.
Объявите глобальные переменные:
public partial class Form: Form
{
// Объявляем глобальные переменные:
// битовые образы: фон, кадр1, кадр2, облако
System.Drawing.Bitmap fon, kadr1,kadr2,oblako;
Graphics g; // рабочая графическая поверхность
// приращение координаты X,
// определяет скорость перемещения облака
int dx = 1;
// области, в которых находится котик и облако
// Rectangle Содержит набор из четырех целых чисел,
// определяющих расположение и размер прямоугольника
Rectangle rct, robl;
int k = 1; //номер кадра
Теперь нужно загрузить битовые образы из файла ресурсов и начальные значения некоторым переменным:
public Form1()
{
InitializeComponent();
fon = Properties.Resources.Фон;
kadr1 = Properties.Resources.кадр1;
kadr2 = Properties.Resources.кадр2;
oblako = Properties.Resources.облако;
// загрузить и задать фоновый рисунок формы
this.BackgroundImage = Properties.Resources.Фон;
// задать размер формы в соответствии
// с размером фонового рисунка
this.ClientSize =
new System.Drawing.Size(new Point
(BackgroundImage.Width,BackgroundImage.Height));
// сделать прозрачным фон вокруг объектов
kadr1.MakeTransparent();
kadr2.MakeTransparent();
// задать вид границы окна
this.FormBorderStyle =System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
// g - графическая поверхность, на которой
// будем формировать рисунок.
// в качестве поверхности
// будем использовать BackgroundImage формы
g = Graphics.FromImage(BackgroundImage);
// исходное положение котика
rct.X = 70;
rct.Y = 100;
rct.Width = kadr1.Width;
rct.Height = kadr1.Height;
// исходное положение облака
robl.X = -oblako.Width;
robl.Y = 3;
robl.Width = oblako.Width;
robl.Height = oblako.Height;
timer1.Interval = 100;
timer1.Enabled = true;
}
И наконец, на таймер, создаем обработчик события onTimer, где, собственно, и реализуем анимацию:
private void onTimer(object sender, EventArgs e)
{
k++; //увеличиваем номер кадра
//Значение номера кадра может быть
//либо 1, либо 2
if (k == 3) k = 1;
//смещаем облако на dx вправо
robl.X += dx;
// Если облако ушло за форму,
// то возвращаем его в исходное положение
if(robl.X > fon.Width)
robl.X = -oblako.Width;
//На поверхности рисования рисуем
//изображения котика
//Будет перерисована область с координатами
//заданными прямоугольником rct
if (k == 1)
g.DrawImage(kadr1, rct.X, rct.Y);
if (k == 2)
g.DrawImage(kadr2, rct.X, rct.Y);
//На поверхности рисования рисуем
//изображения облака
//Будет перерисована область с координатами
//заданными прямоугольником robl
g.DrawImage(oblako, robl.X, robl.Y);
// но для того, чтобы изменения появились,
// надо инициировать обновление формы
this.Invalidate();
}
}
}