. У разі метод, який запускає перевірку умов для появи вікна.- Ім'я повідомлення.- Це об'єкт, який відправив повідомлення (на той випадок, якщо потрібно отримувати це повідомлення від конкретних об'єктів).
Вирушати повідомлення будуть в декількох класах: [[NSNotificationCenter defaultCenter] postNotification name: NOTIFY_DROP_ITEM_DROPPED object: nil];
Після отримання повідомлення потрібно перевірити три ресурси: гроші, продукти і населення:
. Гроші: на гроші не накладаються ніякі обмеження, тому послідовно переглядаючи всі будівлі на карті, які їх виробляють, вважаємо будівлі з готовим ресурсом. Далі отримане число порівнюється із заданим умовою.
. Продукти: продукти залежать від вільного місця на складі, тому спочатку виявляємо всі будівлі з готовими продуктами, потім з'ясовуємо, чи вистачає для них всіх місця на складі. У разі нестачі потрібно впорядкувати всі продукти за вартістю продажу, вибрати найдорожчі, порахувати їх кількість. У разі якщо місця на складі достатньо для всіх ресурсів, також вважаємо їх кількість. Далі отримане число порівнюється із заданим умовою.
. Населення: населення залежить від обмеження рівня, тому спочатку виявляємо всі будівлі з готовими ресурсами, потім з'ясовуємо, чи вистачає для них всіх місця. У разі нестачі послідовно проглядаються, вважаються будівлі, з'ясовується кількість одержуваного з них населення і так до моменту, поки населення не перевищить обмеження. У разі якщо місця достатньо для всіх ресурсів, також вважаємо їх кількість. Далі отримане число порівнюється із заданим умовою.
Якщо всі три компоненти виконують умову, на панелі з'являється кнопка запуску вікна. Кнопка пульсує, привертаючи увагу гравця. Анімація реалізована за використання ігрового движка Cocos2d-iphone.
Поява кнопки в правому нижньому кутку відображено на малюнку 6:
Рис. 6. Відображення кнопки запуску вікна
Другий завданням є отрисовка вмісту таблиці у вікні. Вона складається з двох частин: організація осередку, тобто компоновка однакових ресурсів, і робота з функціоналом таблиці.
Осередок складається з зображення ресурсу і його кількості. Потрібно впорядкувати всі продукти за типом, згрупувати їх, таким чином визначаючи, яке їх кількість для кожного типу. Крім того, користуючись файлової системою проекту потрібно підібрати відповідне зображення. Для населення і грошей завжди береться одна і та ж картинка, а для продуктів інформація про потрібному зображенні зберігається в одній із змінних класу Resource.m.Так як даний спосіб створення осередку може бути використаний ще в якихось таблицях з нагородою, спеціально був створений клас RewardNode.m.
При отрисовке компонентів з використанням такого елемента середовища розробки Xcode як FormBuilder, складні графічні об'єкти базуються на спеціальному вигляді xml файлу - plist. У ньому зберігається інформація про те, як і де розташовані складові компонента. Для текстових частин можна вказати колір і розмір, кнопці може ставитися у відповідність посилання на функцію, зображення може масштабуватися. Клас RewardNode буде використовувати plist для організації комірки таблиці.
Після створення осередку потрібно організувати роботу таблиці. Таблиця створюється на основі такого механізму як CCScrollView, тому щоб отримати доступ до деяких методів цього класу, потрібно наслідувати основний клас CollectAll.m від скролла. CCScrollView клас належить ігровому движку cocos2d-iphone, який використовується в додатку. Так як функціонал даного механізму все ще знаходиться в розробці і він є лише контейнером для осередків, для його правильної роботи слід:
. Додати кнопки для прокрутки в обидві сторони. Використовуються такі дані як розмір сторінки прокрутки, розмір всього контейнера і розмір одного осередку, щоб вручну вказати, наскільки зрушиться сторінка прокрутки щодо всього його контейнера. Приклад методу для прокрутки вліво:
- (void) actionScrollLeft: (id) sender
{* rewardContainerScroll=(CCScrollView *) [_ buildernodeWithName: @ rewardContainerScroll ]; cellWidth=rewardContainerScroll.pageSize.width;
CGPoint pt=rewardContainerScroll.contentOffset; .x +=cellWidth; .x=roundf (pt.x/(float) cellWidth); (pt.x gt; 0)
{. x=0;
}. x *=cellWidth;
[rewardContainerScroll setContentOffset: pt animated: YES];
}
. Встановити розмір контейнера, для того щоб при перегортуванні осередку опинялися в кордонах наданої області
. Вказати, як буде вести себе прокрутка п...