2012-06-08 5 views
0

Так что я довольно близок к завершению моего маленького проекта, и я пытаюсь убедиться, что мое приложение совместимо с iPhone 3 и 4 ... но это действительно меня колотит. Я использую код CCPickerview с открытым исходным кодом, отправленный hm50 некоторое время назад (http://www.cocos2d-iphone.org/forum/topic/10160). Он работает GREAT для iPhone 4, но совсем не в симуляторе iPhone 3. Я думаю, что проблема здесь где-то в реализации. Я могу видеть, что происходит, когда я неправильно оставляю -hd-тег на изображении. Похоже, что изображение становится чистым в половине раз в режиме не-сетчатки, и я не могу сказать, что я достаточно эксперт, чтобы определить, почему.Почему я не вижу свое изображение с iPhone 3?

-(void)makePages { 
    CCSprite *overlay = [CCSprite spriteWithFile:@"overlay-hd.png"]; 
    CGSize s = CGSizeMake(overlay.contentSize.width, overlay.contentSize.height); 
    self.contentSize = s; 

    CCLayerColor *backLayer = [CCLayerColor layerWithColor:(ccColor4B){248,250,251,255} width:self.contentSize.width height:self.contentSize.height]; 
    backLayer.position = ccp(-self.contentSize.width/2, -self.contentSize.height/2); 
    [self addChild:backLayer]; 

    self.baseLayer = [CCLayerColor layerWithColor:(ccColor4B){150,150,150,0} width:s.width height:imgSize.height * numPages]; 

    for (int i=0; i < [arrayPages count]; i++) { 
     CCNode* n = [arrayPages objectAtIndex:i]; 
     n.position = ccp(s.width/2, s.height/2 + i * (imgSize.height + padding)); 
     [baseLayer addChild:n]; 
    } 

    baseLayer.position = ccp(-s.width/2, -s.height/2 - s.height * currentPage); 
    [self addChild:baseLayer]; 

    overlay.position = ccp(0, 0); 
    //overlay.opacity = 0; 
    [self addChild:overlay]; 

    rect = CGRectMake(self.position.x - s.width/2, self.position.y - s.height/2, s.width, s.height); 

    [self moveToPagePosition]; 
} 

- (void) visit 
{ 
    if (!self.visible) 
     return; 

    glPushMatrix(); 

    glEnable(GL_SCISSOR_TEST); 

    CGSize size = [[CCDirector sharedDirector] winSize]; 
    CGRect scissorRect = rect; 

    ccDeviceOrientation orientation = [[CCDirector sharedDirector] deviceOrientation]; 
    switch (orientation) 
    { 
     case kCCDeviceOrientationPortrait: 
      break; 
     case kCCDeviceOrientationPortraitUpsideDown: 
      scissorRect.origin.x = size.width-scissorRect.size.width-scissorRect.origin.x; 
      scissorRect.origin.y = size.height-scissorRect.size.height-scissorRect.origin.y; 
      break; 
     case kCCDeviceOrientationLandscapeLeft: 
     { 
      float tmp = scissorRect.origin.x; 
      scissorRect.origin.x = scissorRect.origin.y; 
      scissorRect.origin.y = size.width-scissorRect.size.width-tmp; 
      tmp = scissorRect.size.width; 
      scissorRect.size.width = scissorRect.size.height; 
      scissorRect.size.height = tmp; 
     } 
      break; 
     case kCCDeviceOrientationLandscapeRight: 
     { 
      float tmp = scissorRect.origin.y; 
      scissorRect.origin.y = scissorRect.origin.x; 
      scissorRect.origin.x = size.height-scissorRect.size.height-tmp; 
      tmp = scissorRect.size.width; 
      scissorRect.size.width = scissorRect.size.height; 
      scissorRect.size.height = tmp; 
     } 
      break; 
    } 

    glScissor(scissorRect.origin.x*2, scissorRect.origin.y*2, 
       scissorRect.size.width*2, scissorRect.size.height*2); 

    [super visit]; 

    glDisable(GL_SCISSOR_TEST); 
    glPopMatrix(); 
} 

Screenshot

Если переместить свиток на правый, больше его показывает вверх, но я действительно не хочу его там. Может ли кто-нибудь из вас блестящими объективными c-гуру помочь мне в этом?

EDIT:

После дальнейшего расследования, вопрос, без сомнения:

rect = CGRectMake(self.position.x - s.width/2, self.position.y - s.height/2, s.width, s.height); 

Если я делаю это

rect = CGRectMake(self.position.x - s.width*2.05, self.position.y - s.height/1.48, self.contentSize.width*1.3, self.contentSize.height*.48); 

Это прекрасно работает ... но я не» t думаю, что это решение очень элегантно, и оно должно основываться на размере изображения наложения. Я не уверен, что я делаю неправильно здесь.

ответ

1

Я тоже написал CCPickerView, вы можете найти его на github. https://github.com/fidgetware/CCPickerView. Он работает как с изображениями с низким разрешением, так и с высоким разрешением.

1

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

Вам необходимо проверить свойство окна -scale на экране окна (или использовать [UIScreen mainScreen]), и на основе этого выбрать правильное изображение (сетчатка).

+0

Я обязательно проверю это, но не должно ли все изображение отображаться? Когда я удаляю тэг -hd, появляется абсолютно нулевое значение, и мне интересно, является ли этот эффект отсечения тем, что отвечает. – PWiggin

+0

Хорошо. Лучше всего я могу сказать, что размер содержимого отображается правильно после удаления тега -hd. Проблема заключается в том, что изображение никогда не появляется. Когда я выхожу из -hd-тега и жестко кодирую размер контента наполовину, он также исчезает. – PWiggin

+1

Возможно, вам понадобится создать свою собственную версию изображения с низким разрешением. Возможно, «CCPickerview», о котором вы говорите, был разработан только с графикой сетчатки. –