Cocos2dx v.3.0 портретный режим

Привет, я разрабатываю приложение Cocos2dx с XCode и iPhone 5c, и я хочу изменить систему координат на портретную. Я просмотрел эти направления http://www.cocos2d-x.org/wiki/Device_Orientation. Согласно направлению, вам нужно изменить пару методов в RootViewController, чтобы до того, как Cocos творит свое волшебство, iOS уже обрабатывала вращение контейнера.

Теперь применимые методы моего RootViewController.mm выглядят следующим образом. Он строится и работает.

#ifdef __IPHONE_6_0
- (NSUInteger) supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}
#endif

- (BOOL) shouldAutorotate {
    return YES;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return UIInterfaceOrientationIsPortrait ( interfaceOrientation );
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];

    auto glview = cocos2d::Director::getInstance()->getOpenGLView();

    if (glview)
    {
        CCEAGLView *eaglview = (__bridge CCEAGLView *)glview->getEAGLView();

        if (eaglview)
        {
            CGSize s = CGSizeMake([eaglview getWidth], [eaglview getHeight]);
            cocos2d::Application::getInstance()->applicationScreenSizeChanged((int) s.width, (int) s.height);
        }
    }
}
@end

Код метода init() моего уровня выглядит так

bool Level1::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Scene::init() )
    {
        return false;
    }

    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    for(int i= 0; i < MAX_TOUCHES; ++i) {
        labelTouchLocations[i] = Label::createWithSystemFont("", "Arial", 42);
        labelTouchLocations[i]->setVisible(false);
        this->addChild(labelTouchLocations[i]);
    }

    auto eventListener = EventListenerTouchAllAtOnce::create();

    //  Create an eventListener to handle multiple touches, using a lambda, cause baby, it's C++11
    eventListener->onTouchesBegan = [=](const std::vector<Touch*>&touches, Event* event){

        // Clear all visible touches just in case there are less fingers touching than last time
        std::for_each(labelTouchLocations,labelTouchLocations+MAX_TOUCHES,[](Label* touchLabel){
            touchLabel->setVisible(false);
        });

        // For each touch in the touches vector, set a Label to display at it's location and make it visible
        for(int i = 0; i < touches.size(); ++i){
            labelTouchLocations[i]->setPosition(touches[i]->getLocation());
            labelTouchLocations[i]->setVisible(true);
            labelTouchLocations[i]->setString("Touched");
            std::cout << "(" << touches[i]->getLocation().x << "," << touches[i]->getLocation().y << ")" << std::endl;

        }
    };

    _eventDispatcher->addEventListenerWithSceneGraphPriority(eventListener, this);

    return true;
}

Когда я касаюсь точки в нижней левой части iPhone, координата x точки касания, которую я распечатываю, составляет около 150. Координата y равна 0, как и ожидалось. Почему координата x не равна нулю? Есть ли что-то, чего мне не хватает в создании сцены? Я считаю, что я сделал все изменения, которые требует документация Cocos. Их документы устарели?


person Jack Frye    schedule 11.09.2017    source источник


Ответы (1)


Система координат не начинается с (0,0) в левом нижнем углу, как это предлагается в документации. Однако есть простые методы, которые можно использовать для получения исходной точки и размера контейнера, включенного в сцену по умолчанию.

auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
person Jack Frye    schedule 11.09.2017