Я пытаюсь создать игру для iPhone, однако я сталкиваюсь с некоторыми (я надеюсь) простыми, но запутанными проблемами.
Я заставляю мое приложение находиться в режиме UIInterfaceOrientationLandscapeRight, это устанавливается в .plist, и каждый из моих UIViewControllers возвращает это как единственную жизнеспособную ориентацию для shouldAutorotateToInterfaceOrientation
Это работает ... иногда. Каждая из моих xibs была разработана для работы в ландшафтном режиме, и все ViewController настроены очень похоже. Вот моя проблема:
Я создаю экземпляры всех своих UIViewControllers программно, например:
splashScreen = [[SplashScreenController alloc] initWithNibName:@"SplashScreenView" bundle:[NSBundle mainBundle]];
splashScreen.view.frame = CGRectMake(0, 0, [[GameConsts defaultGameConsts] screenWidth], [[GameConsts defaultGameConsts] screenHeight]);
[[self view] addSubview: [splashScreen view]];
mainMenu = [[MainMenuController alloc] initWithNibName: @ "MainMenuView" bundle: [NSBundle mainBundle]];
mainMenu.view.frame = CGRectMake (0, 0, [[GameConsts defaultGameConsts] screenWidth], [[GameConsts defaultGameConsts] screenHeight]);
[[self view] addSubview: [mainMenu view]];
Это работает нормально, но когда я активирую свои «игровые виды», то есть игровые меню и реальное игровое поле, мне нужно инвертировать параметры screenWidth и screenHeight, чтобы они правильно отображались. Я не понимаю, почему это так, и я пока не смог понять это. Вот как они создаются:
- (void) setupGameViews
{
// Why do these need to be reversed to show up properly? (Height and Width!)
gameView = [[GameController alloc] initWithNibName:@"GameView" bundle:[NSBundle mainBundle]];
gameView.view.frame = CGRectMake(0, 0, [[GameConsts defaultGameConsts] screenHeight], [[GameConsts defaultGameConsts] screenWidth]);
[[self view] addSubview: [gameView view]];
gameMenu = [[GameMenuController alloc] initWithNibName:@"GameMenuView" bundle:[NSBundle mainBundle]];
gameMenu.view.frame = CGRectMake(0, 0, [[GameConsts defaultGameConsts] screenHeight], [[GameConsts defaultGameConsts] screenWidth]);
[[self view] addSubview: [gameMenu view]];
}
(Примечание. Этот метод вызывается при нажатии кнопки запуска игры. Это все внутри «родительского» UIViewController, который не имеет связанного с ним представления, но вместо этого содержит и настраивает все эти подпредставления. Может быть, есть проблема с их архитектурой? Я видел несколько похожих примеров, поэтому решил использовать ее.)
Для полноты, вот определения в синглтоне GameConsts во время его метода init:
- (id) init
{
screenWidth = [[UIScreen mainScreen] applicationFrame].size.width;
screenHeight = [[UIScreen mainScreen] applicationFrame].size.height;
screenCenter = CGPointMake(screenSizeHeight / 2, screenSizeWidth / 2);
return [super init];
}
screenWidth и screenHeight - это значения с плавающей точкой. screenCenter - это CGPoint. Если вы заметили, я изменил высоту / ширину в screenCenter CGPoint, потому что в противном случае, когда я пытаюсь нарисовать объект в центре экрана, он отображается в левом нижнем углу экрана.
Это сводит меня с ума и удерживает меня от гораздо более забавных частей этого опыта. Если кто-то может оказать помощь, это было бы замечательно. Если потребуется дополнительная информация, дайте мне знать.