![]() |
|
|
![]()
|
|
| kindanew |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Добрый день!
Есть игра. На экран выводится куча объектов UnitView класса UIView. UnitView имеет в свойствах модель класса Unit. В классе UnitView при инициализации добавляется UIGestureRecognizer. Есть класс Game, в котором логика. Во ViewController-е импортируется Game.h и UnitView.h. Суть вопроса. При SwipeDown на UnitView нужно выполнить метод класса Game, который удаляет из массива array тот самый Unit. Думается мне, что Import "Game.h" в UnitView не очень хорошее решение? Прав ли я? Правильно ли добавлять UIGestureRecognizer в Init'е класса UnitView : UIView ? Как быть, если нужно выполнить метод удаления из массива в touchesEnded, а не только по swipeDown? Спасибо! |
|||
|
||||
| Bitter |
|
||||||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
Да не очень хорошее. Вам в этом случае нужно написать протокол в классе UnitView. и объявить делегата поддреживающего этот протокол. Когда делаете свайп, то вызываете метод протокола у делегата. Делегатом назначите ваш Game в момент создания UnitView.
Очень даже правильно
если метод touchesEnded вызывается у UnitView, то просто вызывайте тот же метод делегата. Да и не забудьте в метод передать ссылку на UnitView, чтоб знать кого удалять. |
||||||
|
|||||||
| kindanew |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Bitter, Спасибо за ответ.
С делегатом мне показалось как-то не очень красиво. Смотрел в сторону центра уведомлений. |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
kindanew, не советую, вы только хуже сделаете. Во-первых это вас приведет к утечкам, так как вы точно где-нибудь забудете удалить подписку, а во-вторых это запутывает программу превращая ее в индус-код
Добавлено через 1 минуту и 7 секунд делегаты это отличный паттерн, к тому же он не вызывает путаницы в коде. |
|||
|
||||
| kindanew |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Bitter, хорошо, спасибо!
Буду сегодня пробовать. |
|||
|
||||
| kindanew |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Чот не получается ;)
Добавлю ещё немного описания. UnitView создается в контроллере GameViewController. Game создается при нажатии на кнопку тоже в GameViewController. Game и GameViewController общаются через delegate. UnitView и Game никак не связаны, но нужно выполнить метод в Game. Создал протокол. Импортировал его в UnitView и в Game В UnitView добавил свойство
Последовательность создания объектов такая: В Game создается игра и посылается сообщение в контроллер (надо нарисовать юнитов)
а вот в этом mustCreateUnits создаются вот эти UnitView : UIView. грубо говоря
т.е. теперь, вроде как, UnitView может общаться с Game, но этого не происходит. Может быть стоит добавить ещё один класс, в котором будет массив живых юнитов и убитых? Меня код особо не интересует, код я напишу, меня интересует, как обычно такое реализуется? Каким-то образов нужно реагировать на нажатие на юнитов и передавать это всё в логику. Может быть GameViewController должен вызывать метод в Game? Т.е. UnitView говорит в GameViewController - меня убили , GameViewController посылает сообщение в логику Game ? |
||||||
|
|||||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
Да это вы правильно написали. Теперь вы из юнита можете вызывать методы делегата, которые нужно реализовать в game. Почему могут не общаться: делегат = nil, метод в делегате не описан, метод который вызывает методы делегата не вызвался. ну вообще то на UIView игры писать не очень хорошо. Разве что крестики нолики. Потому что UIView не особо шустрый. Для это используйте движки типа Cocos2D и тд. И вот в таком случае старайтесь придерживаться архитектуры, в которой объект общается только с тем, кто его создал. В вашем случае Game должен создавать объекты игры, объекты должны общаться с Game. |
|||
|
||||
| kindanew |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Bitter, Cocos2D пока не хочу использовать.
По моему вопросу: скорее всего вот этот UnitView : UIView должен отправлять сообщение в контроллер, который его родил, а контроллер в свою очередь вызывает метод модели с целью переместить объект куда надо. |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
Вы хотели узнать как это обычно реализуется, я вам сказал как. Не хотите использовать то, что нужно использовать - зачем тогда спрашивали? )
По вопросу - зачем вы создаете объекты в контроллере, если они являются частью игры? А значит логически принадлежат к Game. Создавайте их там и управляйте ими там. У вас контроллер выполняет не свою задачу |
|||
|
||||
| kindanew |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Bitter, Да, до Cocos2D я ещё не дорос ;)
Вот! Мне показалось, что так принято делать, так сказать, БЭСТ_ПРАКТИКА. Т.е. контроллер создает визуальные объекты. Попробую перенести создание UIView в модель Game. Спасибо! Это сообщение отредактировал(а) kindanew - 5.3.2013, 14:43 |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 10 Всего: 27 |
Когда что-то моделируете, то старайтесь руководствоваться принципом "должно быть так, как в жизни" ) (сам только что придумал название)
Например если у вас есть объект "машина", то у него есть объект "ходовая", а у ходовой есть массив объектов "колесо". Но если вы сделаете объект Машина у которого массив {ходовая, руль, колесо, колесо, ...} то это не правильно. В жизни ведь не так. Или например у вас есть оружие которое стреляет пулей. Так вот пуля в жизни (ну во всяком случае упрощенно) сама управляет своим поведением в полете. То есть если вы сделаете выстрел и полетом пули будет управлять объект "оружие", то это не правильная архитектура. Однако объект пули создает именно оружие, а не персонаж или кто-то другой. Надеюсь хоть что-то понятно из того, что я написал ) |
|||
|
||||
| kindanew |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Да , спасибо! Буду осознавать. Завтра постараюсь рассказать о результатах. Чииррс! |
|||
|
||||
| kindanew |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Не было связи контроллера с Game.
Т.е. при создании Game нужно было контроллеру дать ссылку на этот класс, но такой строки не было. Получается я сам ошибся. |
|||
|
||||
![]()
|
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | iOS | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |