Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Жарков В.А. - Visual C++ 2005, DirectX 9.0c и Microsoft Agent в компьютерной графике, мультимедиа и играх (Листинги книги) - 2005

.pdf
Скачиваний:
306
Добавлен:
13.08.2013
Размер:
1.14 Mб
Скачать

240 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

Листинг 45.8. Метод для вывода значений секунд, минут и часов.

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

DateTime currentTime = DateTime::Now;

int seconds = currentTime.Second; int minutes = currentTime.Minute; int hours = currentTime.Hour;

progressBar1->Value = seconds; progressBar2->Value = minutes; progressBar3->Value = hours;

label1->Text = seconds.ToString(); label2->Text = minutes.ToString(); label3->Text = hours.ToString();

}

Глава 46. Вращение линии

Листинг 46.1. Код для проектирования рисунка.

//Объявляем глобальную переменную для угла "angle" //и приравниваем ее нулю:

float static angle = 0;

private:

System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)

{

//Объявляем объект myGraphicsPath //класса GraphicsPath:

GraphicsPath^ myGraphicsPath = gcnew GraphicsPath(); //На объекте myGraphicsPath выполняем метод //AddLine для построения линии по двум точкам

//с координатами (29, 29) и (100, 100): myGraphicsPath->AddLine(29, 29, 100, 100); //В классе Matrix создаем объект myMatrix //в виде матицы преобразований:

Matrix^ myMatrix = gcnew Matrix(1, 0, 0, 1, 1, 1); //Вокруг точки с координатами (100, 100) //поворачиваем линию на один шаг

//при помощи метода RotateAt класса Matrix: myMatrix->RotateAt(angle, PointF(100, 100)); //Применяем метод Transform класса GraphicsPath //для трансформирования матрицы myMatrix: myGraphicsPath->Transform(myMatrix);

//Рисуем на экране трансформированную линию

//черным пером толщиной 3 (Pen(Color::Black, 3)): e->Graphics->DrawPath(gcnew Pen(Color::Black, 3),

myGraphicsPath); //Увеличиваем текущий угол поворота линии //на один шаг, равный 6 градусам:

angle = angle + 6;

//Обнуляем угол поворота линии, //когда линия сделает полный оборот в 360 градусов: if (angle == 360) angle = 0;

//Для наглядности внутри квадрата 200x200 //рисуем окружность (типа циферблата часов) //синим пером толщиной 2 (Pen(Color::Blue, 2), //внутри которой будет вращаться линия:

e->Graphics->DrawEllipse(gcnew Pen(Color::Blue, 2),

242 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

0, 0, 200, 200); //Рисуем две оси симметрии окружности, //горизонтальную и вертикальную: e->Graphics->DrawLine(gcnew Pen(Color::Red, 1),

0, 100, 200, 100); e->Graphics->DrawLine(gcnew Pen(Color::Red, 1),

100, 0, 100, 200);

}

Листинг 46.2. Код для анимации рисунка.

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

//Перерисовываем клиентскую область элемента PictureBox //через каждый Interval времени: pictureBox1->Refresh();

}

Глава 47. Управляемое вращение линии

Листинг 47.1. Код для проектирования рисунка.

//Переменная "angle" (для угла поворота линии): int static angle = 0;

private:

System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)

{

//Объявляем локальные переменные: //Радиус вращающейся линии: float r = 100;

//Координаты центра вращения: float x_centre = 100;

float y_centre = 100;

//Объявляем координаты вращающейся точки: float x, y;

//Определяем координаты вращающейся точки //и преобразовываем в тип (float):

x = x_centre + r * Convert::ToSingle(

Math::Cos(2 * Math::PI * angle / 360)); y = y_centre + r * Convert::ToSingle(

Math::Sin(2 * Math::PI * angle / 360)); //Метод DrawLine класса Graphics строит линию

//по двум точкам (x_centre, y_centre) и (x, y): e->Graphics->DrawLine(gcnew Pen(Color::Black, 3),

x_centre, y_centre, x, y); //Увеличиваем угол поворота линии //на один шаг, равный 6 градусам:

angle = angle + 6;

//Обнуляем угол поворота линии, //когда линия сделает полный оборот //на 360 градусов:

if (angle == 360) angle = 0;

//Для наглядности рисуем окружность //(типа циферблата часов), //внутри которой будет вращаться линия:

e->Graphics->DrawEllipse(gcnew Pen(Color::Blue, 2), 0, 0, 200, 200);

//Рисуем две оси симметрии окружности, //горизонтальную и вертикальную: e->Graphics->DrawLine(gcnew Pen(Color::Red, 1),

0, 100, 200, 100);

244 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

e->Graphics->DrawLine(gcnew Pen(Color::Red, 1), 100, 0, 100, 200);

}

Листинг 47.2. Метод для элемента управления TrackBar.

private:

System::Void trackBar1_Scroll(System::Object^ sender, System::EventArgs^ e)

{

//Включаем таймер (задаем Enabled равным true): timer1->Enabled = true;

//Устанавливаем значение свойства Interval таймера //в зависимости от перемещения ползунка Value: timer1->Interval = trackBar1->Value;

}

Листинг 47.3. Метод для компонента Timer.

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

//Перерисовываем область элемента PictureBox //через каждый Interval времени:

pictureBox1->Refresh();

}

Глава 48. Управляемое вращение и перемещение фигуры

Листинг 48.1. Код для проектирования и преобразования фигуры.

//Переменная 'i' для исходной позиции фигуры; int static i = 0;

//Вводим наш новый класс Animation: ref class Animation

{

//Объявляем и задаем шаги //горизонтального offsetX

//и вертикального offsetY перемещений //фигуры за один интервал времени Interval: float static offsetX = 6;

float static offsetY = 2; //Объявляем и задаем в градусах //шаг угла поворота фигуры: float static step_alpha = 6;

//Объявляем объекты класса GraphihPath: static GraphicsPath^ myGraphicsPath =

gcnew GraphicsPath();

static GraphicsPath^ myGraphicsPath2 = gcnew GraphicsPath();

//В классе Matrix объявляем //объекты-матрицы преобразований: //объект myMatrix1 - для поворота фигуры и

//объект myMatrix2 - для перемещения фигуры: static Matrix^ myMatrix1 = gcnew Matrix(); static Matrix^ myMatrix2 = gcnew Matrix();

//Вводим конструктор нашего класса для задания фигуры //в виде окружности (методом AddEllipse)

//и в виде линий (методом AddLine): public: Animation()

{

myGraphicsPath->AddEllipse(70, 70, 100, 100); myGraphicsPath->AddLine(75, 100, 165, 100); myGraphicsPath->AddLine(75, 140, 165, 140); //При помощи клонирования

//создаем объект myGraphihPath2

//как точную копию объекта myGraphihPath: myGraphicsPath2 =

(GraphicsPath^)myGraphicsPath->Clone();

}

246 Жарков В.А. Компьютерная графика, мультимедиа и игры на Visual C++ 2005

//Вводим метод FigureDraw для преобразования //и рисования фигуры:

public: void FigureDraw(Graphics^ myGraphics, int j)

{

//Перемещаем фигуру: myMatrix2->Translate(offsetX, offsetY); //При помощи клонирования

//создаем объект myGraphihPath,

//как точную копию объекта myGraphihPath2: myGraphicsPath =

(GraphicsPath^)myGraphicsPath2->Clone(); //Задаем точку, относительно которой //будет поворачиваться фигура:

PointF myPointF = myGraphicsPath->GetBounds().Location;

myPointF.X = myPointF.X + myGraphicsPath->GetBounds().Width / 2;

myPointF.Y = myPointF.Y + myGraphicsPath->GetBounds().Height / 2;

//Поворачиваем фигуру по часовой стрелке

//на один шаг step_alpha

//при помощи метода RotateAt класса Matrix: myMatrix1->RotateAt(step_alpha, myPointF); //Применяем метод Transform класса GraphicsPath //для трансформирования матриц myMatrix: myGraphicsPath->Transform(myMatrix1); myGraphicsPath->Transform(myMatrix2);

//Рисуем на экране преобразованную фигуру: myGraphics->DrawPath(gcnew Pen(Color::Red, 3), myGraphicsPath);

}

};

Листинг 48.2. Метод для элемента управления PictureBox.

//Объявляем объект нашего нового класса Animation: static Animation^ myAnimation = gcnew Animation();

private:

System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)

{

//Вызываем метод FigureDraw

//для рисования фигуры в i-м положении: myAnimation->FigureDraw(e->Graphics, i); //Задаем следующее i-е положение фигуры:

Глава 48. Управляемое вращение и перемещение фигуры

247

i = i + 1;

}

Чтобы установить значение свойства Interval компонента Timer в зависимости от свойства Value ползунка элемента управления TrackBar, дважды щелкаем элемент управления TrackBar в режиме проектирования. Появляется файл Form9.h с шаблоном, который после записи нашего кода принимает следующий вид.

Листинг 48.3. Метод для элемента управления TrackBar.

private:

System::Void trackBar1_Scroll(System::Object^ sender, System::EventArgs^ e)

{

//Включаем таймер Timer (задаем Enabled равным true): timer1->Enabled = true;

//Устанавливаем свойство Interval таймера Timer //в зависимости от перемещения ползунка Value: timer1->Interval = trackBar1->Value;

}

Чтобы подключить к работе таймер, дважды щелкаем значок для компонента Timer (ниже формы в режиме проектирования). Появляется файл Form9.h с шаблоном, который после записи нашего кода принимает следующий вид.

Листинг 48.4. Метод для компонента Timer.

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

//Перерисовываем элемент управления PictureBox //через каждый Interval времени: pictureBox1->Refresh();

}

Глава 49. Управляемое заполнение фигур

Листинг 49.1. Метод для элемента управления PictureBox.

//Объявляем глобальную переменную filled_height //для текущей высоты заполнения фигуры:

int static filled_height = 0; private:

System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e)

{

//Задаем стиль и цвет заполняющих элементов: HatchBrush^ myHatchBrush =

gcnew HatchBrush(HatchStyle::Cross, Color::Blue); //Заполняем прямоугольник

//на текущую высоту filled_height: e->Graphics->FillRectangle(myHatchBrush, 0, 0,

pictureBox1->Width, filled_height); //Увеличиваем текущую высоту заполнения

//на следующий шаг progressBar1.Step: filled_height = filled_height + progressBar1->Step;

}

Листинг 49.2. Метод для элемента управления TrackBar.

private:

System::Void trackBar1_Scroll(System::Object^ sender, System::EventArgs^ e)

{

//Включаем таймер Timer (задаем Enabled равным true): timer1->Enabled = true;

//Устанавливаем свойство Interval таймера Timer //в зависимости от перемещения ползунка Value: timer1->Interval = trackBar1->Value;

}

Листинг 49.3. Метод для компонента Timer.

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)

{

//Задаем максимальное значение progressBar1->Maximum //индикатора процесса,

//равное высоте заполняемой панели pictureBox1.Height: progressBar1->Maximum = pictureBox1->Height;

Глава 49. Управляемое заполнение фигур

249

//Если текущее значение Value индикатора //стало больше максимального значения:

if (progressBar1->Value >= progressBar1->Maximum)

{

//отключаем таймер: timer1->Enabled = false;

}

//иначе: else

{

//увеличиваем текущее значение Value индикатора //на величину шага Step: progressBar1->PerformStep();

//Перерисовываем PictureBox //через каждый Interval времени: pictureBox1->Refresh();

}

}

На листинге 49.1 заменим одну строку кода (с методом FillRectangle) на строку кода с методом FillPie:

e->Graphics->FillPie(myHatchBrush, 0, 0, pictureBox1->Width, pictureBox1->Height -

progressBar1->Height, 0, filled_height);

Соседние файлы в предмете Программирование на C++