
лабораторные работы / ООП движение2
.docЦель работы: Научиться создавать движение объектов на форме, описывать уравнения движения объектов на форме, управлять движением объектов на форме.
Основные понятия
Движение объекта на форме — изменение параметров, отвечающих за расположение объекта на форме в ходе выполнения программы.
Основными, параметрами, которые отвечают за расположение объекта на форме являются:
- параметр LEFT — отвечает за расположение объекта на форме по горизонтали (отсчет начинается с левого края формы);
- параметр TOP — отвечает за расположение объекта на форме по вертикали (отсчет начинается с верхнего края формы).
Данные параметры могут быть применены к любому обычному элементу управления, расположенному на форме.
Технология работы
Пример 1
На форме расположим четыре кнопки (рисунок 1).
Р
исунок
1 — Окно расположения элементов на
форме.
При нажатии на кнопку она должна перемещаться в тот угол формы, который на ней указан.
Например, кнопка «Правый верхний» должна перемещаться в правый верхний угол формы. Соответственно координата по вертикали у нее должна быть равна нулю, координату по вертикали можно определить из свойств формы.
Ширина формы (свойство Width) равна 300, следовательно, для правого края координата по ширине будет равна 300.
при нажатии на кнопку координаты будут меняться, следовательно, процедура для соответствую шей кнопки будет выглядеть следующим образом:
private void button2_Click(object sender, EventArgs e)
{
button2.Top = 1;
button2.Left = 300-63;
}
В свойстве TOP из ширины формы вычитали ширину самой кнопки, чтобы объект после перемещения был виден на экране.
В результате выполнения получим следующее (рисунок 2)
Р
исунок
2 — Результат выполнения процедуры по
перемещению кнопки.
Самостоятельно создайте процедуры для остальных кнопок, чтобы они перемещались в нужном направлении.
Пример 2
Можно создать управляющие элементы для объекта. Создадим следующую форму (рисунок 3)
Р
исунок
3 — Расположение элементов на форме
Рассмотрим процедуру для движения элемента направо (кнопка «Направо»)
private void button2_Click(object sender, EventArgs e)
{
pictureBox1.Left = pictureBox1.Left + 5;
}
При нажатии на кнопку «Направо» объект будет перемещаться вправо на 5 единиц.
Самостоятельно создайте процедуры для движения объекта в другие направления.
Пример 3
Также можно задать автоматическое движение объекта по времени. Для этого необходимо использование компонента Timer
Расположим на форме следующие элементы (рисунок 4)
Р
исунок
4 — расположение элементов на форме
Кнопка «Старт» запускает движение (прописанное в таймере), следовательно, процедура для кнопки «Старт»:
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
}
кнопка «Стоп» останавливает таймер:
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
}
В таймере описано движение:
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Left = pictureBox1.Left + 1;
}
Скорость движения объекта будет зависеть от интервала таймера.
Однако, при выполнении данной команды, объект выйдет за пределы области видимости и будет продолжать двигаться дальше, сделаем так, чтобы объект дойдя до конца формы, начинал движение сначала:
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Left = pictureBox1.Left + 1;
if (pictureBox1.Left>332) pictureBox1.Left=0;
}
(значение 332 в данном случае выбрано как ширина формы),
Сделаем так, чтобы объект, дойди до конца формы разворачивался и двигался в обратную сторону:
private void timer1_Tick(object sender, EventArgs e)
{
if (pictureBox1.Left == 210) a = 2;
if (pictureBox1 .Left == 0) a = 1;
if (a == 1) pictureBox1.Left = pictureBox1.Left + 1;
if (a == 2) pictureBox1.Left = pictureBox1.Left - 1;
}
где число 210 - ширина формы минус ширина объекта;
Изначально значение переменной a устанавливается равное 1 и объект начинает двигаться в правую сторону, поэтому переменную а объявляем как глобальную:
public static int a=1;
Самостоятельно создайте аналогичное движение объекта:
-
По вертикали;
-
По диагонали.
ДВИЖЕНИЕ С ПОМОЩЬЮ МЫШКИ
Основные команды
MousePosition.X-опеределяет координату Х курсора на экране
MousePosition.Y-опеределяет координату Y курсора на экране
Location.X – определяет координату Х положения окна на экране
Location.Y – определяет координату Y положения окна на экране
e.X - поределяет координату Х курсора относительно объекта вызвавшего событие
e.Y - поределяет координату Y курсора относительно объекта вызвавшего событие
button1.Location – поределяет координаты положения кнопки на форме
button1.Width – ширина кнопки
MouseMove()-событие возникающее при движении курсора мыши над объектом
MouseDown()-событие возникающее при нажатии на кнопку мыши
MouseUp()-событие возникающее при отпускании на кнопки мыши
Для создания движения с помощью курсора мыши необходимо:
- создать переменную класса Point для хранения текущего положения курсора
Point Mlok;
- создать переменную типа bool для хранения состояния клавиши мыши
bool click=false;
- описать реакцию мыши на нажатие и отпускание клавиши мыши по кнопке
private void button1_MouseDown(object sender, MouseEventArgs e)
{
click = true;
}
private void button1_MouseUp(object sender, MouseEventArgs e)
{
click = false;
}
- описать реакцию на движение курсора мыши по кнопке:
Если кнопка мыши нажата, то вычисляем необходимую позицию кнопки и задаем её.
private void button1_MouseMove(object sender, MouseEventArgs e)
{
if (click)
{
Mlok.X = MousePosition.X-button1.Width/2-Location.X;
Mlok.Y = MousePosition.Y-30-Location.Y;
button1.Location = Mlok;
}
}
ДВИЖЕНИЕ С ПОМОЩЬЮ КЛАВИАТУРЫ
Основные команды
e.KeyCode – возврвщает код нжатой клавиши
Keys.Up – содержит в себе код клавиши ↑ (вверх)
button1.Top – указывает положение кнопки от верхнего края формы
button1.Left - указывает положение кнопки от левого края формы
button1.Focus() – принудительно передает фокус объекту
Для создания движения с помощью клавиатуры необходимо:
- создать переменную типа int для хранения шага, и задать его
int step=10;
- описать реакцию на нажатие клавиши клавиатуры когда необходимый объект находится в фокусе:
Определяем какая клавиша нажата и меняем необходимые параметр.
private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Up)
{
button1.Top-=step;
}
if (e.KeyCode == Keys.Down)
{
button1.Top += step;
}
if (e.KeyCode == Keys.Right)
{
button1.Left += step;
}
if (e.KeyCode == Keys.Left)
{
button1.Left -= step;
}
}
Примечание: в том случае если на форме находится несколько объектов которые могут принимать фокус (становиться активными), то при нажатии на стрелки фокус будет переходить от одного элементра к другому.
Для того чтобы фокус оставался всегда на необходимом элементе все остальные нужно сделать неактивными (свойство Enabled), или в каждом объекте описать реакцию на получение фокуса. Где необходимо принудительно вернуть фокус вашему объекту.
private void button2_Enter(object sender, EventArgs e)
{
button1.Focus();
}