麻雀 - 如何修复SIGABRT错误,游戏initwithwitdth

时间:2012-07-30 11:31:03

标签: objective-c ios5 xcode4 sparrow-framework

我刚开始使用麻雀框架,并且一直在遵循Gamua自己的“大麻雀教程”。我在本教程的第一部分,使用AppScaffold 1.3但是当我尝试编译我的基本代码时,它会挂起在加载屏幕上并给我一个SIGABRT错误。

我放了一个异常断点,它停在这里,在AppScaffold的GameController.m(见底部):

mGame = [[Game alloc] initWithWidth:gameWidth height:gameHeight];

这也是我唯一的输出:

2012-07-30 07:19:54.787 AppScaffold[1682:10a03] -[Game initWithWidth:height:]: unrecognized selector sent to instance 0x7553980
(lldb)

我正在使用股票AppScaffold,我唯一改变的是Game.m。

这是我的Game.m:

@interface Game : SPSprite
@end

@implementation Game
{
@private
    SPImage *mBackground;
    SPImage *mBasket;
    NSMutableArray *mEggs;
}

- (id)init
{
    if((self = [super init]))
    {
        //load the background image first, add it to the display tree
        //and keep it for later use
        mBackground = [[SPImage alloc] initWithContentsOfFile:@"background.png"];
        [self addChild:mBackground];

        //load the image of the basket, add it to the display tree
        //and keep it for later use
        mBasket = [[SPImage alloc] initWithContentsOfFile:@"basket.png"];
        [self addChild:mBasket];

        //create a list that will hold the eggs,
        //which we will add and remove repeatedly during the game
        mEggs = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)dealloc
{
    [mBackground release];
    [mBasket release];
    [mEggs release];
    [super dealloc];
}

@end

我已经尽力使用我的基本故障排除策略,但我对Obj-C和Sparrow很新,可以用一只手:)

由于

编辑:为了清楚起见,我在这里添加了GameController.m内容:

//
//  GameController.m
//  AppScaffold
//

#import <OpenGLES/ES1/gl.h>
#import "GameController.h"


@interface GameController ()

- (UIInterfaceOrientation)initialInterfaceOrientation;

@end


@implementation GameController

- (id)initWithWidth:(float)width height:(float)height
{
    if ((self = [super initWithWidth:width height:height]))
    {
        float gameWidth  = width;
        float gameHeight = height;

        // if we start up in landscape mode, width and height are swapped.
        UIInterfaceOrientation orientation = [self initialInterfaceOrientation];
        if (UIInterfaceOrientationIsLandscape(orientation)) SP_SWAP(gameWidth, gameHeight, float);

        mGame = [[Game alloc] initWithWidth:gameWidth height:gameHeight];

        mGame.pivotX = gameWidth  / 2;
        mGame.pivotY = gameHeight / 2;

        mGame.x = width  / 2;
        mGame.y = height / 2;

        [self rotateToInterfaceOrientation:orientation animationTime:0];
        [self addChild:mGame];
    }

    return self;
}

- (void)dealloc
{
    [mGame release];
    [super dealloc];
}

- (UIInterfaceOrientation)initialInterfaceOrientation
{
    // In an iPhone app, the 'statusBarOrientation' has the correct value on Startup; 
    // unfortunately, that's not the case for an iPad app (for whatever reason). Thus, we read the
    // value from the app's plist file.

    NSDictionary *bundleInfo = [[NSBundle mainBundle] infoDictionary];
    NSString *initialOrientation = [bundleInfo objectForKey:@"UIInterfaceOrientation"];
    if (initialOrientation)
    {
        if ([initialOrientation isEqualToString:@"UIInterfaceOrientationPortrait"])
            return UIInterfaceOrientationPortrait;
        else if ([initialOrientation isEqualToString:@"UIInterfaceOrientationPortraitUpsideDown"])
            return UIInterfaceOrientationPortraitUpsideDown;
        else if ([initialOrientation isEqualToString:@"UIInterfaceOrientationLandscapeLeft"])
            return UIInterfaceOrientationLandscapeLeft;
        else
            return UIInterfaceOrientationLandscapeRight;
    }
    else 
    {
        return [[UIApplication sharedApplication] statusBarOrientation];
    }
}

- (void)rotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
                       animationTime:(double)animationTime
{
    float angles[] = {0.0f, 0.0f, -PI, PI_HALF, -PI_HALF};

    float oldAngle = mGame.rotation;
    float newAngle = angles[(int)interfaceOrientation];

    // make sure that rotation is always carried out via the minimal angle
    while (oldAngle - newAngle >  PI) newAngle += TWO_PI;
    while (oldAngle - newAngle < -PI) newAngle -= TWO_PI;

    // rotate game
    if (animationTime)
    {
        SPTween *tween = [SPTween tweenWithTarget:mGame time:animationTime
                                       transition:SP_TRANSITION_EASE_IN_OUT];
        [tween animateProperty:@"rotation" targetValue:newAngle];
        [[SPStage mainStage].juggler removeObjectsWithTarget:mGame];
        [[SPStage mainStage].juggler addObject:tween];
    }
    else 
    {
        mGame.rotation = newAngle;
    }

    // inform all display objects about the new game size
    BOOL isPortrait = UIInterfaceOrientationIsPortrait(interfaceOrientation);
    float newWidth  = isPortrait ? MIN(mGame.gameWidth, mGame.gameHeight) : 
                                   MAX(mGame.gameWidth, mGame.gameHeight);
    float newHeight = isPortrait ? MAX(mGame.gameWidth, mGame.gameHeight) :
                                   MIN(mGame.gameWidth, mGame.gameHeight);

    if (newWidth != mGame.gameWidth)
    {
        mGame.gameWidth  = newWidth;
        mGame.gameHeight = newHeight;

        SPEvent *resizeEvent = [[SPResizeEvent alloc] initWithType:SP_EVENT_TYPE_RESIZE
                                width:newWidth height:newHeight animationTime:animationTime];
        [mGame broadcastEvent:resizeEvent];
        [resizeEvent release];
    }
}

// Enable this method for the simplest possible universal app support: it will display a black
// border around the iPhone (640x960) game when it is started on the iPad (768x1024); no need to 
// modify any coordinates. 
/*
- (void)render:(SPRenderSupport *)support
{
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        glEnable(GL_SCISSOR_TEST);
        glScissor(64, 32, 640, 960);
        [super render:support];
        glDisable(GL_SCISSOR_TEST);
    }
    else 
        [super render:support];
}
*/

@end

这是我的Xcode项目:http://cl.ly/2e3g02260N47

2 个答案:

答案 0 :(得分:0)

您正在呼叫

initWithWidth:height:

方法,虽然没有在你的班级中定义。

在您的编辑中,似乎initWithWidth方法在类GameController中声明,而不是在Game中声明。

所以,似乎是

您在initWithWidth:height:中声明了Game.h方法,但您在GameController.m中对其进行了定义。

这解释了为什么在编译时获得SIGABRT和错误。

修复正在调用

mGame = [[GameController alloc] init];
来自GameController的

initWithWidth ...

- (id)initWithWidth:(float)width height:(float)height
{
if ((self = [super initWithWidth:width height:height]))
{
    float gameWidth  = width;
    float gameHeight = height;

    // if we start up in landscape mode, width and height are swapped.
    UIInterfaceOrientation orientation = [self initialInterfaceOrientation];
    if (UIInterfaceOrientationIsLandscape(orientation)) SP_SWAP(gameWidth, gameHeight, float);

    mGame = [[Game alloc] init];

    mGame.pivotX = gameWidth  / 2;
    mGame.pivotY = gameHeight / 2;

    mGame.x = width  / 2;
    mGame.y = height / 2;

    [self rotateToInterfaceOrientation:orientation animationTime:0];
    [self addChild:mGame];
}

return self;
}

答案 1 :(得分:0)

该教程非常陈旧,与最新的脚手架不兼容;

我这样做了:

- (id)init
{
    if((self = [super init]))
    {

当我应该这样做时:

- (id)initWithWidth:(float)width height:(float)height
{
    if ((self = [super initWithWidth:width height:height]))
    {

谢谢,虽然塞尔吉奥!

(有更好的麻雀教程,我甚至制作了自己的视频教程:P)