cocos2d:: Обнаружение щелчка по меню немного слева внизу при использовании нестандартного размера окна
После нескольких недель отладки я пытаюсь выяснить, что происходит с cocos2d::Menu. Я был удивлен, что мой MenuItemImage не получал обратные вызовы, когда я нажимал на кнопку. Так что я щелкаю в другом месте от разочарования и гула, когда я нажимаю в левом нижнем углу, регистрируется обратный вызов!
Это немного в сторону левого нижнего и интересно, что могло вызвать это? Я уже воспроизвел проблему, используя дрянной пример проекта, предоставленный как есть, и не смог воспроизвести это, используя размер окна по умолчанию. Но теперь проблема стала воспроизводимой, когда я перешел на другой размер. Я также заметил, что границы обнаружения, кажется, не являются реальной формой данного MenuItemImage. Это немного квадратный.
Я нахожусь в затруднительном положении здесь. Это действительно расстраивает. Документация и сообщество бесполезны, как ад.
Я использую cocos2d-x v3.6;
Вот мой код:
mRetryButton = cocos2d::MenuItemImage::create("asset_button_up.png", "asset_button_down.png", CC_CALLBACK_1(MainGameScene::onRetryButtonClicked, this));
mRetryButton->setPosition(cocos2d::Vec2(screenSize.width / 2.0f, screenSize.height / 2.0f));
auto menu = cocos2d::Menu::create(mRetryButton, NULL);
menu->setPosition(cocos2d::Vec2::ZERO);
this->addChild(menu, 1);
Вы знаете какое-нибудь решение для этого? Или я просто ужасно что-то упустил? Мне просто нужна была простая экранная кнопка. Ничего фантастического. Просто старая скучная кнопка.
Спасибо!
1 ответ
Я починил это!
Я перепробовал множество способов создания кнопки. Все они демонстрировали похожее поведение.
Должно быть что-то не так с изменением размера экрана. Я совершил ужасную ошибку.
На AppDelegate::applicationDidFinishLaunching
когда он впервые инициализирует glview
Мне однажды сказали, что для изменения размера экрана мне нужно позвонить так: cocos2d::Director::getInstance()->getOpenGLView()->setFrameSize(width , height)
, Я установил это после этой конкретной строки так, чтобы это выглядело так:
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("My Game");
director->setOpenGLView(glview);
}
director->getOpenGLView()->setFrameSize(width , height);
Это так неправильно. Делая это после того, как директор установил представление OpenGL, регистрирует исходный размер экрана 960, 640, который отражается на всех сценах, слоях, узлах, которые у вас есть. Каждый раз, когда вы проверяете в отладчике размер содержимого рассматриваемого узла (у меня кнопка имеет размер (140, 40)), она по умолчанию принимает исходный размер экрана. Это неправильно. Там что-то не так. И это не будет исправлено, если вы вручную установите размер контента. Я думаю, что при неправильной настройке размера экрана размер содержимого некоторых узлов становится не выровненным или неправильно рассчитанным к тому времени, когда директор установил представление GL. Правильный способ смены экрана:
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("My Game");
glview->setFrameSize(370, 480);
director->setOpenGLView(glview);
}
Теперь границы обнаружения кликов, положение и размер точно соответствуют изображению спрайта и теперь могут получать обратные вызовы! За две недели. Я получил это.
Я надеюсь, что это поможет кому-то в будущем!