Sprite和Bounding Box问题

时间:2013-11-26 16:14:30

标签: ios objective-c cocos2d-iphone

我正在使用cocos2D进行任务的IOs游戏。到目前为止,我只是想完成所有菜单,但是在设置我的一些按钮时,我遇到了一些边框问题。

游戏从cocos2D logoscreen开始,然后转换为我的游戏的闪屏,然后进入主菜单。在游戏菜单中,我有2个按钮:开始和选项。两个按钮都工作得很好,每个按钮都可以转换到正确的场景。

我目前正在制作选项菜单场景,我有一个按钮来处理音量,一个按钮来设置游戏难度,一个按钮返回主菜单。我一直试图使后退按钮工作,但触摸时没有触发,我放置了一个NSLog进行调试,并且正在检测触摸,只是if语句检查精灵是否被触摸或者永远不是真的。我很困惑,因为我使用的是我在主菜单中使用的相同方法(有效)。我在发布之前搜索了类似的问题,但我尝试的所有内容,如更改父坐标系和/或精灵boundingbox.origin,都没有用。

这是我的选项场景的代码:

#import "OptionsMenu.h"
@implementation OptionsMenu
+(CCScene *) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];

    // 'layer' is an autorelease object.
    OptionsMenu *layer = [OptionsMenu node];

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;
}

-(id) init
{

    if( (self=[super init]) ) {
        self.touchEnabled = YES;
        self.accelerometerEnabled = YES;


        CGSize winSize = [[CCDirector sharedDirector] winSize];

        CCSprite *background = [CCSprite spriteWithFile:@"Menu0.png"];
        background.position = ccp(winSize.width/2, winSize.height/2);
        [self addChild:background z:0];

        CCSprite *volumeBar = [CCSprite spriteWithFile:@"VolumeBar.png"];
        volumeBar.position = ccp(winSize.width/2, winSize.height/2);
        [self addChild:volumeBar z:1];

        CCSprite *volumeButton = [CCSprite spriteWithFile:@"VolumeButton.png"];
        volumeButton.position = ccp(winSize.width/2, winSize.height/2);
        [self addChild:volumeButton z:1];

        CCSprite *difficultyButton = [CCSprite spriteWithFile:@"EasyButton.png"];
        difficultyButton.position = ccp(winSize.width/2, winSize.height/2-55);
        [self addChild:difficultyButton z:1];

        CCSprite *backButton = [CCSprite spriteWithFile:@"BackButton.png"];
        backButton.position = ccp(winSize.width/12, winSize.height/8);
        [self addChild:backButton z:1];

        [self scheduleUpdate];
    }

    return self;
}

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    //Add a new body/atlas sprite at the touched location
    for( UITouch *touch in touches ) {
        CGPoint location = [touch locationInView: [touch view]];
        location = [[CCDirector sharedDirector] convertToGL: location];

        CCActionInterval *actionInterval = [CCActionInterval actionWithDuration:0.1];


        if (CGRectContainsPoint([self.backButton boundingBox], location)) {
            [self.backButton setTexture:[[CCTextureCache sharedTextureCache] addImage:@"BackButton.png"]];
            id actionCallFunc = [CCCallFunc actionWithTarget:self selector:@selector(goToMainMenu:)];
            [self.background runAction: [CCSequence actions: actionInterval, actionCallFunc, nil]];
        }

        else if (CGRectContainsPoint([self.difficultyButton boundingBox], location)) {
            [self.volumeButton setTexture:[[CCTextureCache sharedTextureCache] addImage:@"VolumeButton.png"]];
        }
       }
}

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //Add a new body/atlas sprite at the touched location
    for( UITouch *touch in touches ) {
        CGPoint location = [touch locationInView: [touch view]];
        NSLog(@"Touch");
        //missileButton* missileButton;
        location = [[CCDirector sharedDirector] convertToGL: location];

        if (CGRectContainsPoint([self.backButton boundingBox], location))
        {
            [self.backButton setTexture:[[CCTextureCache sharedTextureCache]addImage:@"BackButtonPressed.png"]];
            NSLog(@"BackButtonTouched");
        }

        else if (CGRectContainsPoint([self.volumeButton boundingBox], location))
            [self.volumeButton setTexture:[[CCTextureCache sharedTextureCache]addImage:@"VolumeButtonPressed.png"]];

    }
}



-(void) goToMainMenu:(id) sender
{
    [[CCDirector sharedDirector] replaceScene: [CCTransitionSlideInR transitionWithDuration:2 scene:[MainMenu node]]];
}
@end

感谢您解决此问题的任何帮助。

2 个答案:

答案 0 :(得分:0)

您的self.backButton永远不会被定义。将您的init函数更改为以下内容(我假设您的所有CCSprite定义实际上都是属性:

-(id) init
{

    if( (self=[super init]) ) {
        self.touchEnabled = YES;
        self.accelerometerEnabled = YES;


        CGSize winSize = [[CCDirector sharedDirector] winSize];

        _background = [CCSprite spriteWithFile:@"Menu0.png"];
        _background.position = ccp(winSize.width/2, winSize.height/2);
        [self addChild:_background z:0];

        _volumeBar = [CCSprite spriteWithFile:@"VolumeBar.png"];
        _volumeBar.position = ccp(winSize.width/2, winSize.height/2);
        [self addChild:_volumeBar z:1];

        _volumeButton = [CCSprite spriteWithFile:@"VolumeButton.png"];
        _volumeButton.position = ccp(winSize.width/2, winSize.height/2);
        [self addChild:_volumeButton z:1];

        _difficultyButton = [CCSprite spriteWithFile:@"EasyButton.png"];
        _difficultyButton.position = ccp(winSize.width/2, winSize.height/2-55);
        [self addChild:_difficultyButton z:1];

        _backButton = [CCSprite spriteWithFile:@"BackButton.png"];
        _backButton.position = ccp(winSize.width/12, winSize.height/8);
        [self addChild:_backButton z:1];

        [self scheduleUpdate];
    }

    return self;
}

答案 1 :(得分:0)

另一种方法是对所有按钮使用CCMenu和CCMenuItemSprite。这些类使菜单的简单按钮更容易实现。大部分/全部触摸处理都是为您完成的,并且有些变体使用选择器或块来处理按钮按下。

这可以为您节省大量代码和麻烦。