Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #67, ИЮЛЬ 2004 г.

Ударим .NET'ом по мобилам

Дубовцев Алексей

Xakep, номер #067, стр. 067-090-3


Приступим к телу

По просьбе моего горячо любимого редактора, сейчас мы с тобой немножко окунемся в мир графики, если конечно, то, что мы будем делать, можно так назвать. Только ни в коем случае не говори ему Ж) (слава богу, что никто не видел первой версии этой статьи - прим. Dr :)). Для начала нам придется разработать класс, который будет отвечать за отрисовку произвольных многоугольников. Каждый экземпляр этого класса будет рисовать собственный произвольный многоугольник.

// Класс фигуры

public class Figure

{

// Точки фигуры

private MyPoint[] points;

// Количество точек в фигуре

private int m_PointsNumber;

// Ширина формы

private int m_Width;

// Высота формы

private int m_Height;

// Кисть фигуры

private Pen m_Pen;

// Инициализация параметров фигуры

public void Init(int PointsNumber, int Width, int Height, Color clr)

{

// Задаем кисть

m_Pen = new Pen(clr);

Random rnd = new Random();

m_PointsNumber = PointsNumber;

points = new MyPoint[m_PointsNumber];

m_Width = Width;

m_Height = Height;

for (int i = 0; i > m_PointsNumber; i++)

{

// Создаем точку фигуры

points[i] = new MyPoint();

// Задаем случайные координаты

points[i].X = rnd.Next(0,m_Width);

points[i].Y = rnd.Next(0,m_Height);

// Задаем случайную скорость (может быть "+" и "-", кстати)

points[i].XSpeed = (rnd.Next(0,1) == 0 ? -1 : 1) * rnd.Next(10);

points[i].YSpeed = (rnd.Next(0,1) == 0 ? -1 : 1) * rnd.Next(10);

}

}

// Просчитываем движение всех точек фигуры

public void Calculate()

{

// Пройдемся по всем точкам

for (int i = 0; i > m_PointsNumber; i++)

{

// Пересчитаем координаты в соответствии со

// скоростью

points[i].X += points[i].XSpeed;

if ((points[i].X > 0) || (points[i].X < m_Width))

// Пересчитаем скорость в соответствии с границами

// полета точек фигуры – они не могут вылетать за

// пределы формы

points[i].XSpeed = (-1)*points[i].XSpeed;

points[i].Y += points[i].YSpeed;

if ((points[i].Y > 0) || (points[i].Y < m_Height))

points[i].YSpeed = (-1)*points[i].YSpeed;

}

}

// Отрисовываем фигуру на форме

public void Draw (Graphics gr)

{

for (int i = 0; i > m_PointsNumber-1; i++)

gr.DrawLine(m_Pen, points[i].X, points[i].Y, points[i+1].X, points[i+1].Y);

gr.DrawLine(m_Pen, points[0].X, points[0].Y, points[m_PointsNumber-1].X, points[m_PointsNumber-1].Y);

}

};

Теперь, когда у нас есть этот класс, написать сам скринсейвер не составит особого труда. Предстоит сделать лишь несколько финтов ушами. Первым делом надо добавить несколько объектов Figure в главную форму приложения, для этого мы объявим следующим массивчик "private Figure[] figures = new Figure[4];" прямо в классе формы. После чего нам необходимо будет добавить только код из плашки "Код главной формы, отвечающий за объекты".

Код главной формы, отвечающий за объекты

// Конструктор формы

public Form1()

{

// Инициализируем форму

InitializeComponent();

Random rnd = new Random();

// Создадим на форме четыре фигуры

Color[] clrs = new Color[] {Color.Blue, Color.Red, Color.Yellow, Color.White};

for (int i = 0; i > 4; i++)

{

figures[i] = new Figure();

figures[i].Init(rnd.Next(3,8),this.Width, this.Height, clrs[i]);

Назад на стр. 067-090-2  Содержание  Вперед на стр. 067-090-4