На этом уроке мы научимся по щелчку мышки стрелять по кораблям. Для этого нам понадобится создать обработчик MouseClick, и подцепить его к каждой картинке. Используя делегаты мы будем свистать всех на верх - до класса Form1, из которого будем спускаться по иерархии опять вниз, для пометки выстрела и отображения его на карте.
Дата отправки отчёта:
22 августа 2015 г.
Задание выполнено: за
1 час. 15 мин.
Чему научился:
продолжил работать с делегатами
Что было сложным:
см. отзыв
Комментарии:
Ну не согласен я с таким применением делегатов. Все то преимущество и ту простоту, которое дает механизм делегатов при таком раскладе превращается в запутанное сложное спагетти. Ну ладно, Бог с ним, по каким то религиозным соображениям Витольдович не хочет применять события си шарпа (хотя здесь бы функционал собятия пригодился бы). Но уж больно на костылях как то все получилось прикручено, да еще и не туда. Позвольте мне нескромно предложить свою скромную версию: <br> Во первых, в чем суть расклада - нам нужно информацию о клике мышкой (какой океан, какая клетка) передать в нужный океан и изменить состояние связанных с ним данных. Сразу вопрос: при чем тут Form, зачем нам его в это впутывать? Так и сказал кто то из курсантов, делегат должен вызывать методы экземпляров класс океан. Как океаны должны узнавать что это относится именно к этому конкретному океану - это уже другой вопрос. Собственно для этого и существует механизм "издатель - подписчики". <br>
Итак. <br> 1. Где угодно вне класса объявляем наш делегат. <br> 2. В классе PictureBox объявляем статический экземпляр делегата: public static deBoxClicked deClick; <br> 3. Там же: <br> private void Box_MouseClick(object sender, MouseEventArgs e) { deClick.Invoke(place, mapx, mapy); } <br> 4. В классе Ocean в функцию Create добавляем в конец: public void Create() {
.............. Box.deClick += BoxClicked; }
<br> 5. Там же в классе Ocean: public void BoxClicked(int place, int mapx, int mapy) { if (this.place == place) MessageBox.Show("я " + title + " океан. " + "Я знаю, что щелкнули по МОЕЙ клетке " + " " + mapx + " " + mapy); } <br> Результат манипуляций на скриншоте 1. <br>. Думаю понятно, что целевой океан получает информацию о клике и дальше дело техники написать функцию изменение состояния именно этого океана.
<br> Витольдович, сорри. Так мне не понравилась именно эта конкретная реализация, что вот родилось столько букв.
Научился: Еще раз попрактиковал делегаты. Трудности: Делегаты все-таки остались самым сложным, уж больно много для них надо инициализаций. Продвигаюсь вперед , и это радует. На мой взгляд получается красиво.