Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
insrukcii k lr3_ robota z podiyamy.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
883.71 Кб
Скачать

Визуализация объекта, использующего эффект

Визуализация примитивов, использующих эффект, начинается с вызова метода effect.Begin() объекта эффекта. Далее приложение должно перебрать все проходы текущей техники (коллекцияeffect.CurrentTechnique.Passes ) и вызвать метод pass.Begin() для каждого прохода. Внутри прохода нужно визуализировать примитивы с использованием метода device.DrawUserPrimitives(). Визуализацию прохода нужно закончить вызовом метода pass.End(). По окончанию визуализации всего эффекта приложение должно вызвать метод effect.End().

  • Через контекстное меню перейдите в режим View Designer формы, выделите на ней объект xnaPanel1 и откройте панель Properties в режиме Events

  • Найдите событие Paint объекта xnaPanel1 и двойным щелчком на его поле справа создайте обработчик, который заполните так

private void xnaPanel1_Paint(object sender, PaintEventArgs e)

{

if (closing)

return;

try

{

if (device.GraphicsDeviceStatus == GraphicsDeviceStatus.Lost)

throw new DeviceLostException();

if (device.GraphicsDeviceStatus == GraphicsDeviceStatus.NotReset)

device.Reset(presentParams);

// Очищаем область экрана

device.Clear(XNAGraphics.Color.CornflowerBlue);

device.RenderState.CullMode = CullMode.None;

device.VertexDeclaration = decl;

// Задаем координаты вершин из установленного в группе панелей цвета

vertices[0] = new VertexPositionColor(new Vector3(0.0f, 0.8f, 0.0f), new XNAGraphics.Color(

vertex1Color.BackColor.R, vertex1Color.BackColor.G, vertex1Color.BackColor.B));

vertices[1] = new VertexPositionColor(new Vector3(0.8f, -0.8f, 0.0f), new XNAGraphics.Color(

vertex2Color.BackColor.R, vertex2Color.BackColor.G, vertex2Color.BackColor.B));

vertices[2] = new VertexPositionColor(new Vector3(-0.8f, -0.8f, 0.0f), new XNAGraphics.Color(

vertex3Color.BackColor.R, vertex3Color.BackColor.G, vertex3Color.BackColor.B));

effect.Begin();

foreach(EffectPass pass in effect.CurrentTechnique.Passes)

{

pass.Begin();

device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length / 3);

pass.End();

}

effect.End();

device.Present();

}

catch (DeviceNotResetException)

{

Invalidate();

}

catch (DeviceLostException)

{

closing = true; // Больше не выполнять OnPaint()

string title = "Сбой графического устройства";

string message = "Работа программы будет завершена.\n"

+ "Закройте все ненужные программы\n"

+ "и повторите запуск этого приложения";

MessageBox.Show(message, title, MessageBoxButtons.OK, MessageBoxIcon.Stop);

Application.Idle += new EventHandler(Application_Idle);

return;

}

catch (Exception ext) // Все другие исключения

{

closing = true;

MessageBox.Show(ext.Message);

Application.Idle += Application_Idle;

}

}

  • Выделите на форме объект xnaPanel1 и через панель Properties в режиме Events создайте обработчик события Resize, который заполните так

private void xnaPanel1_Resize(object sender, EventArgs e)

{

// Устанавливаем размеры заднего буфера по клиентской области панели

presentParams.BackBufferWidth = xnaPanel1.ClientSize.Width;

presentParams.BackBufferHeight = xnaPanel1.ClientSize.Height;

// Сбрасываем устройство и применяем к нему новые параметры

// Если окно не минимизировано

if (this.WindowState != FormWindowState.Minimized)

device.Reset(presentParams);

}

  • Выделите саму форму щелчком на ее заголовке и через панель Properties в режиме Events создайте обработчик события FormClosed, который заполните так

private void MainForm_FormClosed(object sender, FormClosedEventArgs e)

{

// Удаляем (освобождаем) устройство

device.Dispose();

// На всякий случай присваиваем ссылке на устройство значение null

device = null;

}

  • Осторожно (чтобы не создать обработчик) выделите все три кнопки на форме (удерживая клавишу Ctrl ) и через панель Properties в режимеEvents создайте обработчик события Click с именем vertexColor_Click, который заполните так

private void vertexColor_Click(object sender, EventArgs e)

{

Button button = (Button)sender;

colorDialog1.Color = button.BackColor;

if (colorDialog1.ShowDialog() == DialogResult.OK)

{

button.BackColor = colorDialog1.Color;

xnaPanel1.Invalidate();

}

}

  • В панели Solution Explorer выделите узел проекта Application2 и через контекстное меню сделайте проект стартовым. Запустите приложение - должен получиться такой результат

Замечание. Если приложение выдаст сообщение "Ошибка при компиляции эффекта...", то добавьте к проекту файл с эффектом ColorFill.fx из прилагаемой к работе папки Source, не редактируя его. Незабудьте в этом случае изменить свойство файла Copy to Output Directory на значение Copy if newer.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]