Посуда в нашем доме всегда была чистая. Потому что после трапезы мы играли в японского дурака. Папа, мама, братья, дети садились за стол (вернее не вставали от него) и играли, пока не была вымыта последняя сковородка.
Игра очень простая, быстрая и азартная. Один на один. Колода 36 карт. Разыгрывалось 18 взяток. Кто брал меньшее число взяток — тот мыл тарелки. Например, я выиграл 11 взяток, соперник — 7. Неудачник отправлялся мыть 11 — 7 = 4 посудины. Было выгодно проигрывать первые игры, пока оставались слегка запачканные вилки, чайные ложки и стаканы. Под конец бедолаге оставались лишь жирные сковородки и неподъемные кастрюли.
К сожалению, прошло время, и я стал жить вдали от родного дома. Скучал по родителям, игре и чистой посуде.
Да-да, однажды мне надоело скучать, и я написал Японского Дурака для iPhone и Японского Дурака для iPad.
Что было интересного при создании карточных игр, читайте в моем скромном опусе.
Мотивация
С появлением Xcode 6.4 я стал настолько ленив, что выпускаю игры, на создание которых уходит не более 48 часов грязного времени. Я долго зрел для создания японского дурака. Думал, ворочался перед сном. Толчком для старта послужил неожиданный всплеск популярности карточных игр для iOS.
Судите сами, мои старые карточные игры (Кинг и Диабло) приносили в течении последних 3 лет по 1 доллару в день. И вдруг последние полгода Admob и Chartboost реклама стала приносить на порядок больше. Доходы от Admob выросли до $2-$10 в день с приложения. Без всяких манипуляций с моей стороны.
Рис. 1 Доходы от Chartboost за последнее воскресенье от карточных игр.
Был еще повод создать эту игру, но повод печальный. Эх-эх…
Монетизация
В Японского я тоже поместил показ рекламы. Но с интересом. Если игрок набирает нужное число побед — реклама отключается.
Какие использовать рекламные площадки?
Несмотря на увлекательный доклад про аукцион второй цены, прочитанный Павлом Голубевым на Мобильных Белых Ночах пару недель назад, я в целях экономии времени оставил прежнюю связку рекламных площадок.
Во время игры внизу показывается баннер от AdMob (я настолько к нему привык, что без него чувствую дискомфорт), а после проигранного раунда показываю видео-рекламу от Chartboost.
Во время отладки произошел забавный эпизод. AdMob мне стал показывать рекламу об удлинение хм, хм, — читатели-мужчины знают чем речь.
На отключение этого баннера я потратил усилий больше, чем на реализацию алгоритма игры за соперника.
Разработка
Все сделал на Obj-C, к Swift отношусь настороженно, но документацию почитываю.
Дизайн.
Если принять логическую ширину экрана в 320 точек, то оптимальный размер игральной карты — 66 на 96 пикселей. При этом карта описывается как UIView, содержащий 4 UIImageView.
Рис.2 Образец игральных карт
На рисунке видно, что UIImageView разделены на пустую карту, масть и достоинство игральной карты, расположенных в верхнем левом углу и большую картинку, сдвинутую в правый нижний угол. Все прочие элементы избыточны. Дублирование рисунков реальных карточных колод является, на мой взгляд, несуразным для маленького экрана смартфона.
В свою очередь большие лицевые картинки игральных карт являются составными — голова героя, прическа (8 штук), глаза(7 штук), рот(6 штук) и рубашка(4). Эти же элементы я использую для выбора соперника — всего 8*7*6*4 = 1200 различных персонажей с различной манерой поведения.
Для отображения лично хозяина айФона, как главного героя, я использую аватарку из Game Center. Поскольку алгоритм выдергивания личной фотографии из GC мной не найден, рискну предложить свой вариант. Критика приветствуется.
-(void)authenticateLocalPlayer{ GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error){ if (viewController != nil) { // зарегистрироваться бы [self presentViewController:viewController animated:YES completion:nil]; } else { // аа!! уже зарегистрирован if ([GKLocalPlayer localPlayer].authenticated) { // Get the default leaderboard identifier. [[GKLocalPlayer localPlayer] loadDefaultLeaderboardIdentifierWithCompletionHandler:^(NSString *leaderboardIdentifier, NSError *error) { if (error != nil) { NSLog(@"%@", [error localizedDescription]); } }]; // А вот тут сцуко выдергиваем твое фото [[GKLocalPlayer localPlayer] loadPhotoForSize:GKPhotoSizeSmall withCompletionHandler:^(UIImage *photo, NSError *error) { if (photo != nil) { // и запихиваем его во View, где морда героя будет светиться при просмотре текущего счета [scoreView storePhoto: photo]; } if (error != nil) { NSLog(@"%@", [error localizedDescription]); } }]; } } }; } ... IBOutlet UIImageView *myPhoto; ... -(void) storePhoto: (UIImage*) photo { myPhoto.image = photo; }
Трюки разные всякие
Раскруткой игр я не занимаюсь. Дело это совершенно для профессионалов или бездельников. Платные игры без раскрутки вообще не приносят загрузок. А Вы не знали? В день в магазине Apple появляются 1000+ игр (тысяча, Карл!!), и платные никто не видит. Бесплатные также никто не видит, если о них никто-никто не расскажет.
Я использую простой трюк — игра всегда платная, но раз в 2 недели объявляется бесплатной на 2 дня. Эти сроки (2 недели и 2 дня) проверены мной на 100 авторских играх и им можно верить. Иногда распродажу можно делать 3 дня. Лучшее время для sales = это воскресенье+понедельник. При этаком трюке некоторые игры получают до 500 скачек. А бывает 20. Здесь уже важно название, описание, картинки, видео.
Видео для игры делается в связке QuickTime (сдергивает 30 секундный ролик с экрана пришпиленного iPhone) и HandBreak для редактирования видео в правильный формат 30 кадров в секунду.
Пример видео имеется в магазине.
Еще трюк
Я выпускаю всегда два приложения — отдельно для iPhone и отдельно для iPad. Хотя они универсальные. Зачем? Два абсолютно одинаковых приложения — отличный полигон для эксперимента с рекламой, ключевыми словами, иконкой и прочей атрибутикой. Что увеличивает загрузку, а что — тормозит. Что использовать для interstitial — Гугл или Чартбуст( ЧартБуст — правильный ответ). Возможно, есть еще какие-то плюсы от дуализма. Минусов не замечал. Впрочем мужчины меня поймут, у нас много что продублировано в организме. И лишним это никто не считает.
Правила игры
Ходит игрок, взявший последнюю взятку или следующий за раздавшим карты.
Ходить можно любой открытой картой или картой с руки.
В ответ противник должен положить карту обязательно той же масти. Если нет масти — обязательно козырь.
Взятку из двух карт забирает тот, чья карты старше.
прим. Козырь назначает противник раздающего по своим первым трем картам.
Надеюсь, было нескучно.
ссылка на оригинал статьи http://habrahabr.ru/post/262589/
Добавить комментарий