Cocos2d: Y-координата для события касания больше, чем у позиции касания - PullRequest
0 голосов
/ 04 мая 2019

Я изучаю, как использовать cocos2d-x, следуя руководству gamesfromscratch. Я получил эту часть , когда заметил эту проблему с позиционированием:

Click on origin with output.

Это базовое приложение в основном рисует на экране метку "You Touched Here" в том месте, где вы нажимаете. Тем не менее, всякий раз, когда я нажимал, ярлык появлялся значительно выше того места, где я щелкал.

На скриншоте выше я нажал на начало координат. В выходном журнале видно, что точка касания (в частности: touch-> getLocation (), без преобразования) записывается как (0, 166), где она должна быть (0, 0).

Я пытался использовать другие функции позиционирования, а также преобразовывать координаты касания в другие типы координат, но проблема все еще сохранялась.

Ниже приведен код для этого простого приложения:

AppDelegate.h

#pragma once

#include "cocos2d.h"

class AppDelegate : private cocos2d::Application {

public:
    AppDelegate();
    virtual ~AppDelegate();

    virtual bool applicationDidFinishLaunching();
    virtual void applicationDidEnterBackground();
    virtual void applicationWillEnterForeground();
};

AppDelegate.cpp

#include "AppDelegate.h"
// These header files are not used currently
//#include "HelloWorldScene.h"
//#include "GraphicsScene.h"
//#include "TouchScene.h"
#include "TouchScene2.h"

USING_NS_CC;

AppDelegate::AppDelegate() {

}

AppDelegate::~AppDelegate() {

}

bool AppDelegate::applicationDidFinishLaunching() {

    auto director = Director::getInstance();
    auto glView = director->getOpenGLView();

    if (!glView) {
        glView = GLViewImpl::create("Hello World");
        glView->setFrameSize(640, 480);
        director->setOpenGLView(glView);
    }

    auto scene = TouchScene2::createScene();
    director->runWithScene(scene);

    return true;
}

void AppDelegate::applicationDidEnterBackground() {
}

void AppDelegate::applicationWillEnterForeground() {
}

TouchScene2.h

#pragma once

#include "cocos2d.h"

class TouchScene2 : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();
    virtual bool init();

    virtual bool onTouchBegan(cocos2d::Touch*, cocos2d::Event*);
    virtual void onTouchEnded(cocos2d::Touch*, cocos2d::Event*);
    virtual void onTouchMoved(cocos2d::Touch*, cocos2d::Event*);
    virtual void onTouchCancelled(cocos2d::Touch*, cocos2d::Event*);
    CREATE_FUNC(TouchScene2);

private:
    cocos2d::Label* labelTouchInfo;
};

TouchScene2.cpp

#include "TouchScene2.h"

USING_NS_CC;

Scene* TouchScene2::createScene()
{
    auto scene = Scene::create();
    auto layer = TouchScene2::create();
    scene->addChild(layer);

    return scene;
}

bool TouchScene2::init()
{
    if (!Layer::init())
    {
        return false;
    }

    labelTouchInfo = Label::createWithSystemFont("Touch or clicksomewhere to begin", "Arial", 30);

    labelTouchInfo->setPosition(Vec2(
        Director::getInstance()->getVisibleSize().width / 2,
        Director::getInstance()->getVisibleSize().height / 2));

    auto touchListener = EventListenerTouchOneByOne::create();

    touchListener->onTouchBegan = CC_CALLBACK_2(TouchScene2::onTouchBegan, this);
    touchListener->onTouchEnded = CC_CALLBACK_2(TouchScene2::onTouchEnded, this);
    touchListener->onTouchMoved = CC_CALLBACK_2(TouchScene2::onTouchMoved, this);
    touchListener->onTouchCancelled = CC_CALLBACK_2(TouchScene2::onTouchCancelled, this);

    _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,     this);

    this->addChild(labelTouchInfo);
    return true;
}

bool TouchScene2::onTouchBegan(Touch* touch, Event* event)
{
    std::stringstream output;
    output << "Touch Pos: (" << touch->getLocation().x << ", " << touch-    >getLocation().y << ")" << std::endl;
    log(output.str().c_str());

    labelTouchInfo->setPosition(touch->getLocation());
    labelTouchInfo->setString("You Touched Here");
    return true;
}

void TouchScene2::onTouchEnded(Touch* touch, Event* event)
{
    cocos2d::log("touch ended");
}

void TouchScene2::onTouchMoved(Touch* touch, Event* event)
{
    cocos2d::log("touch moved");
}

void TouchScene2::onTouchCancelled(Touch* touch, Event* event)
{
    cocos2d::log("touch cancelled");
}

Следует отметить, что этому учебному пособию уже несколько лет (я думаю, написано в 2015 году). Автор использует бета-версию 3.3, а я использую последнюю версию 3.17.1. Может ли это быть частью проблемы?

И, независимо от того, как я могу исправить эту проблему, чтобы источник был (0, 0), как и должно быть?

...