Cocos2d iPhone: спрайт инициализировал странную проблему - PullRequest
0 голосов
/ 23 января 2012

Я использую учебник , чтобы сделать одно простое приложение. И в отличие от примера приложения, я хочу показать свой снаряд / объект с самого начала, а не на ощупь. Для того же, я делаю так:

-(id) init
{
    if((self=[super init]))
    {
        [[SimpleAudioEngine sharedEngine]setEnabled:TRUE];
        winSize = [CCDirector sharedDirector].winSize;
        projectile = [CCSprite spriteWithFile:@"abc.png"];
        projectile.position = spriteOffset;
        self addChild:projectile];
        self.isTouchEnabled = YES;
        //some other code
   }
}

И затем при прикосновении к тому же объекту / снаряду, мне нужно переместить его в направлении, в котором я его переместил. Я делаю ниже для того же:

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    // Choose one of the touches to work with
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];

    // Determine offset of location to projectile
    int offX = location.x - projectile.position.x; //Projectile returns 0X0 here
    int offY = location.y - projectile.position.y;

    float scalarX = 1.0f;

    if (offX < 0.0f)
        scalarX = -1.0f;

    int realX = scalarX * (winSize.width + (projectile.contentSize.width/2));//winSize.width + (food.contentSize.width/2);
    float ratio = (float) offY / (float) offX;
    int realY = (realX * ratio) + projectile.position.y;
    CGPoint realDest = ccp(realX, realY);

    int offRealX = realX - projectile.position.x;
    int offRealY = realY - projectile.position.y;
    float length = sqrtf((offRealX*offRealX)+(offRealY*offRealY));
    float velocity = 480/1; // 480pixels/1sec
    float realMoveDuration = length/velocity;

    [projectile runAction:[CCSequence actions:
                       [CCMoveTo actionWithDuration:realMoveDuration position:realDest],
                       [CCCallFuncN actionWithTarget:self selector:@selector(spriteMoveFinished:)],
                       nil]];
    [_projectiles addObject:projectile];  //ERROR SIGABRT

}

В приведенном выше коде, в этой строке int offX = location.x - projectile.position.x; мой спрайт возвращается в 0X0. Я не понимаю, где я делаю ошибку. Сначала он показывает объекты на экране, но при сенсорном событии он исчезает. Я также синтезировал CCSprite, но в Vail. Есть ли какой-то другой путь или какая-то ошибка, которую я совершаю? Пожалуйста, помогите, если есть идеи. Спасибо.

ERROR : Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray insertObject:atIndex:]: attempt to insert nil object at 0'

Ответы [ 2 ]

1 голос
/ 23 января 2012

projectile может стать жертвой пула автоматического выпуска и, следовательно, вернуть 0x0.поскольку projectile инициализируется как не сохраненный.это не проблема, связанная с COCOS2D.это в основном проблема управления памятью в Objective-C.

сделать одну вещь, сделать снаряд как

@ property (nonatomic, retain)

в

-(id) init

внесите это изменение:

        self.projectile = [CCSprite spriteWithFile:@"abc.png"];
        self.projectile.position = spriteOffset;
        [self addChild:self.projectile];

надеюсь, что это решит проблему, с которой вы столкнулись

0 голосов
/ 23 января 2012

На самом деле, поскольку спрайт снаряда добавляется как дочерний в init, единственный способ, которым он будет автоматически освобожден, - это если в другом месте кода снаряд будет удален как дочерний. Вы должны найти, где это происходит. Простое принудительное «закрепление» с сохранением может повредить логику о причине (ях) удаления спрайта.

...