Май 19

Сейчас я завершаю разработку игры, поэтому в последнее время активно работаю с программой Instruments. Как выяснилось, она особенно актуальна для обнаружения в игре утечек памяти. Я подумал, что раз эта функция так полезна для меня, возможно, и другим пользователям будет интересно узнать, как с ее помощью выявлять утечки памяти.

Что такое утечка памяти и почему она так важна?

Утечка памяти происходит, когда программа утрачивает доступ к фрагменту информации, для которого выделялась динамическая память. В результате “утерянная” память больше не высвобождается. Такое обычно происходит, когда код включает функции “new“, “malloc” или “alloc” в отсутствие соответствующих им “delete“, “free” либо “release“.

При задействующихся функциях “new“, “malloc” и “alloc” операционная система выделяет программе фрагмент памяти, предлагая определенную область, находящуюся по конкретному адресу. При этом система рассчитывает, что на данный фрагмент памяти будет иметься ссылка (обычно в форме адресного указателя). По окончании работы с ним ОС ждет сообщения о последующих действиях (посредством обращения к функциям “delete“, “free” либо “release“).

Если в программе не остаётся указателей на адреса этих фрагментов, налицо утечка. Программа не знает расположения объектов в динамической памяти, соответственно, у нее нет возможности их удалить. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 3 »

Май 19

Закончим эту серию статей, добавив к игре звуковое сопровождение. Поскольку это уроки для новичков, я не буду вдаваться в связанные с OpenAL и Audio Queues сложности. Сегодня мы займемся воспроизведением коротких звуков (менее 30 с). При отсутствии потребности в фоновой музыке это самый простой способ работы с аудио. (Конечно, можно было бы поставить 30-секундный фрагмент на циклическое воспроизведение, но до такого позора мы не опустимся.)
Проблема при таком подходе заключается в том, что одновременно может проигрываться не более одного аудиофайла. Что ж, приступим… Нам понадобится код прошлого урока который мы можно скачать по [этой ссылке] (воспользуйтесь своим или загрузите новый вариант). Сегодня мы будем работать с двумя звуками: один — для удара по мячу, второй — для набранного очка. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (Оцените приложение)
Загрузка ... Загрузка ...
1 Комментарий »

Май 19

Программирование игр на iPhone. Часть 3 — экранная заставка.

На этот раз я познакомлю с парочкой моментов, которые придадут игре более завершенный вид. Для начала добавим к игре заставку с пятном. (Вновь прошу прощения за отсутствие художественных талантов. С Photoshop’ом так и не подружился.)

Создаем экранную заставку.

Добавим к игре заставку, которая постепенно будет сменяться основным экраном игры. Для начала загрузим изображение и добавим в относящуюся к проекту папку “Resources“. Убедитесь, что опция копирования изображения в папку проекта помечена флажком. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (3 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 5 »

Май 18

Для вывода сообщения “Sending…” над клавиатурой приложение “Text(SMS) на iPhone использует отдельное полупрозрачное представление. Я расскажу о простом классе, который может выводить полупрозрачные сообщения о загрузке, и научу располагать эти сообщения над клавиатурой.

Сообщения “Loading…”

Процесс загрузки данных из Интернета в большинстве приложений iPhone сопровождается почти черным полупрозрачным интерфейсом, заслоняющим экран. Дополнительные элементы — простейший “счетчик” (UIActivityIndicatorView), подтверждающий, что приложение активно, а также текст “Loading…“.

Несмотря на то, что это сообщение используется практически повсеместно, оно не относится к стандартным элементам управления и создается вручную.

Поиск клавиатуры.

Apple не предлагает методов обнаружения клавиатуры и даже текущего “First Responder” для приложения iPhone. Я покажу, как это делается.

Пробное приложение.

Рассматриваемое в данной статье тестовое приложение “LoadingView” предлагает два типа окон загрузки: Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (4 голосов, средний: 4.75 из 5)
Загрузка ... Загрузка ...
1 Комментарий »

Май 18

Те, кому приходилось создавать для iPhone приложения, требующие ввода числовых данных, наверняка знакомы с клавиатурой “UIKeyboardTypeNumberPad“. И они уже, конечно же, заметили, что ей не хватает одного важного элемента — в методе “UIKeyboardTypeNumberPad” нет клавиши “return“.

Для любого другого типа клавиатуры (кроме практически аналогичной “UIKeyboardTypePhonePad“) можно задать возможность исчезновения, настроив свойство “returnKeyType” для соответствующего реализатора “UITextInputTraits“. Как же добиться этого с цифровой клавиатурой? Способ есть!
Взгляните на цифровую клавиатуру — и увидите свободное место внизу слева. Вот туда мы и вставим нашу собственную клавишу “return“.

shotnodone Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (Оцените приложение)
Загрузка ... Загрузка ...
Нет комментариев »

Май 17

Часть 2 — взаимодействие с пользователем, простейший интеллект, логика игры.

В очередном уроке по программированию игр на iPhone рассмотрим основы взаимодействия с пользователем, простейшей интеллект и логику игры. Мы научимся обнаруживать простые столкновения, чтобы знать, когда мяч соприкасается с ракеткой. Идя навстречу многочисленным пожеланиям, я добавляю к урокам раздел “Задачи”, где буду давать дополнительные советы по освоению программирования. Итак, приступим. Для начала откройте код из первой части урока.

Взаимодействие с пользователем.

Первым делом приступим к реализации взаимодействия с пользователем. Все, что нам нужно, — перемещать точку нахождения ракетки X в точку Х касания экрана пользователем. Это крайне простая реализация, которую можно серьезно усовершенствовать (подробнее об этом в “Задачах” в конце урока). Откройте файл “iTennisViewController.m” и добавьте следующий код:

screenshot_012 Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 5 »

Май 17

Это первая из серии статей о пошаговом создании игр для iPhone. Не для кого не секрет, что освоение OpenGL и Quartz требует солидной подготовки. В этом уроке мы упростим процесс разработки, не прибегая к данным технологиям. Для графики воспользуемся классом UIImageView.

В двух частях я расскажу абсолютно обо всех аспектах разработки игры для iPhone. Приложение будет включать графику, звуки, механизм и даже простейший компьютерный интеллект.

Игра, которой мы займемся, называется iTennis (по правилам и механизму это аналог Pong). Я выбрал ее в качестве первого варианта, поскольку iTennis не требует особой анимации. Вот это как будет выглядеть на практике:

screenshot_011

Приступаем… Все необходимые для проекта изображения находятся [здесь].

Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (7 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 5 »

Май 17

В этом уроке мы научимся создавать в редакторе Interface Builder интерфейс и привязывать его к собственному коду. Займемся мы этим на примере объектов “UITextField“, “UILabel” и “Button“. Сразу предупреждаю, что урок длинный, поскольку я буду подробно расписывать каждый шаг. При желании для начала просмотрите его, чтобы получить общее представление. Вот как будет работать приложение:

  1. Пользователь жмет на текстовое поле, вызывая клавиатуру iPhone.
  2. Пользователь вводит имя на клавиатуре.
  3. Пользователь нажимает кнопку.
  4. Появляется приветственная надпись с его именем (напр., “Hello Brandon!”)
  5. Если текст не набран, появляется предложение его ввести (напр., “Please Enter Your Name”)

В этом уроке мы научимся:

  • Создавать новое приложение на основе представления (view-based).
  • Создавать простой пользовательский интерфейс.
  • Писать код для привязки к интерфейсу.
  • Устанавливать связи между интерфейсом и кодом.
  • Обновлять интерфейс в зависимости от действий пользователя. Продолжить чтение »
    1 звезда2 звезд3 звезд4 звезд5 звезд (10 голосов, средний: 4.60 из 5)
    Загрузка ... Загрузка ...
    Комментариев: 13 »

Май 16

bickboxx-1Думаю, все знакомы с эмуляторами ударных установок. Сделать такое приложение довольно просто. В этой статье мы создадим Bickboxx — реальное приложение из iTunes App Store.
Если хотите получить представление о том, чем мы займемся, скачайте Bickboxx из iTunes App Store (бесплатно). Исходный код можно скачать [здесь]. Его можно свободно загружать, сообщать о найденных проблемах — вплоть до создания собственных версий с изменениями, которые считаете целесообразными.

Примечание: для работы с уроком исходный код скачивать необязательно.

Начинаем.

Создайте в XCode новый проект на основе представления (View-based) и присвойте ему имя “Bickboxx“. Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (5 голосов, средний: 4.80 из 5)
Загрузка ... Загрузка ...
Комментариев: 10 »

Май 15

Вот мы и добрались до второй части урока по настройкам приложения. В этот раз нам предстоит разобраться со значениями для него по умолчанию. Сделаем мы это по методу applicationDidFinishLoading. Те, кто еще не прочел первую часть урока, могут сделать это [здесь] (все рассматриваемые ниже файлы были созданы на первом этапе).

Для начала откроем файл Root.plist и укажем для Title значение “RootPList” (в противном случае предложенный ниже код может не работать — по крайней мере, у меня дело обстояло именно так).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
FileName: ApplicationPreferencesTutorialAppDelegate.m
//Здесь мы указываем значения по умолчанию
NSString *textValue = [[NSUserDefaults standardUserDefaults] stringForKey:@"textEntry_Key"];

//Если первое значение равно нулю, значит, настройки по умолчанию не заданы.
if(textValue == nil)
{
//Получаем доступ к бандлу
NSString *bPath = [[NSBundle mainBundle] bundlePath];
NSString *settingsPath = [bPath stringByAppendingPathComponent:@"Settings.bundle"];
NSString *plistFile = [settingsPath stringByAppendingPathComponent:@"Root.plist"];

//Получаем из словаря массив настроек
NSDictionary *settingsDictionary = [NSDictionary dictionaryWithContentsOfFile:plistFile];
NSArray *preferencesArray = [settingsDictionary objectForKey:@"PreferenceSpecifiers"];

//Временные переменные
NSDictionary *item;
NSString *textEntry_Key;
NSString *readOnly_Key;
NSString *toogle_Key;
NSString *slider_Key;
NSString *colors_Key;

//Циклический поиск в массиве (элемента preferencesArray)
{
//Получение ключа элемента
NSString *keyValue = [item objectForKey:@"Key"];

//Получение значения по умолчанию из файла plist
id defaultValue = [item objectForKey:@"DefaultValue"];

if([keyValue isEqualToString:@"textEntry_key"])
textEntry_Key = defaultValue;

if([keyValue isEqualToString:@"readOnly_key"])
readOnly_Key = defaultValue;

if([keyValue isEqualToString:@"toogle_key"])
toogle_Key = defaultValue;

if([keyValue isEqualToString:@"slider_key"])
slider_Key = defaultValue;

if([keyValue isEqualToString:@"colors_key"])
colors_Key = defaultValue;
}

//Теперь, когда у нас есть все значения по умолчанию,
//Создаем его здесь.
NSDictionary *appPrerfs = [NSDictionary dictionaryWithObjectsAndKeys:
textEntry_Key, @"textEntry_key",
readOnly_Key, @"readOnly_key",
toogle_Key, @"toogle_key",
slider_Key, @"slider_key",
[NSNumber numberWithInt:1], @"slider_key",
[NSNumber numberWithInt:1], @"colors_key",
nil];

//Регистрируем и сохраняем файл на диск
[[NSUserDefaults standardUserDefaults] registerDefaults:appPrerfs];
[[NSUserDefaults standardUserDefaults] synchronize];

Продолжить чтение »

1 звезда2 звезд3 звезд4 звезд5 звезд (3 голосов, средний: 5.00 из 5)
Загрузка ... Загрузка ...
Комментариев: 2 »