それで、まだ完全なスプライトシートのグラフィックを取得していなかったので、静的な 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)