Жарков В.А. - Visual C++ 2005, DirectX 9.0c и Microsoft Agent в компьютерной графике, мультимедиа и играх (Листинги книги) - 2005
.pdf240 Жарков В.А. Компьютерная графика, мультимедиа и игры на 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);