cocos2d не может добавить несколько спрайтов и анимацию - PullRequest
0 голосов
/ 28 февраля 2012

Я хочу следовать этому посту пост и объединить его с примером ShootThemUp из LearnCocos2d .К сожалению, я немного сбит с толку, поскольку у меня возникла проблема с анимацией частей подкласса CCSprite и проблема с доступом к именам фреймов внутри карты текстур.

ДОСТУП К ИМЕНАМ СПРАЙТНЫХ РАМ

Я получаю следующее исключение:

CCSpriteFrameCache: Trying to use file 'game-art.png' as texture

при попытке доступа к имени кадра, как в примере ShootEmUp:

head = [CCSprite initWithSpriteFrameName:@"head.png"];

Вот модифицированный код:

@implementation ShipEntity

@synthesize lifes;

+(id) ship
{
    self = [[[self alloc] init] autorelease];
    [self addParts];
    return self;
}

-(void) addParts
{

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"game-art.plist"];



    body = [CCSprite node];
//      head = [CCSprite spriteWithSpriteFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"head.png"]];

    head = [CCSprite initWithSpriteFrameName:@"head.png"];

    [head setPosition:CGPointMake(10,10)];
    [body addChild:head];
    [self addChild:body];
/**
    // create an animation object from all the sprite animation frames
    CCAnimation* anim = [CCAnimation animationWithFrame:@"head-anim" frameCount:3 delay:0.08f];

    // add the animation to the sprite (optional)
    [head addAnimation:anim];

    // run the animation by using the CCAnimate action
    CCAnimate* animate = [CCAnimate actionWithAnimation:anim];
    CCRepeatForever* repeat = [CCRepeatForever actionWithAction:animate];
    [head runAction:repeat];
    **/
    [self scheduleUpdate];

    //should use spawn method..
    initialHitPoints=2;
    hitPoints=initialHitPoints;
    lifes=3;
    [[GameScene sharedGameScene] setLifeCount:lifes];

}

Если я заменю:

head = [CCSprite initWithSpriteFrameName:@"head.png]; 

на

head = [CCSprite spriteWithSpriteFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"head.png"]];

, то он добавит его. Зачем мне это делать?В примере ShootthemUp он работал, получая прямой доступ к имени фрейма спрайта. Я думаю, мне нужно найти способ сделать файл plst видимым со всем исходным кодом, который я пишу ..

ПРОБЛЕМА АНИМАЦИИ Наконец, я попытался добавить анимацию, раскомментировав следующий фрагмент кода (предположим, у меня есть файлы head-anim в файлах game-art.png и game-art.plist:

        CCAnimation* anim = [CCAnimation animationWithFrame:@"head-anim" frameCount:3 delay:0.08f];

    // add the animation to the sprite (optional)
    [head addAnimation:anim];

    // run the animation by using the CCAnimate action
    CCAnimate* animate = [CCAnimate actionWithAnimation:anim];
    CCRepeatForever* repeat = [CCRepeatForever actionWithAction:animate];
    [head runAction:repeat];

Но это не сработало .. какое-либо предложение?

Это трассировка стека исключения:

012-02-28 12:15:14.068 ShootEmUp[26182:40b] cocos2d: CCSpriteFrameCache: Trying to use file 'game-art.png' as texture
2012-02-28 12:15:14.109 ShootEmUp[26182:40b] cocos2d: CCSpriteFrameCache: Trying to use file 'game-art.png' as texture
2012-02-28 12:15:14.109 ShootEmUp[26182:40b] +[CCSprite initWithSpriteFrameName:]: unrecognized selector sent to class 0x10cbf0
2012-02-28 12:15:14.111 ShootEmUp[26182:40b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[CCSprite initWithSpriteFrameName:]: unrecognized selector sent to class 0x10cbf0'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x013f0be9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x015455c2 objc_exception_throw + 47
    2   CoreFoundation                      0x013f27bb +[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x01362366 ___forwarding___ + 966
    4   CoreFoundation                      0x01361f22 _CF_forwarding_prep_0 + 50
    5   ShootEmUp                           0x0000c7cd -[ShipEntity addParts] + 349
    6   ShootEmUp                           0x0000c64d +[ShipEntity ship] + 141
    7   ShootEmUp                           0x000038ae -[GameScene initWithId:] + 1102
    8   ShootEmUp                           0x00003413 +[GameScene sceneWithId:] + 131
    9   ShootEmUp                           0x00010e9f -[Navigator LaunchLevel:] + 143
    10  CoreFoundation                      0x0136167d __invoking___ + 29
    11  CoreFoundation                      0x01361551 -[NSInvocation invoke] + 145
    12  ShootEmUp                           0x0004be75 -[CCMenuItem activate] + 85
    13  ShootEmUp                           0x00012d86 -[SlidingMenuGrid ccTouchEnded:withEvent:] + 454
    14  ShootEmUp                           0x000a40b1 -[CCTouchDispatcher touches:withEvent:withTouchType:] + 1633
    15  ShootEmUp                           0x000a4bff -[CCTouchDispatcher touchesEnded:withEvent:] + 111
    16  ShootEmUp                           0x000a6ab1 -[EAGLView touchesEnded:withEvent:] + 113
    17  UIKit                               0x008a30d1 -[UIWindow _sendTouchesForEvent:] + 567
    18  UIKit                               0x0088437a -[UIApplication sendEvent:] + 447
    19  UIKit                               0x00889732 _UIApplicationHandleEvent + 7576
    20  GraphicsServices                    0x02998a36 PurpleEventCallback + 1550
    21  CoreFoundation                      0x013d2064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    22  CoreFoundation                      0x013326f7 __CFRunLoopDoSource1 + 215
    23  CoreFoundation                      0x0132f983 __CFRunLoopRun + 979
    24  CoreFoundation                      0x0132f240 CFRunLoopRunSpecific + 208
    25  CoreFoundation                      0x0132f161 CFRunLoopRunInMode + 97
    26  GraphicsServices                    0x02997268 GSEventRunModal + 217
    27  GraphicsServices                    0x0299732d GSEventRun + 115
    28  UIKit                               0x0088d42e UIApplicationMain + 1160
    29  ShootEmUp                           0x00002844 main + 100

Кажется, это связано с тем, что файл не найден, но я не могу 'Я не понимаю, почему в этом примере он находит, а почему в моем коде нет ... Я знаю, что это немного глупо, и должна быть очевидная причина, по которой я скучаю. Это также первый раз, когда я пытаюсь сгенерировать plst иpng файл и, следовательно, я мог сделать несколько ошибок ..

[РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ: Разница в настройках между моими файлами художественного оформления - левое изображение - и ShootthemUp - правое изображение]

difference in game-art.plist files

Ответы [ 2 ]

0 голосов
/ 15 июня 2012

Спасибо за ответ, я не принял его, поскольку причина, по которой у меня возникли проблемы, была связана с этим другим вопросом post , который я задал .. Я не понимал, что мне нужны оба - файл hd, а не -hd в приложении, что приводило к путанице (я добавил только один файл атласа спрайтов в папку ресурсов, и всякий раз, когда я пытался получить доступ к фрейму внутри него, приложение жаловалось, поскольку оно настроено на работу на сетчатке дисплей и не нашел оба файла ресурсов). Я бы не подумал, что без ответа, полученного в посте 1 .

Спасибо за вашу помощь!

0 голосов
/ 28 февраля 2012

Если у вас есть имя фрейма, используйте инициализаторы автоматического выпуска; метод "init", который вы используете, является несколько нетрадиционным методом для того, что вы пытаетесь сделать:

head = [CCSprite spriteWithSpriteFrameName:@"head.png];

Если вы не используете инициализаторы с автоматическим выпуском, вы должны быть осторожны и использовать множество методов управления памятью и других техник, которые Cocos разработан, чтобы помешать вам.

Вы должны придерживаться методов автоматического освобождения, насколько это возможно, если только у вас нет веских причин не делать этого.

...