понедельник, 14 января 2013 г.

Основы. Статья 6. Работа с акселерометром в cocos2d. Спрайты в cocos2d

Основы cocos2d. Статья 6. Работа с акселерометром в cocos2d. Спрайты в cocos2d

Привет!
После небольшого перерыва - продолжаем ;)
В этой статье мы закончим узнавать об основах CCLayer, изучив последний аспект - ввод данных через акселерометр. Затем мы познакомимся с классом спрайтов CCSprite.

Работа с акселерометром

Чтобы начать получать данные от акселерометра, вам нужно явно попросить ваш CCLayer об этом:
self.isAccelerometerEnabled = YES;

Тогда cocos2d будет вызывать для вашего слоя следующий метод:
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 
{
CCLOG(@"acceleration: x:%f y:%f z:%f ", acceleration.x, acceleration.y, acceleration.z);
}

Как видно из примера, можно легко определять ускорение в каждой из осей.

Если вы пишите игры для Mac OS X, используя cocos2d, то знайте, что вам доступно также получение нажатий клавиш и получение информации от мыши.
Если вам интересна обработка нажатий клавиатуры или обработка данных от мыши в cocos2d в Mac OS X - можете написать об этом в комментарии (если будут желающие, то создам дополнительный пост на эту тему).

Класс CCSprite - спрайты

Спрайты - это один из самых часто используемых классов в cocos2d.
С помощью него можно отобразить на экране изображение.

Прежде чем отображать изображения, вам нужно добавить их в проект. Для этого, в вашем проекте в XCode нажмите правой кнопкой мыши на папке Resources, выберите "Add files" и в диалоговом окне выберите файлы изображений (и отметьте галочку Copy files to destination, чтобы файлы скопировались).

После этого, вы сможете использовать вашы файлы изображений в коде следующим образом:
(допустим, мы находимся в классе одного из слоев)

CCSprite* sprite = [CCSprite spriteWithFile:@”Default.png”]; [self addChild:sprite]; 

Ничего сложного.
Но вот вопрос - как вы думаете, где на экране появится это изображение?

В cocos2d действует следующее правило: центр загруженного изображения располагается в той точке, где находится спрайт.
Поскольку мы только что создали спрайт, он находится в точке (0, 0), а значит, в этой же точке находится центр нашего изображения (поэтому часть изображения уходит за границу экрана).
Соответственно, для того, чтобы было видно все изображение, нам нужно подвинуть спрайт вверх и вправо на половину высоты и половину ширины изображения соответственно.

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

Кстати, важный момент по поводу файлов. В iOS различаются заглавные и прописные буквы в названиях файлов, поэтому, если у вас файл называется Default.PNG, а вы из кода вызываете Default.png, то файл не будет загружен. При этом в симуляторе все будет ок.

Немного о якорях

У узлов в cocos2d есть "якорь" или "якорная точка".
Якорь - это точка, по умолчанию имеющая координаты (0,5; 0,5) внутри узла. Эта точка имеет смысл только для спрайтов и для надписей.
Якорь влияет на несколько вещей. Во-первых, вращение спрайта происходит относительно якоря, поэтому, по умолчанию, вращение происходит относительно центра (т.к. якорь по умолчанию находится в центре спрайта).
Во-вторых, от координат якоря зависит, как будет отрисована текстура. Например, если сдвинуть якорь в позицию (0, 0), то левый нижний угол текстуры будет совпадать с позицией спрайта.

Однако, как правило, вам не придется изменять положение якоря (кроме случаев, когда вы в этом уверены).

Чтобы изменить положение якоря, для вашего спрайта или надписи измените свойство anchorPoint:

mySprite.anchorPoint = CGPointMake(1,1); 

Измерения текстур

Важно упомянуть о том, что iOS умеет работать только с текстурами, обладающими  шириной и высотой, равными двойке в какой-то степени (например, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048). При этом, они не обязательно должны быть квадратными - например, вы можете иметь текстуру размером 64 на 512 - главное, чтобы каждая из сторон была степенью двойки.

Какое это имеет значение? Рассмотрим пример - допустим, у вас есть файл с изображением 260 на 260 пикселей, который вы используете для спрайта. Допустим, глубина цвета - 32 бита, соответственно в памяти текстура должна занимать около 270 килобайт - но в реальности, она будет занимать порядка мегабайта!
Почему?
Потому что iOS автоматически возьмет размер изображения таким, чтобы он был равен минимальной степени двойки, котроая может вместить по размеру ваше изображение.
В нашем случае - это 512 на 512 пикселей, которые и будут занимать мегабайт памяти.

Как с этим бороться? Изначально создавать изображения, ширина и высота которых равна степени двойки, например в данном случае - 256 на 256.

Не забудьте сообщить геймдизайнерам, которые с вами работают, об этой особенности.

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

На этом все, ждите следующих уроков!
Мы поговорим о надписях и менюшках.

Иллюстрации и примеры кода взяты из книги Learn cocos2d Game Development with iOS 5.
Посетите также блог автора книги ("Learn Cocos2d", Steffen Itterheim)

3 комментария:

  1. Отлично, с нетерпением жду продолжения!

    ОтветитьУдалить
  2. Напиши пожалуйста подробно о работе с спрайтами?

    ОтветитьУдалить
    Ответы
    1. В будущих уроках - обязательно напишу. А пока что есть новый урок по менюшкам и надписям :)

      Удалить