piupiudev


Пиу-пиу. Код и другие штучки.


Оценки карт
чебурашка
ferrum_mamuth
Надо сделать так, чтобы в конце каждой карты можно было поставить ей оценку. А то есть 500 карт, ткнул одну наугад, понравилось, и фиг найдешь же второй раз! А потом ткнул другую, а она стремная, но по закону подлости будешь на нее попадать всегда.
И чтобы сортировать по оценкам можно было.

iOS College
чебурашка
ferrum_mamuth
Здесь uvanya делится своими впечатлениями от зимней школы iOS College.

Я добавлю несколько скриншотов из игры. Это она получила приз на конкурсе альфа-версий. Подробности позже.


Photobucket


Photobucket


Photobucket


Photobucket




Game Center, Cocos2d и CCStandardTouchDelegate
чебурашка
ferrum_mamuth
Начал разбираться с Game Center и получил странный баг, после появления вэлкам-сообщения игра переставала реагировать на тачи.
Проблема оказалась в том, что при появлении этого приветствия, если есть тач, то он обрывается, но события ccTouchesEnded или ccTouchesCancelled не вызываются.
В моем случае получилось, что игра продолжала думать, будто касание продолжается и игнорировала ccTouchesBegan.

Achievments
чебурашка
ferrum_mamuth
Количество стартов
Количество отбиваний за всю игру
Количество собранных бонусов за всю игру
Первый финиш
Команта закончена
Супердолгое прохождение уровня
Экономка (наэкономил объектов))
Экономка (в первый раз сэкономил)
Попадания в аквариум
Сумма очков
Собрал все медали не ниже какой-то
Заработал кучу очков за раз

Читерское прохождение конкретного уровня - ???

Количество фэйловых попыток - злое
Все бонусы собраны - сложно контролировать

Подумать над этим всем.
Tags:

ScrollView
чебурашка
ferrum_mamuth
Сегодня я подрался с соседом, и чтобы поместить на одном скроллвью еще несколько страниц, кроме активной, вам поможет такой класс:

@interface UIMenuScrollView : UIView
{
UIScrollView *scrollView;
}
     
-(id)initWithFrame:(CGRect)frame scrollFrameSize:(CGSize)size;

@property (retain) UIScrollView *scrollView;
@end


@implementation UIMenuScrollView
@synthesize scrollView;
-(id)init
{
return [self initWithFrame:CGRectMake(0, 0, 320, 480)];
}

-(id)initWithFrame:(CGRect)frame
{
return [self initWithFrame:frame ContentSize:frame.size];
}

-(id)initWithFrame:(CGRect)frame scrollFrameSize:(CGSize)size
{
if((self=[super initWithFrame:frame]))
{
scrollView = [[UIScrollView alloc] init];

scrollView.frame = CGRectMake((frame.size.width - size.width)/2, (frame.size.height - size.height)/2, size.width, size.height);
scrollView.pagingEnabled = YES;
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.clipsToBounds = NO;
// scrollView.backgroundColor = [UIColor redColor];


[self addSubview:scrollView];
self.clipsToBounds = YES;
}
return self;
}
-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
UIView* child = nil;
if ((child = [super hitTest:point withEvent:event]) == self)
return self.scrollView;
return child;
}
@end

У него есть свой скроллвью, добавлять все на него. size это размер одной страницы, которая будет лежать на нем, frame это рамки всего объекта, в которых будут существовать наши странички. И тут стало ясно, что мой сосед и есть убийца! Последний конструктор самый клевый.

Как-то примерно вот так оно подразумевается:

numberOfPages = 4;
UIMenuScrollView *menuView = [[UIMenuScrollView alloc] initWithFrame:CGRectMake(10, 100, 300, 100) scrollFrameSize:CGSizeMake(100, 100)];
[self.window addSubview: menuView];
menuView.scrollView.contentSize = CGSizeMake(menuView.scrollView.frame.size.width * numberOfPages, menuView.scrollView.frame.size.height);

for (unsigned i = 0; i < numberOfPages; i++)
{
NSString *imageFileName = [NSString stringWithFormat:@"%@/YOURIMAGENAMEHERE.png",[[NSBundle mainBundle] resourcePath]];
UIImage* image = [[[UIImage alloc] initWithContentsOfFile:imageFileName] autorelease];

UIImageView *controller = [[[UIImageView alloc] initWithImage: image] autorelease];

controller.contentMode = UIViewContentModeScaleAspectFit;
CGRect frame = menuView.scrollView.frame;
frame.origin.x = frame.size.width * i;
frame.origin.y = 0;
controller.frame = frame;
[menuView.scrollView addSubview:controller];
}

И я не дрался с соседом на самом деле, просто это гипнотекст.
Tags:

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

[self runAction: [CCFollow actionWithTarget:sprite worldBoundary:CGRectMake(0, -160, [CCDirector sharedDirector].winSize.width, [CCDirector sharedDirector].winSize.height*2)]];

Этот селектор вызывается у CCLayer. Прямоугольник это область, в которой камере можно двигаться.
В стандартном темплэйте эту строку можно поместить в конце -(void) addNewSpriteWithCoords:(CGPoint)p и камера будет следовать за кубиками.

Но это не все. Так как картинка сместилась, координаты экрана не совпадают с координатами сцены. Все поиски по официальной документации кокоса ведут к статье Getting correct touch coordinates when moving/scaling a camera (Landscape), которая уже мхом обросла от "свежести".[self.camera centerX:&centerX centerY:&centerY centerZ:&centerZ] возвращает нули и естественно ничего не работает.
Есть удобный способ получения координат, но нашел я его буквально шарясь в исходниках кокоса:

location = [self convertToNodeSpace:location];

Можно также конвертить сразу в мировые координаты, которые измеряются в кокосометрах, и еще во что-то там, ищите соответствующие селекторы, начинающиеся на convertTo.

UPD. [self.camera centerX:&centerX centerY:&centerY centerZ:&centerZ] возможно возвращает какие-то другие координаты камеры, а не те, которые меняет CCFollow, но в достаточно свежих постах на кокосовском форуме код из статьи все еще мелькает с незначительными модификациями.
Tags:

Смазанные текстуры в Cocos2d
чебурашка
ferrum_mamuth
Привет!
Чтобы в cocos2d твои текстуры не были размытыми, нужно добавить строку "[[sprite texture] setAliasTexParameters];".
Например:
sprite = [CCSprite spriteWithSpriteSheet:sheet rect:CGRectMake(0, 0, 69, 69)];
[[sprite texture] setAliasTexParameters];
[sheet addChild:sprite];
sprite.position = ccp(hamsterBody->GetPosition().x * ptm, hamsterBody->GetPosition().y * ptm);
sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(hamsterBody->GetAngle());
sprite.scale = 1.0f;
Tags: , ,

Офисы
чебурашка
ferrum_mamuth
Увидел пост про офис Яндекса. Интересная достаточно вещь.)
Там по тегу необычный офис еще много чего интересного, пока не смотрел.

Художники для игр
чебурашка
ferrum_mamuth
Вчера с uvanya повесили объявы на oDesk, free-lance.ru и еще нескольких местах. Сегодня выбирали художника для нашей игры. На oDesk не оказалось ничего интересного, 6 или 7 человек, и либо портфолио совсем не по теме, либо вообще его нет. На free-lance.ru ответило просто дофига сколько народу, но рисовать из них не умел почти никто. У одного чувака в портфолио даже был хомяк, сворованный с перовой картинки по запросу в google "Rhino the Hamster".) Список вариантов быстро сократился до 3-х человек.
Потом до двух.

1:


2:

Синий мужик и жираф со змеей победили.
На поиски, выбор и описание задания в общей сложности мы потратили (0,5+2.5+2.5)*2 ~= 11 человекочасов! Блин! =/

Запуск приложений на iOS
чебурашка
ferrum_mamuth
Создать сертификат для подписания кода в Keychain Access.

В файле /Developer/Platforms/iPhoneOS.platform/Info.plist заменяем XCiPhoneOSCodeSignContext на XCCodeSignContext.

В настройках проекта выбрать созданный сертификат.

Если появляется ошибка "Please verify that your device’s clock is properly set, and that your signing certificate is not expired (0xE8008018)", потавить на трубку чкркз Cydia AppSync с репозитория cydia.hackulo.us.

Должно работать.

?

Log in