Создание копий картинок в разных местах формы в VisualStudio

Страницы работы

Содержание работы

Создадим новый проект (WindowsApplication). Название проекта «CloneAttack». В проекте будет одна форма, которая создана по умолчанию (рис.1).

Рис. 1 Вид проекта

Задача проекта заключается в том, чтобы автоматически создавались копии картинки в разных местах формы, и все созданные картинки двигались бы вправо.

Для начала необходимо добавить картинку, с которой будут делаться копии (клоны). На форму проекта нанесем картинку (pictureBox). В картинку вставим любое изображение (свойство картинки «Image»). Дизайн формы показан на рисунке 2.

Рис. 2 Добавление картинки на форму

Сама эта картинка не должна быть видна на форме, при запуске проекта. С нее будут делать лишь копии. Поэтому у картинки установим свойство «Visible» в значение «False» (рис.3).

Рис. 3 Картинка будет невидима при запуске проекта

Далее в прект два таймера. Первый таймер будем использовать для создания копий картинки, а второй таймер будер передвигать картинки по форме вправо. Добавление таймеров на форму показано на рисунке 4.

Рис. 4 Добавление таймеров на форму

Добавим на проект кнопку и у нее установим надпись «Attack». Эта кнопка будет запускать таймеры. Добавление кнопки на форму показано на рисунке 5.

Рис. 5 Добавление кнопки на форму

Начнем нашу программу с первого таймера. Его задача – создавать копии картинки. Для этого создадим событие для таймера (два раза кликнуть мышкой на элемент tamer1). Код события представлен на рисунке 6. В первой строчке создаем элемент картинки с названием «newButterfly». Название элемента можно давать любое. Следующие пять строчек присваивают необходимые параметры новой картинке согласно pictereBox1. То есть получается, что «клон» на самом деле полность независимая картинка. Просто у «клона» некоторые ключевые параметры равны исходной («радительской») картике. Последняя строчка обавляет новую картику в контролы формы (this.Controls).

Рис. 6 Код создания копий картинки

Для события кнопки (два раза кликнуть по кнопке) запишем код запуска таймера, который создает копии картинки (рис.7).

Рис. 7 Запуск таймера по созданию копий картинки

Проверим как работает проект. При нажатии кнопки зрительно ничего не происходит (рис.8). Это связано с тем, все копии имеют такие же координаты на форме (свойства «Left» и «Top») как и родительская картинка. Они все просто накладываются друг на друга.

Рис. 8 Запуск процесса создания «клонов»

Следующей задачей является движение созданных копий вправо. Тогда сразу будет видно, сколько копий было создано (так как создаются они не одновременно, а через промежуток времени, хоть и не большой). За движение «клонов» отвечает второй таймер.

Создадим событие второго таймера (два раза кликнуть мышкой на элемент tamer2).

Суть движения картинок заключается в следующем. Нам неизвестно как называются картинки, которые создаются в первом таймере. Но нам известно, что у всех «клонов» изображение такое же как у «родительской» картинки. Поэтому вычислить «клоны» можно перебирая все элементы формы (this.Controls) и просматривая, какие из них имеют изображения подобное «родительской».

Для начала напишем код перебора всех элементов формы (рис.9).

Рис. 9 Код перебора всех элементов (контролов) формы

При переборе всех элементов каждый вновь выбранный элемент будет называться «picture» (название можно дать любое). Теперь необходимо из всех элементов отсеять «родительскую» картинку (pictureBox1). Так как эту картинку двигать вправо не будем. Код отсеивания показан на рисунке 10. Знак «!=» означает «не равно».

Рис. 10 Отсеивание «родительской» картинки (pictureBox1)

Теперь внутрь конструкции «if» пройдут все элементы формы кроме pictureBox1. Но ведь на форме много и других ненужных элементов, например кнопка или таймер. Поэтому далее необходимо оставить  только элементы, которые являются картинками. Для определения типа элемента используется показанный на рисунке 11.

Рис. 11 Выбор элементов-картинок (тип «PictureBox»)

Сейчас внутрь второй конструкции «if» пройдут все картинки кроме pictureBox1. Но на форме могут находиться различные картинки. Необходимо оставить  только картинки, у  которых изображение (свойство «Image») равно «родительскому».  

Но, чтобы можно было сравнивать элемент, который перебирается и pictureBox1, необходимо сначала элемент (название «picture») привести к картинке. Это показано в первой строчке выделенного кода. Причем делаем при помощи создания новой переменной «newP».

Теперь элемент «newP» можно сравнивать с элементом pictureBox1. Если у них изображение одинаковое, то значит элемент и есть наш очередной «клон», который сдвигаем вправо на десять пунктов. Код показан на рисунке 12.

Рис. 12 Выбор картинок «клонов» и сдвиг их влево на 10 пунктов

Для события кнопки добавим код запуска второго таймера, который двигает «клоны» вправо (рис.13).

Рис. 13 Запуск второго таймера для сдвига «клонов»

Проверим как работает проект. При нажатии кнопки будут создаваться «клоны» и двигаться вправо. Но зрительно будет выглядеть как движение одной картинки, оставляющей после себя след (рис.14). Это связано с тем, что «клоны» создаются слишком часто, и один «клон» накладывается на другого.

Рис. 14 Создание и движение «клонов» (слишком частое создание)

Что устранить эту проблему сделаем процесс создания «клонов» помедленнее. Сейчас каждый новый «клон» создается в каждый тик таймера (, а таймер тикает примерно десять раз в секунду).

Сделаем так, что «клон создавался» только на каждый десятый тик таймера. Для этого введем переменную «С», которая увеличивается на один, начиная с ноля каждый тик. И только как переменная «С» становится больше 10, будем создавать новый «клон». При этом переменную «С» делаем равное нолю, чтобы пошел новый отсчет до десяти. Таким образом, новый «клон» создается только одни раз за каждые десять тиков таймера. Код показан на рисунке 15. Обратите внимание, что переменная «С» объявлена за пределами события таймера (иначе она сможет увеличиваться до десяти,  обнуляясь с каждым новым тиком).

Рис. 15 Замедление процесса создания «клонов»

Проверим как работает проект. При нажатии кнопки будут создаваться «клоны» и двигаться вправо (рис.16). Для увеличения или уменьшения скорости создания или движения «клонов» можно изменять значения сдвига влево во втором таймере (newP.Left += 10) или изменять количество холостых тиков первого таймера (if C > 10).

Рис. 16 Создание и движение клонов (приемлемая скорость)

Модернизируем проект. Сделаем так, чтобы каждый новый «клон» создавался по вертикали в случайном месте, и продолжал двигаться вправо.

Сейчас каждый «клон» принимает месторасположение («Left» и «Top») как у «родительской» картинки. Нам необходимо случайным образом менять свойство «Top» (расположение по вертикали). Для генерации случайного числа используется переменная типа «Random». На рисунке 17 показано объявление переменной «r» типа «Random» (за событием таймера, где уже есть переменная «С») и вычисление случайного значения в пределах от ноля до трехсот.

Рис. 17 Случайная генерация для свойства «Top»

Проверим как работает проект. При нажатии кнопки будут создаваться «клоны» в разных местах по вертикали и двигаться вправо (рис.18). Изначальная задача проекта выполнена.

Рис. 18 Готовая «Атака клонов»

1) Самостоятельно сделать «атаку клонов» не слева направо, а сверху вниз.

2) Сделать «ловца» для «клонов». То есть совместить предыдущую работу с нынешней. Причем, размещение кода попадания «клона» в «стенку» показано на рисунке 19.

Рис. 19 Размещение кода попадания «клонов» в «стенку»

Похожие материалы

Информация о работе

Предмет:
Информатика
Тип:
Методические указания и пособия
Размер файла:
280 Kb
Скачали:
0