Сейчас я завершаю разработку игры, поэтому в последнее время активно работаю с программой Instruments. Как выяснилось, она особенно актуальна для обнаружения в игре утечек памяти. Я подумал, что раз эта функция так полезна для меня, возможно, и другим пользователям будет интересно узнать, как с ее помощью выявлять утечки памяти.
Что такое утечка памяти и почему она так важна?
Утечка памяти происходит, когда программа утрачивает доступ к фрагменту информации, для которого выделялась динамическая память. В результате “утерянная” память больше не высвобождается. Такое обычно происходит, когда код включает функции “new“, “malloc” или “alloc” в отсутствие соответствующих им “delete“, “free” либо “release“.
При задействующихся функциях “new“, “malloc” и “alloc” операционная система выделяет программе фрагмент памяти, предлагая определенную область, находящуюся по конкретному адресу. При этом система рассчитывает, что на данный фрагмент памяти будет иметься ссылка (обычно в форме адресного указателя). По окончании работы с ним ОС ждет сообщения о последующих действиях (посредством обращения к функциям “delete“, “free” либо “release“).
Если в программе не остаётся указателей на адреса этих фрагментов, налицо утечка. Программа не знает расположения объектов в динамической памяти, соответственно, у нее нет возможности их удалить. Продолжить чтение »
Закончим эту серию статей, добавив к игре звуковое сопровождение. Поскольку это уроки для новичков, я не буду вдаваться в связанные с OpenAL и Audio Queues сложности. Сегодня мы займемся воспроизведением коротких звуков (менее 30 с). При отсутствии потребности в фоновой музыке это самый простой способ работы с аудио. (Конечно, можно было бы поставить 30-секундный фрагмент на циклическое воспроизведение, но до такого позора мы не опустимся.)
Проблема при таком подходе заключается в том, что одновременно может проигрываться не более одного аудиофайла. Что ж, приступим… Нам понадобится код прошлого урока который мы можно скачать по [этой ссылке] (воспользуйтесь своим или загрузите новый вариант). Сегодня мы будем работать с двумя звуками: один — для удара по мячу, второй — для набранного очка. Продолжить чтение »
Программирование игр на iPhone. Часть 3 — экранная заставка.
На этот раз я познакомлю с парочкой моментов, которые придадут игре более завершенный вид. Для начала добавим к игре заставку с пятном. (Вновь прошу прощения за отсутствие художественных талантов. С Photoshop’ом так и не подружился.)
Создаем экранную заставку.
Добавим к игре заставку, которая постепенно будет сменяться основным экраном игры. Для начала загрузим изображение и добавим в относящуюся к проекту папку “Resources“. Убедитесь, что опция копирования изображения в папку проекта помечена флажком. Продолжить чтение »
Для вывода сообщения “Sending…” над клавиатурой приложение “Text” (SMS) на iPhone использует отдельное полупрозрачное представление. Я расскажу о простом классе, который может выводить полупрозрачные сообщения о загрузке, и научу располагать эти сообщения над клавиатурой.
Сообщения “Loading…”
Процесс загрузки данных из Интернета в большинстве приложений iPhone сопровождается почти черным полупрозрачным интерфейсом, заслоняющим экран. Дополнительные элементы — простейший “счетчик” (UIActivityIndicatorView), подтверждающий, что приложение активно, а также текст “Loading…“.
Несмотря на то, что это сообщение используется практически повсеместно, оно не относится к стандартным элементам управления и создается вручную.
Поиск клавиатуры.
Apple не предлагает методов обнаружения клавиатуры и даже текущего “First Responder” для приложения iPhone. Я покажу, как это делается.
Пробное приложение.
Рассматриваемое в данной статье тестовое приложение “LoadingView” предлагает два типа окон загрузки: Продолжить чтение »
Те, кому приходилось создавать для iPhone приложения, требующие ввода числовых данных, наверняка знакомы с клавиатурой “UIKeyboardTypeNumberPad“. И они уже, конечно же, заметили, что ей не хватает одного важного элемента — в методе “UIKeyboardTypeNumberPad” нет клавиши “return“.
Для любого другого типа клавиатуры (кроме практически аналогичной “UIKeyboardTypePhonePad“) можно задать возможность исчезновения, настроив свойство “returnKeyType” для соответствующего реализатора “UITextInputTraits“. Как же добиться этого с цифровой клавиатурой? Способ есть!
Взгляните на цифровую клавиатуру — и увидите свободное место внизу слева. Вот туда мы и вставим нашу собственную клавишу “return“.
Продолжить чтение »
Часть 2 — взаимодействие с пользователем, простейший интеллект, логика игры.
В очередном уроке по программированию игр на iPhone рассмотрим основы взаимодействия с пользователем, простейшей интеллект и логику игры. Мы научимся обнаруживать простые столкновения, чтобы знать, когда мяч соприкасается с ракеткой. Идя навстречу многочисленным пожеланиям, я добавляю к урокам раздел “Задачи”, где буду давать дополнительные советы по освоению программирования. Итак, приступим. Для начала откройте код из первой части урока.
Взаимодействие с пользователем.
Первым делом приступим к реализации взаимодействия с пользователем. Все, что нам нужно, — перемещать точку нахождения ракетки X в точку Х касания экрана пользователем. Это крайне простая реализация, которую можно серьезно усовершенствовать (подробнее об этом в “Задачах” в конце урока). Откройте файл “iTennisViewController.m” и добавьте следующий код:
Продолжить чтение »
Это первая из серии статей о пошаговом создании игр для iPhone. Не для кого не секрет, что освоение OpenGL и Quartz требует солидной подготовки. В этом уроке мы упростим процесс разработки, не прибегая к данным технологиям. Для графики воспользуемся классом UIImageView.
В двух частях я расскажу абсолютно обо всех аспектах разработки игры для iPhone. Приложение будет включать графику, звуки, механизм и даже простейший компьютерный интеллект.
Игра, которой мы займемся, называется iTennis (по правилам и механизму это аналог Pong). Я выбрал ее в качестве первого варианта, поскольку iTennis не требует особой анимации. Вот это как будет выглядеть на практике:

Приступаем… Все необходимые для проекта изображения находятся [здесь].
Продолжить чтение »
В этом уроке мы научимся создавать в редакторе Interface Builder интерфейс и привязывать его к собственному коду. Займемся мы этим на примере объектов “UITextField“, “UILabel” и “Button“. Сразу предупреждаю, что урок длинный, поскольку я буду подробно расписывать каждый шаг. При желании для начала просмотрите его, чтобы получить общее представление. Вот как будет работать приложение:
- Пользователь жмет на текстовое поле, вызывая клавиатуру iPhone.
- Пользователь вводит имя на клавиатуре.
- Пользователь нажимает кнопку.
- Появляется приветственная надпись с его именем (напр., “Hello Brandon!”)
- Если текст не набран, появляется предложение его ввести (напр., “Please Enter Your Name”)
В этом уроке мы научимся:
- Создавать новое приложение на основе представления (view-based).
- Создавать простой пользовательский интерфейс.
- Писать код для привязки к интерфейсу.
- Устанавливать связи между интерфейсом и кодом.
- Обновлять интерфейс в зависимости от действий пользователя. Продолжить чтение »
Думаю, все знакомы с эмуляторами ударных установок. Сделать такое приложение довольно просто. В этой статье мы создадим Bickboxx — реальное приложение из iTunes App Store.
Если хотите получить представление о том, чем мы займемся, скачайте Bickboxx из iTunes App Store (бесплатно). Исходный код можно скачать [здесь]. Его можно свободно загружать, сообщать о найденных проблемах — вплоть до создания собственных версий с изменениями, которые считаете целесообразными.
Примечание: для работы с уроком исходный код скачивать необязательно.
Начинаем.
Создайте в XCode новый проект на основе представления (View-based) и присвойте ему имя “Bickboxx“. Продолжить чтение »
Вот мы и добрались до второй части урока по настройкам приложения. В этот раз нам предстоит разобраться со значениями для него по умолчанию. Сделаем мы это по методу 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]; |
Продолжить чтение »
|
Последние комментарии
Всем ! Заходите на Фан-Футбол...
Windows Phone MarketPlace -...
Планируем приобрести дробемет и...
Как добавить в...
currentTitle = [[NSMutableString alloc] init];...