layer显示顺序问题

各位大神,我在手机的返回键事件中添加一个新layer后,底下的层莫名其妙的会跑到上边来,难道layer的显示不是按照添加顺序吗?

win32程序执行结果正确,编译成android后层次就乱了。哪位好心帮忙看看代码,不胜感激。

下面是代码,附件是编译好的额apk.重命名了,论坛传apk好像有点问题。

#include "HelloWorldScene.h"

USING_NS_CC;

Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    bEscLayerVisible = false;
    time_t t;
    time(&t);
    srand(t%100);
    auto touchListener = EventListenerTouchOneByOne::create();
    //touchListener->setSwallowTouches(true);
    touchListener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this);
    touchListener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded , this);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);

    auto keyListener = EventListenerKeyboard::create();
    keyListener->onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased, this);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(keyListener, this);
    score = 0;
    Size visualSize = Director::getInstance()->getVisibleSize();
    auto layerColorBG = LayerColor::create(Color4B(250, 247, 238 , 255));
    addChild(layerColorBG);

    auto layerMap = LayerColor::create(Color4B(186, 174, 162, 255), visualSize.width - BORDER_LEFT*2, visualSize.width - BORDER_LEFT*2);
    layerMap->setPosition(BORDER_LEFT, BORDER_LEFT);
    addChild(layerMap);

    labelScore = Label::createWithTTF(String::createWithFormat("SCORE:%i", score)->getCString(), "fonts/arial.ttf", 50);
    labelScore->setPosition(Point(visualSize.width /3 , visualSize.height - 100));
    labelScore->setColor(Color3B(186, 174, 162));
    addChild(labelScore);

    initCards(visualSize);
    randomCreateCard();
    randomCreateCard();

    auto itemtutorial = MenuItemImage::create("tutorialButton.png", "tutorialButton.png", CC_CALLBACK_1(HelloWorld::tutorialMenuCallback, this));
    auto itemmenu = MenuItemImage::create("menu.png", "menu.png", CC_CALLBACK_1(HelloWorld::menuMenuCallback, this));
    Size szMenu = itemtutorial->getContentSize();
    itemtutorial->setPosition(BORDER_LEFT + szMenu.width / 2, visualSize.height - BORDER_LEFT - szMenu.height / 2);
    itemmenu->setPosition(visualSize.width - BORDER_LEFT - szMenu.width / 2, visualSize.height - BORDER_LEFT - szMenu.height / 2);
    Menu * menu = Menu::create(itemtutorial, itemmenu, nullptr);
    menu->setPosition(Point(0, 0));
    addChild(menu);
    
    return true;
}

bool HelloWorld::onTouchBegan(Touch *touch, Event *unused_event)
{
    Point p = touch->getLocation();

    startX = p.x;
    startY = p.y;
    return true;
}

void HelloWorld::onTouchEnded( Touch *touch, Event *unused_event )
{
    Point p = touch->getLocation();
    moveX = startX - p.x;
    moveY = startY - p.y;
    bool bMoved = false;
    if (moveX == 0 && moveY == 0)
    {
        log("no move");
        return;
    }
    
    if (abs(moveX) > abs(moveY))
    {
        if (moveX > 0)
        {
            bMoved = DoLeft();
        }
        else
        {
            bMoved = DoRight();
        }
        
    }
    else
    {
        if (moveY > 0)
        {
            bMoved = DoDowm();
        }
        else
        {
            bMoved = DoUp();
        }
        
    }
    if (bMoved)
    {
        std::string s = "SCORE:";
        std::stringstream ss;
        ss << score;
        labelScore->setString(s+ss.str());
        randomCreateCard();
    }
    if (IsGameOver())
    {
        Director::getInstance()->replaceScene(TransitionFade::create(1, HelloWorld::createScene()));
    }
    
    
    
}

bool HelloWorld::DoUp()
{
    log("DoUp");
    bool bMoved = false;
    for (int x = 0; x < 4; x++)
    {
        for (int y = 3; y >= 0; y--)
        {
            for (int z = y - 1; z >= 0; z--)
            {
                if (cards->getNumber() > 0)
                {
                    if (cards->getNumber() == 0)
                    {
                        cards->setNumber(cards->getNumber());
                        cards->setNumber(0);
                        bMoved = true;
                        y++;
                    }
                    else if (cards->getNumber() == cards->getNumber())
                    {
                        cards->setNumber(cards->getNumber() * 2);
                        ActionInterval* scaleTo1 = ScaleTo::create(0.1f, 1.1f);
                        ActionInterval* scaleTo2 = ScaleTo::create(0.1f, 1.0f);
                        cards->runAction(Sequence::create(scaleTo1, scaleTo2, nullptr));
                        cards->setNumber(0);
                        score += cards->getNumber();
                        bMoved = true;
                    }
                    break;
                }
            }
        }
    }
    return bMoved;
}

bool HelloWorld::DoDowm()
{
    log("DoDown");
    bool bMoved = false;
    for (int x = 0; x < 4; x++)
    {
        for (int y = 0; y < 4; y++)
        {
            for (int z = y + 1; z < 4; z++)
            {
                if (cards->getNumber() > 0)
                {
                    if (cards->getNumber() == 0)
                    {
                        cards->setNumber(cards->getNumber());
                        cards->setNumber(0);
                        y--;
                        bMoved = true;
                    }
                    else if (cards->getNumber() == cards->getNumber())
                    {
                        cards->setNumber(cards->getNumber() * 2);
                        ActionInterval* scaleTo1 = ScaleTo::create(0.1f, 1.1f);
                        ActionInterval* scaleTo2 = ScaleTo::create(0.1f, 1.0f);
                        cards->runAction(Sequence::create(scaleTo1, scaleTo2, nullptr));
                        cards->setNumber(0);
                        score += cards->getNumber();
                        bMoved = true;
                    }
                    break;
                }
            }
        }
    }
    return bMoved;
}

bool HelloWorld::DoLeft()
{
    log("DoLeft");
    bool bMoved = false;
    for (int y = 0; y < 4;y++)
    {
        for (int x = 0; x < 4; x++)
        {
            for (int z = x + 1; z < 4;z++)
            {
                if (cards->getNumber() > 0)
                {
                    if (cards->getNumber() == 0)
                    {
                        cards->setNumber(cards->getNumber());
                        cards->setNumber(0);
                        x--;
                        bMoved = true;
                    }
                    else if (cards->getNumber() == cards->getNumber())
                    {
                        cards->setNumber(cards->getNumber() * 2);
                        ActionInterval* scaleTo1 = ScaleTo::create(0.1f, 1.1f);
                        ActionInterval* scaleTo2 = ScaleTo::create(0.1f, 1.0f);
                        cards->runAction(Sequence::create(scaleTo1, scaleTo2, nullptr));
                        cards->setNumber(0);
                        score += cards->getNumber();
                        bMoved = true;
                    }
                    break;
                }
            }
        }
    }
    
    return bMoved;
}

bool HelloWorld::DoRight()
{
    log("DoRight");
    bool bMoved = false;
    for (int y = 0; y < 4; y++)
    {
        for (int x = 3; x >= 0; x--)
        {
            for (int z = x - 1; z >= 0; z--)
            {
                if (cards->getNumber() > 0)
                {
                    if (cards->getNumber() == 0)
                    {
                        cards->setNumber(cards->getNumber());
                        cards->setNumber(0);
                        x++;
                        bMoved = true;
                    }
                    else if (cards->getNumber() == cards->getNumber())
                    {
                        cards->setNumber(cards->getNumber() * 2);
                        ActionInterval* scaleTo1 = ScaleTo::create(0.1f, 1.1f);
                        ActionInterval* scaleTo2 = ScaleTo::create(0.1f, 1.0f);
                        cards->runAction(Sequence::create(scaleTo1, scaleTo2, nullptr));

                        cards->setNumber(0);
                        score += cards->getNumber();
                        bMoved = true;
                    }
                    break;
                }
            }
        }
    }
    return bMoved;
}

void HelloWorld::initCards(Size sz)
{
    int unitSize = (sz.width - (BORDER_LEFT + 15)*2) / 4;
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            Card * card = Card::create(0, unitSize-15, unitSize-15);
            card->setPosition(unitSize*i + unitSize / 2 + BORDER_LEFT + 15, unitSize*j + unitSize / 2 + BORDER_LEFT + 15);
            cards = card;
            addChild(card);
        }
        
    }
    
}

void HelloWorld::randomCreateCard()
{
    int i = CCRANDOM_0_1()*16;
    int j = i;
    do 
    {
        if (cards->getNumber() > 0)
        {
            j++;
        }
        else
        {
            Card *card = cards;
            card->setNumber(CCRANDOM_0_1() > 0.3 ? 2 : 4);
            card->setScale(0.1f);
            ActionInterval* scaleTo1 = ScaleTo::create(0.2f, 1.1f);
            ActionInterval* scaleTo2 = ScaleTo::create(0.1f, 1.0f);
            card->runAction(Sequence::create(scaleTo1,scaleTo2 , nullptr));
            break;
        }
        j = j % 16;
        if (j ==i)
        {
            break;
        }
        
    } while (j < 16);
    

    
}

bool HelloWorld::IsGameOver()
{
    bool bGameOver = true;
    for (int x = 0; x < 4;x++)
    {
        for (int y = 0; y < 4;y++)
        {
            if (cards->getNumber() == 0 || \
                (x >0 && cards->getNumber() == cards->getNumber()) || \
                (x <3 && cards->getNumber() == cards->getNumber()) || \
                (y >0 && cards->getNumber() == cards->getNumber()) || \
                (y < 3 && cards->getNumber() == cards->getNumber()))
            {
                bGameOver = false;
                break;
            }
            
        }
    }
    return bGameOver;
}

void HelloWorld::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event)
{
    Size sz = Director::getInstance()->getVisibleSize();
    
    if (keyCode == EventKeyboard::KeyCode::KEY_ESCAPE)
    {
        if (bEscLayerVisible)
        {
            this->removeChildByTag(1);
            bEscLayerVisible = false;
        }
        else
        {
            auto layerExit = LayerColor::create(Color4B(255, 255, 255, 128), sz.width - (BORDER_LEFT) * 2, sz.width - (BORDER_LEFT) * 2);
            layerExit->setPosition(BORDER_LEFT, BORDER_LEFT);
            layerExit->setTag(1);
            bEscLayerVisible = true;
            addChild(layerExit);
        }

    }
}

void HelloWorld::tutorialMenuCallback(Ref* sender)
{
    log("tutorialMenuCallback");
}

void HelloWorld::menuMenuCallback(Ref* sender)
{
    log("menuMenuCallback");
}