Главная iPhone Mac OS X Форум О себе

Создаем приложение “Ударная установка”

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

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

Начинаем.

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

Загрузите zip-архив BickboxxAssets.zip и распакуйте его. В нем все, что понадобится для приложения Bickboxx — звуки, изображения и пиктограммы. Все эти файлы перетащите в папку “Resources“.

Чтобы скопировать объект в папку проекта, пометьте флажком опцию “Copy items into destination group’s folder (if needed)“. Настройки должны выглядеть так, как на рисунке. Подтвердите кнопкой “Add“.

Добавление фона в Interface Builder.

Двойным щелчком на файле BickboxxViewController.xib откройте его в редакторе IB. Перетащите объект Image View (UIImageView) из библиотеки Library в окно View, получив заполнитель для фона.

Откройте окно “Attributes Inspector“. Для элемента “Image” выберите из списка опцию “Background.png“.

Создание кнопки в IB.

В окно “View” перетащите элемент “Round Rect Button (UIButton)“.

Перейдите в окно “Attributes Inspector“. Кнопка в виде несимпатичного белого прямоугольника не интересует: из раскрывающегося меню “Type” выберите вариант “Custom“.

Ниже в том же окне установите для состояния кнопки вариант “Normal” (или “Default State Configuration” — в зависимости от версии Xcode). Так будет выглядеть кнопка в состоянии бездействия.

В поле “Image” выберите в качестве изображения кнопки вариант “B Inactive.png“. Отрегулируйте размер кнопки в окне View так, чтобы она отображалась полностью.

Теперь измените состояние кнопки на вариант с подсветкой “Highlighted” (или Highlighted State Configuration в зависимости от версии Xcode). Так будет выглядеть кнопка при нажатии.

В качестве изображения в поле “Image” выберите “B Active.png“.

Перетащите в окно View еще одну кнопку Round Rect Button (UIButton) и повторите все операции с буквами “E“, “А” и “Т“. Теперь представление “View” должно выглядеть так:

Пока редактор IB можно закрыть.

Выполнив “Build and Go“, убедитесь, что пока все работает. При касании кнопок они должны подсвечиваться.

Добавляем код звука.

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

Удерживая нажатой клавишу <Control>, щелкните по папке “Frameworks” слева. Перейдите в меню “AddExisting Frameworks…”.

В папке “/System/Library/Frameworks” найдите “AudioToolbox.framework“.

Щелкните на кнопке OK и добавьте объект к проекту.
Откройте “BickboxxViewController.h” и вставьте в файл следующий код:


#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>

@interface BickboxxViewController : UIViewController {
    CFURLRef        bNoteFileURLRef;
    SystemSoundID    bNoteFileObject;
    CFURLRef        eNoteFileURLRef;
    SystemSoundID    eNoteFileObject;
    CFURLRef        aNoteFileURLRef;
    SystemSoundID    aNoteFileObject;
    CFURLRef        tNoteFileURLRef;
    SystemSoundID    tNoteFileObject;
}

@property (readwrite)    CFURLRef        bNoteFileURLRef;
@property (readonly)    SystemSoundID    bNoteFileObject;
@property (readwrite)    CFURLRef        eNoteFileURLRef;
@property (readonly)    SystemSoundID    eNoteFileObject;
@property (readwrite)    CFURLRef        aNoteFileURLRef;
@property (readonly)    SystemSoundID    aNoteFileObject;
@property (readwrite)    CFURLRef        tNoteFileURLRef;
@property (readonly)    SystemSoundID    tNoteFileObject;

@end

Вверху мы ссылаемся на “AudioServices.h” из импортированной ранее структуры “AudioToolbox“.

Ниже — декларация свойств для четырех звуков, соответствующих клавишам “B“, “E“, “A” и “T
bNoteFileURLRef” — ссылка на расположение файла для bNoteFileObject. Этот звук будет воспроизводить клавиша “B“.
Там же прописаны параметры для звуков “E“, “A” и “T“.

Файл BickboxxViewController.m

Откройте “BickboxxViewController.m” — здесь необходимо синтезировать для параметров getter’ы и setter’ы.

Для этого после “@implementation BickBoxxViewController” добавим следующий код:


@synthesize bNoteFileURLRef, bNoteFileObject, eNoteFileURLRef,
            eNoteFileObject, aNoteFileURLRef, aNoteFileObject,
            tNoteFileURLRef, tNoteFileObject;

Меняем метод viewDidLoad.

Найдите метод “viewDidLoad” — он закомментирован. Для активации знаки комментария нужно удалить.

Метод “viewDidLoad” вызывается после создания всех компонентов пользовательского интерфейса. Это удачный момент для любого кода запуска в приложении. В нашем случае воспользуемся им для привязки параметров к конкретным звукам.

Первым делом получим основной bundle для приложения. Он позволяет работать с иерархией папок, упорядочивая и размещая различные типы ресурсов для приложения, включая изображения, звуки, исполняемые коды и локализованные строки.

Чтобы вызвать основной bundle приложения, после “[super viewDidLoad];” добавьте следующий код:


// Получение основного bundle для приложения
CFBundleRef mainBundle;
mainBundle = CFBundleGetMainBundle ();

Чтобы кнопка “B” обзавелась звуком, нужен путь к назначенному для воспроизведения звуковому файлу. Его имя — “B.aifc“. Приведенный ниже код запрашивает URL для воспроизведения найденного файла. Поставьте его сразу за кодом получения основного bundle.


// Получение URL для воспроизведения звукового файла
bNoteFileURLRef  = CFBundleCopyResourceURL (
                        mainBundle,
                        CFSTR ("B"),
                        CFSTR ("aifc"),
                        NULL
                        );

Обратите внимание, что система поддерживает только файлы с расширениями .wav, .aif и .caf.

Теперь, располагая набором bNoteFileURLRef, можно привязать звуковой файл к звуковому объекту системы bNoteFileObject. Функция AudioServicesPlaySystemSound позволит легко проигрывать короткие звуковые файлы.

После кода с запросом URL звукового файла добавьте следующий код:


// Создание системного звукового объекта, представляющего звуковой файл
AudioServicesCreateSystemSoundID (bNoteFileURLRef, &bNoteFileObject);

Загрузка звука для кнопки “В” завершена. Осталось загрузить звуки для кнопок “E“, “A” и “T“.

Попробуйте написать код для этой части фрагмент (так должен выглядеть метод “viewDidLoad” по завершении работы).


// Внедрение viewDidLoad для дополнительной настройки после загрузки представления,
// обычно из nib-файла
— (void)viewDidLoad {
    [super viewDidLoad];

    // Получение основного bundle для приложения
    CFBundleRef mainBundle;
    mainBundle = CFBundleGetMainBundle ();

    // Получение URL для воспроизведения звукового файла
    bNoteFileURLRef  =    CFBundleCopyResourceURL (
                                                 mainBundle,
                                                 CFSTR ("B"),
                                                 CFSTR ("aifc"),
                                                 NULL
                                                 );

    // Создание представляющего звуковой файл системного звукового объекта
    AudioServicesCreateSystemSoundID (bNoteFileURLRef, &bNoteFileObject);

    // Получение URL для воспроизведения звукового файла
    eNoteFileURLRef  =    CFBundleCopyResourceURL (
                                                 mainBundle,
                                                 CFSTR ("E"),
                                                 CFSTR ("aifc"),
                                                 NULL
                                                 );

    // Создание представляющего звуковой файл системного звукового объекта
    AudioServicesCreateSystemSoundID (eNoteFileURLRef, &eNoteFileObject);

    // Получение URL для воспроизведения звукового файла
    aNoteFileURLRef  =    CFBundleCopyResourceURL (
                                                 mainBundle,
                                                 CFSTR ("A"),
                                                 CFSTR ("aifc"),
                                                 NULL
                                                 );
    // Создание представляющего звуковой файл системного звукового объекта
    AudioServicesCreateSystemSoundID (aNoteFileURLRef, &aNoteFileObject);

    // Получение URL для воспроизведения звукового файла
    tNoteFileURLRef  =    CFBundleCopyResourceURL (
                                                 mainBundle,
                                                 CFSTR ("T"),
                                                 CFSTR ("aifc"),
                                                 NULL
                                                 );

    // Создание представляющего звуковой файл системного звукового объекта
    AudioServicesCreateSystemSoundID (tNoteFileURLRef, &tNoteFileObject);
}

Создание собственных IBActions.

Чтобы кнопки BEAT что-то делали, нужно связать их с функциями IBActions. Для начала задекларируем методы. Откройте “BickboxxViewController.h” и добавьте указанный ниже код перед строкой “@end“.


— (IBAction)bSound:(id)sender;
— (IBAction)eSound:(id)sender;
— (IBAction)aSound:(id)sender;
— (IBAction)tSound:(id)sender;

Теперь контроллер BickboxxViewController.h должен выглядеть так:


#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>

@interface BickBoxxViewController : UIViewController {
    CFURLRef        bNoteFileURLRef;
    SystemSoundID    bNoteFileObject;
    CFURLRef        eNoteFileURLRef;
    SystemSoundID    eNoteFileObject;
    CFURLRef        aNoteFileURLRef;
    SystemSoundID    aNoteFileObject;
    CFURLRef        tNoteFileURLRef;
    SystemSoundID    tNoteFileObject;
}

@property (readwrite)    CFURLRef        bNoteFileURLRef;
@property (readonly)    SystemSoundID    bNoteFileObject;
@property (readwrite)    CFURLRef        eNoteFileURLRef;
@property (readonly)    SystemSoundID    eNoteFileObject;
@property (readwrite)    CFURLRef        aNoteFileURLRef;
@property (readonly)    SystemSoundID    aNoteFileObject;
@property (readwrite)    CFURLRef        tNoteFileURLRef;
@property (readonly)    SystemSoundID    tNoteFileObject;

// Вновь добавленный код
— (IBAction)bSound:(id)sender;
— (IBAction)eSound:(id)sender;
— (IBAction)aSound:(id)sender;
— (IBAction)tSound:(id)sender;

@end

Закройте файл, открыв “BickboxxViewController.m“. Чтобы методы IBAction издавали определенные системные звуки, запуская метод AudioServicesPlaySystemSound, необходимо добавить реализацию.

Для воспроизведения звука “В” реализованный метод должен вызывать “AudioServicesPlaySystemSound” и использовать созданный ранее объект “bNoteFileObject“. После синтезирующего свойства кода добавьте следующее:


— (IBAction)bSound:(id)sender {
    AudioServicesPlaySystemSound (self.bNoteFileObject);
}

Аналогичные реализации добавьте для звуков “E“, “A” и “T“.

Для примера приведу начало файла “BickboxxViewController.m“:


#import "BickBoxxViewController.h" 

@implementation BickBoxxViewController

@synthesize bNoteFileURLRef, bNoteFileObject, eNoteFileURLRef,
            eNoteFileObject, aNoteFileURLRef, aNoteFileObject,
            tNoteFileURLRef, tNoteFileObject;

— (IBAction)bSound:(id)sender {
    AudioServicesPlaySystemSound (self.bNoteFileObject);
}

— (IBAction)eSound:(id)sender {
    AudioServicesPlaySystemSound (self.eNoteFileObject);
}

— (IBAction)aSound:(id)sender {
    AudioServicesPlaySystemSound (self.aNoteFileObject);
}

— (IBAction)tSound:(id)sender {
    AudioServicesPlaySystemSound (self.tNoteFileObject);
}

В последнем фрагменте кода наведем порядок, чтобы не допустить утечки памяти. В нижней части файла “BickboxxViewController.m” добавьте к методу “dealloc” следующие строки:


— (void)dealloc {
    [super dealloc];
    AudioServicesDisposeSystemSoundID (self.bNoteFileObject);
    AudioServicesDisposeSystemSoundID (self.eNoteFileObject);
    AudioServicesDisposeSystemSoundID (self.aNoteFileObject);
    AudioServicesDisposeSystemSoundID (self.tNoteFileObject);
    CFRelease (bNoteFileURLRef);
    CFRelease (eNoteFileURLRef);
    CFRelease (aNoteFileURLRef);
    CFRelease (tNoteFileURLRef);
}

С кодингом закончили. Командой “Build and Go” запустите проект и проверьте, ничего ли не взорвалось. Пока кнопки никаких звуков не издают — код нужно связать с интерфейсом.

Создание связей между кнопками и интерфейсом в IB.

Код готов — теперь нужно привязать его к кнопкам. Для начала свяжем кнопку “B” с методом “bsound“. Для этого откройте файл “BickboxxViewController.xib“.

Чтобы связать кнопку “B” с методом “bsound“, щелкните на объекте “File’s Owner“, удерживая нажатой клавишу <Control>.

Элемент “bSound” в “File’s Owner” перетащите на кнопку “B” в окне “View“.

В открывшемся меню выберите “Touch Down“. По умолчанию действие выполняется, когда палец отрывается от кнопки. Нас это не устраивает — деки работают по иному принципу. Выбранный вариант будет вызывать метод bSound IBAction при нажатии кнопки.

Аналогичные связи установите для остальных кнопок. После этого при щелчке на объекте “File’s Owner” с нажатой клавишей <Control> картина будет следующей.

Готово!!!

Вы справились! Запустите приложение после компиляции.

А теперь посмотрим как это работает:

Скачать архив (1,3Мб)

Оригинальная статья theappleblog.com
Источник lookapp.ru

Комментарий

Комментарии

ibobr 11.07.2009 16:22

Ура! Вы вернулись, а то я уже думал, что что то новое здесь уже не появится:)

Удачи вам и побольше хороших статей;)

ответить
Sergey 12.07.2009 5:50

странно, если некоторые вещи вставлять копированием, то проект не компилируется если самому набрать — все нормально.

ответить
Алексей 1.09.2009 17:28

Sergey 12.07.2009 5:50

странно. У меня тоже такое один раз случилось. Евгений скажите вы надеюсь не забросили БЛОГ?

ответить
Алекс 8.09.2009 22:43

Все верно, парни. Перед декларацией и последующем описанием метода (IBAction)bSound стоит тире, которое не ascii. Нужно его удалить и написать заново, не нужно для этого переписывать весь код ))) Дебаг вам на што? )))

ответить
Алексей 27.09.2009 22:08

скажите а как проиграть не музыкальный файл а самому задать чистоту колебания чтобы какаята мелодия получилась?

ответить
Влад, знающий толк 26.07.2010 16:01

Принципиально ли, чтобы вызов dealloc родительского класса шел последним в деструкторе?

у Вас: — (void)dealloc { [super dealloc]; … }

в Википедии: — (void) dealloc { … [super dealloc]; }

ответить

Форма комментирования для «Создаем приложение "Ударная установка"»

Обязательное поле. Не больше 30 символов.

Обязательное поле

captcha image Пожалуйста, введите символы, которые вы видите на изображении

Constantine 1.09.2010 19:36

Всё сделал правильно, интерфейс есть, а звука нету.. Не работает не мой не ваш(

ответить
Constantine 1.09.2010 19:37

Всё сделал правильно, интерфейс есть, а звука нету.. Не работает не мой не ваш(

ответить
Багтрекер 10.01.2011 15:51

У меня тоже не получилось…+(

ответить
Алексей 17.04.2011 12:59

сорри за офтоп.

У вас очень доступные туториалы по созданию приложений для айпод, айпад. Может как-то напишите — Как создать анимированную книжку, как это все сложить.

ответить
mindinpanic 22.09.2011 12:28

Возможно я что-то пропустил… а где питон?

ответить
mindinpanic 22.09.2011 12:29

Возможно я что-то пропустил… а где питон?

ответить
Реклама: Бассейн - магнето фитнес;Реклама: Медицина Солнцево и Ново-Переделкино;Реклама: Лучшые шины киев на любые авто!
.