Игра вылетает после стресса - PullRequest
3 голосов
/ 15 января 2010

У меня сейчас проблемы с игрой, она продолжает падать, когда я слишком сильно ее подчеркиваю. Это означает, что я безумно скользил, шевелил или стучал пальцами по экрану, и он падал. Крушение не имеет правил. Я попытался обнаружить, в журнале консоли отображается сообщение о нехватке памяти. Я знаю, что речь идет о памяти, но я использую Cocos2D, чтобы сделать эту игру, я следовал инструкциям в лучшей практике. После этого он кажется более плавным, но все равно падает, если мне нравится то, что я упомянул выше. Если как в Какао, у нас есть alloc и release, но это Cocos2D, я думаю, нам не нужно этого делать. Моя игра просто загружает изображения и делает анимацию после касания.

//where the fingers ended , this will determine the correct actions made. 
-(BOOL)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)events
{
    int touchCount = 0;
    NSSet *allTouches3 = [events allTouches];
    for( UITouch *touch in allTouches3)
    {
        location3 = [touch locationInView: [touch view]];
        location3 = [[Director sharedDirector] convertCoordinate: location3];

        NSLog(@"end TOUCHed x2: %3.3f, y2: %3.3f",location3.x,location3.y);
        touchCount++;
    }
    [self removeChildByTag:kTagWord cleanup:YES]; 

    timeEnd = [NSDate timeIntervalSinceReferenceDate];
    touchDuration = timeEnd - timeStart;
    //float rangeX = location3.x - location.x;
    rangeY2 = location3.y - location.y;

    //loading the succesful opened box with 2 touches same direction 
    if ((touchCount > 0 && touchCount ==2) && (rangeY2 > 0.0 && rangeY2 <15.0))
    {
        box++;
        self.isTouchEnabled = NO;
        [self removeErrorText];

        if (box == 1)
        {
            [self loadingTheRest];
        }
        else if (box == 2)
        {
            [self loadingTheRest1];
        }
        else if (box ==3)
        {
            [self loadingTheRest2];
        }

        if (currentBox == 0 )
        {
            [self addText];
            [self boxOpenAnimation];
            [self schedule:@selector(enableTheTouches) interval:1.0f];

        } else if(currentBox == 1 )
        {
            [self addText1];
            [self boxOpenAnimationPink];
            //[self schedule:@selector(winGame) interval:0.4f];
            [self schedule:@selector(enableTheTouches) interval:1.0f];

        }
    }
}

и это пример загрузочной коробки

-(void)loadingTheRest
{
    //LOADING OTHER COLOURS
    AtlasSpriteManager *managerPink  = [AtlasSpriteManager spriteManagerWithFile:@"PinkNew.png"];
    AtlasSpriteManager *error2  = [AtlasSpriteManager spriteManagerWithFile:@"PinkErrors.png"];
    [self addChild:managerPink z:1 tag:kTagSpriteManagerPink ];
    [self addChild:error2 z:1 tag:kTagSpriteErrorPink ];

}

-(void)boxOpenAnimation
{
    if (isBusy==YES)
    {
            return;
    }
    isBusy=YES;

    [self removeBoxColours];
    AtlasSpriteManager *mrg = (AtlasSpriteManager *)[self getChildByTag:kTagSpriteManager];
    AtlasSprite *box = [AtlasSprite spriteWithRect:CGRectMake(482, 322,480, 320) spriteManager:mrg];
    box.position = ccp(240,160);
    [mrg addChild:bra z:1 tag:1984];

    AtlasAnimation *animation = [AtlasAnimation animationWithName:@"open" delay:0.1];

    [animation addFrameWithRect: CGRectMake(1, 322, 480, 320) ];    
    [animation addFrameWithRect:CGRectMake(482, 1, 480, 320)];
    [animation addFrameWithRect:CGRectMake(1, 1, 480, 320)];
    [animation addFrameWithRect:CGRectMake(1, 643, 480, 320)];
    id action = [Animate actionWithAnimation:animation];

    [box runAction:action];
    [self loadingTheRest];
    isBusy=NO;

}

Пожалуйста, поделитесь своими знаниями со мной, если вы знаете о причинах сбоя моей игры. Большое вам спасибо

Ответы [ 4 ]

7 голосов
/ 15 января 2010

У вас нет кода здесь, но я предполагаю, что вы делите на 0 со значением здесь.

touchDuration = timeEnd - timeStart;

Согласно Apple, timeIntervalSinceReferenceDate возвращает секунды, что означает, что если вы вызываете его в течение второго времени timeEnd - timeStart == 0.

Я вывел это из вашего описания аварий.

1 голос
/ 28 января 2010

Я бы посоветовал вам подключить отладчик, отключить перехват исключений первого шанса, включить захват исключений второго шанса и затем вызвать сбой. Отладчик покажет вам стек вызовов сбоя.

1 голос
/ 28 января 2010

Сделайте так, чтобы ваш код отвечал на сообщение DidRecieveMemoryWarning. Затем, когда у вас не хватает памяти, ОС должна (не всегда, особенно если ваше использование памяти быстро растет) уведомить вас, и тогда вы сможете избавиться от объектов, которые могли исчезнуть с экрана или тому подобное.

0 голосов
/ 27 января 2010

Может быть, ваша игра потребляет слишком много памяти? В таком случае сама система просто убьет вашу игру, если что-то еще потребует больше памяти и ваша игра заберет все это. Такие ситуации выглядят как случайные сбои в вашей игре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...