2010-11-16 68 views
0

我正在创建一个通用应用程序,我的CCMenu在iPhone,iPhone 4和iPad上都显得很好。但是,在iPad上触摸时按钮不会执行任何操作。CCMenu不能在iPad上工作

除修改contentScaling属性外,我没有特定的iPad代码,因此iPad使用与iPhone 4相同的图像。这意味着相同的图像可以在iPhone 4上使用,但不能在iPad上使用。

我使用的是cocos2d 0.99.rc0和iOS 4.1 SDK。我甚至不知道从哪里开始排除故障。

我最近注意到的唯一怪事就是,iPad似乎画了一次菜单场景,然后由于某种原因而快速重画它,将所有像素或其他东西都移动。我的菜单类非常简单,没有“清爽”的代码或任何应该移动的东西。这不会发生在低或高分辨率iPhone上。

这是我的代码,马虎,但非常简单。

MainMenu.m:

CCMenuItemImage * playItem = [self makeMenuButtonWithSprite:@"Play.png" withSelector:@selector(play:)]; 

    CCMenuItemImage * resumeItem = [self makeMenuButtonWithSprite:@"Resume.png" withSelector:@selector(resume:)]; 

    CCMenuItemImage * optionsItem = [self makeMenuButtonWithSprite:@"Options.png" withSelector:@selector(options:)]; 

    CCMenuItemImage * helpItem = [self makeMenuButtonWithSprite:@"Help.png" withSelector:@selector(help:)]; 

    CCMenu *myMenu; 

    // Check if there is a valid savegame by comparing versions. 
    if ([[uD stringForKey:@"CFBundleVersion"] isEqualToString:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]]) { 
     myMenu = [CCMenu menuWithItems:playItem, resumeItem, optionsItem, helpItem, nil]; 
    } else { 
     myMenu = [CCMenu menuWithItems:playItem, optionsItem, helpItem, nil]; 
    } 

    // Arrange the menu items vertically 
    [myMenu alignItemsVerticallyWithPadding:0.0f]; 
    myMenu.position = ccp(dB.wWidth/2,dB.wHeight/2); 

    // add the menu to your scene 
    [self addChild:myMenu z:100]; 

而且CCMenuItemImage工厂:

- (CCMenuItemImage *)makeMenuButtonWithSprite:(NSString *)spriteFileName withSelector:(SEL)selector { 
    CCSprite *spriteForButton = [CCSprite spriteWithFile:spriteFileName]; 
    spriteForButton.anchorPoint = ccp(0.5f,0.5f); 
    CCMenuItemImage * buttonImage =[CCMenuItemImage itemFromNormalImage:@"button.png" 
                 selectedImage: @"button.png" 
                  target:self 
                  selector:selector]; 
    [buttonImage addChild:spriteForButton z:100]; 
    spriteForButton.position = ccp([buttonImage boundingBox].size.width/2,([buttonImage boundingBox].size.height/2)-5); 
    return buttonImage; 
} 

回答

1

发现问题。这与我的自定义入侵有关,使iPad加载视网膜图形。问题出在我的appDelegate中,我设置了使得ccDirector缩放和UIScreen缩放不匹配的contentScaleFactor。

问题归结为图形很大,但cocos2d认为坐标是低分辨率。

+0

您是否使高分辨率图像有效?如果是 - 请发布答案如何去做 – Andrew 2011-03-05 21:29:48

3

我不认为任何已知的bug存在此问题。不知道如何在没有看到任何代码的情况下进行调试,但是,如果有帮助,这里是我的一些代码,它使用cocos2d 0.99.5在iOS 4.0,4.1和4.2上成功添加了一个菜单(我升级后没有区别):

-(void) initBottomMenu { 
CCMenuItem *aboutButton = [self gameButtonWithName:@"about" selector:@selector(onAbout:)]; 
CCMenuItem *settingsButton = [self gameButtonWithName:@"settings" selector:@selector(onSettings:)]; 
CCMenuItem *tutButton = [self gameButtonWithName:@"tutorial" selector:@selector(onTutorial:)]; 

CCMenu *menu = [CCMenu menuWithItems:aboutButton, settingsButton, tutButton, nil]; 
menu.position = ccp(xPos, yPos); 

[menu alignItemsHorizontallyWithPadding:45.0]; 

[self addChild:menu]; 
} 

的gameButtonWithName:选择:方法是这样的:

-(CCMenuItem *) gameButtonWithName:(NSString *)name selector:(SEL)s { 

NSString *iPadSuffix = @"IPad"; 

NSString *normal = [[NSString alloc] initWithFormat:@"%@Btn%@.png", name, iPadSuffix, nil] ; 
NSString *selected = [[NSString alloc] initWithFormat:@"%@Btn%@.png", name, iPadSuffix, nil]; 

CCMenuItem *retButton = [CCMenuItemImage itemFromNormalImage:normal 
               selectedImage:selected 
               disabledImage:selected 
                 target:self 
                selector:s]; 

[selected release]; 
[normal release]; 

return retButton; 
} 

有点草率,但它工作进行的顺利添加菜单到我的主场景。

+0

感谢您的分享。我现在已将自己的代码添加到原始文章中 - 外观与您的文章几乎完全相同,但无法使用。 – 2010-11-18 11:59:21

+0

请注意,无法使用[NSString stringWithFormat:“%@ Btn%@。png”,name,iPadSuffix,nil]创建您的字符串;然后跳过整个发布的事情?我认为用便利方法创建的所有对象(即不是[[obj alloc] init])都是自动释放的,不是这种情况吗? – 2010-11-18 12:00:53

+0

是的,这是绝对正确的,但最好的做法是尽可能多地照顾尽可能多的分配和释放。不知道iPhone什么时候会决定翻转并释放使用便捷方法创建的对象 - 这样我就知道它何时发生。一旦iPhone得到适当的垃圾收集,这些都不会成为问题! – 2010-11-19 14:37:34

相关问题