0

それで、まだ完全なスプライトシートのグラフィックを取得していなかったので、静的な 1 フレームのスプライトを使用して、しばらく cocos2d ゲームに取り組んできました。これでスプライトシートができましたが、実装に問題があります。

私が現在「プレーヤー」(スプライト) を作成する方法は、以下に示すように、別のプレーヤー クラスを使用することです。

Player.h

@interface Player : CCSprite{
CCAction *_WalkAction;
}
@property (nonatomic, assign) CCAction *WalkAction;
@property (nonatomic, assign) CGPoint velocity;
@property (nonatomic, assign) CGPoint desiredPosition;
@property (nonatomic, assign) BOOL onGround;
@property (nonatomic, assign) BOOL forwardMarch;
@property (nonatomic, assign) BOOL mightAsWellJump;
@property (nonatomic, assign) BOOL isGoingLeft;

-(void)update:(ccTime)dt;
-(CGRect)collisionBoundingBox;

@end

そして Player.m (かなり長いので、すべてを表示しません。キャラクターに関するすべてを定義しているだけです)

-(id)initWithFile:(NSString *)filename {
if (self = [super initWithFile:filename]) {
    self.velocity = ccp(0.0, 0.0);
}
return self;
}

  //THIS IS ONLY A FRACTION OF MY UPDATE METHOD, THE REST OF IT IS ALL SETTING VELOCITY AND WHATNOT FOR MY PHYSICS ENGINE, BUT THIS IS THE ONLY RELEVANT PART
-(void)update:(ccTime)dt {
if (self.forwardMarch) {
        self.velocity = ccpAdd(self.velocity, forwardStep);
 //[self runAction: _WalkAction];
    }    
}

今、私の GameLevelLayer.m で、次のようにスプライトを初期化します (これは、player.m の初期化からファイル名を取得する場所です):

//In my init
map = [[CCTMXTiledMap alloc] initWithTMXFile:@"level1.tmx"];
    [self addChild:map];

 player = [[Player alloc] initWithFile:@"banker1.png"];
    player.position = ccp(100, 50);
    [map addChild:player z:15];

そのため、すべてが完全に正常に機能します。そのスプライトをスプライトシートでスプライトに変えようとすると問題が発生します。だから私はplayer.mでこれをやろうとしています

-(id)initWithFile:(NSString *)filename {
if (self = [super initWithFile:filename]) {

    self.velocity = ccp(0.0, 0.0);

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: @"BankerSpriteSheet_default.plist"];

    CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"BankerSpriteSheet_default.png"];
    [self addChild:spriteSheet];

    NSMutableArray *walkAnimFrames = [NSMutableArray array];
    for(int i = 1; i <=6; ++i) {
        [walkAnimFrames addObject: [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: [NSString stringWithFormat:@"banker%d.png", i]]];

        CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.1f];
        self = [CCSprite spriteWithSpriteFrameName:@"banker1.png"];

//HERE IS WHERE self.WalkAction IS DEFINED

        self.WalkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
        [spriteSheet addChild:self];
    }

}
return self;
}

//And then run it in my update method

if (self.forwardMarch) {
        self.velocity = ccpAdd(self.velocity, forwardStep);
    [self runAction: _WalkAction];

}

参考までに、self.forwardMarch は、ユーザーがボタンを押してプレーヤーを移動するたびに設定される bool であるため、true の場合は常にこのようにプレーヤーを移動します。

しかし、これを試してみると、エラーが発生します

'NSInvalidArgumentException', reason: '-[CCSprite setWalkAction:]: unrecognized selector sent to instance 0x88fab50'

どんな助けでも大歓迎です。

コード表示システム(色分けなど)がもっと好きなら、cocos2dフォーラムにもこれを投稿しました http://www.cocos2d-iphone.org/forums/topic/making-spritesheets-work/

編集:

さて、少し進歩しましたが、まだ少し行き詰まっています。GameLevelLayer.m の init でバッチノードとすべてのアクションを定義しました

[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile: @"BankerSpriteSheet_default.plist"];

    CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"BankerSpriteSheet_default.png"];
    [self addChild:spriteSheet];
    [player addChild:spriteSheet];

    NSMutableArray *walkAnimFrames = [NSMutableArray array];
    for(int i = 1; i <=6; ++i) {
        [walkAnimFrames addObject: [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: [NSString stringWithFormat:@"banker%d.png", i]]];

        CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.1f];
        player = [[Player alloc] initWithSpriteFrameName:@"banker1.png"];
        player.WalkAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]];
        //[spriteSheet addChild:player];
    }

    //player = [[Player alloc] initWithFile:@"koalio_stand.png"];
    player.position = ccp(100, 50);
    player.scale = 0.2;
    [map addChild:player z:15];

そして、私の Player.m で実行します

[self runAction: self.WalkAction];
//I've also tried [self runAction: _WalkAction]; The result is the same

NSLogs を使用して、上記のセクション ([self runAction: self.WalkAction]; が呼び出されているが、終了していないことを確認しました。ここでクラッシュが発生しますが、クラッシュの理由に関するコンソールへの出力はありません。文字通りただ言うだけです(lldb)

4

1 に答える 1

0

問題は、実際のエラーの 1 行上にあります。[CCSprite spriteWith...] の結果を self に割り当てます。これにより、既存の self が置き換えられ、それが CCSprite に置き換えられます。代わりに、init 行を self = [super initWithSpriteFrameName:..] に変更します。

于 2013-06-06T23:03:13.997 に答える