0

我刚刚开始使用 sparrow 框架,并且一直在关注 Gamua 自己的“The Big Sparrow Tutorial”。我在教程的第一部分,使用 AppScaffold 1.3,但是当我尝试编译我的基本代码时,它挂在加载屏幕上并给我一个 SIGABRT 错误。

我在 AppScaffold 的 GameController.m(见底部)中放置了一个异常断点,并在此处停止:

mGame = [[游戏分配] 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

4

2 回答 2

0

你打电话给

initWithWidth:height:

方法,而您的类中没有定义。

从您的编辑来看,该initWithWidth方法似乎是在 class 中声明的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;
}
于 2012-07-30T11:34:35.967 回答
0

教程很老,和最新的脚手架不兼容;

我这样做了:

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

当我应该这样做时:

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

谢谢,虽然塞尔吉奥!

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

于 2012-11-10T15:02:54.750 回答