Жесткие тела Box2D искажаются при загрузке другого вида

У меня есть мир Box2D, который прекрасно работает. Я использую его в простой игре для iOS, где пользователь наклоняет устройство, чтобы толкать тела по экрану, набирая очки, когда одно тело сталкивается с другим.

Он работал нормально, когда был похоронен на пару слоев глубоко в моем приложении в тестовом контроллере. Я вызывал его с помощью кнопки на экране моего меню, и кнопка на экране игры прекрасно возвращалась в меню через popToViewController. Но как только я увидел, как здорово это работает, я понял, что хочу, чтобы игра была первым экраном, который видит пользователь (после загружаемого изображения по умолчанию). Итак, теперь приложение загружает мир, и игра сразу включается без каких-либо проблем.

Пока пользователь не коснется кнопки меню, чтобы перейти к экрану меню — другому контроллеру представления. Контроллер меню загружается нормально и там все работает как положено. НО когда кто-то нажимает кнопку «Назад», чтобы вернуться в игру/мир, изображения/тела искажаются. Искажение варьируется в зависимости от того, как они были повернуты, когда контроллер меню был помещен в стек навигации. Иногда они увеличены, иногда сглажены.

Я пытался приостановить мир (не вызывая Step) при загрузке контроллера меню, но это не помогло решить проблему искажения изображения.

Вот код, в котором загружается контроллер меню:

  //unhide the navbar for the next screen
   [self.navigationController setNavigationBarHidden:NO];

   MenuViewController *mvc = [[MenuViewController alloc]init];

   [self.navigationController pushViewController:mvc animated:YES];

   [mvc release];

И вот где контроллер представления игры загружается делегатом приложения в приложении didFinishLaunchingWithOptions:

   B2DViewController *b2dvc = [[B2DViewController alloc]init];

   UINavigationController *navcon = [[UINavigationController alloc] init];

   [navcon setNavigationBarHidden:YES];

   [navcon pushViewController:b2dvc animated:NO];
   [window addSubview:navcon.view];

   [b2dvc release];

    [window makeKeyAndVisible];

Изображения приходят через xib. Одна кнопка, а другая — imageView. Оба добавляются к динамическим телам, которые настроены таким образом:

    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox(boxDimensions.x, boxDimensions.y);

 ...

    b2FixtureDef fixtureDef; 
    fixtureDef.shape = &dynamicBox;
    fixtureDef.density = 3.0f;
    fixtureDef.friction = 0.3f;
    fixtureDef.restitution = 0.5f;

  ...

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

Буду признателен за любую помощь или идеи, которые могут быть у кого-то.


person Tony Adams    schedule 17.02.2011    source источник
comment
+1 за использование таким образом. Извините, я не могу помочь с фактическим вопросом, хотя :(   -  person deanWombourne    schedule 17.02.2011


Ответы (1)


Вместо того, чтобы нажимать контроллер меню на контроллер навигации, а затем добавлять контроллер навигации в представление, я вместо этого использовал presentModalViewController: анимированный. Это не решило проблему, но как только я закомментировал [self.navigationController setNavigationBarHidden:NO]; проблема была решена.

//unhide the navbar for the next screen
//[self.navigationController setNavigationBarHidden:NO];

MenuViewController *mvc = [[MenuViewController alloc]init];

[self presentModalViewController:(UIViewController *)mvc  animated:YES];
[mvc release];

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

person Tony Adams    schedule 23.02.2011