Основы 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, 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)
Отлично, с нетерпением жду продолжения!
ОтветитьУдалитьНапиши пожалуйста подробно о работе с спрайтами?
ОтветитьУдалитьВ будущих уроках - обязательно напишу. А пока что есть новый урок по менюшкам и надписям :)
Удалить