各位大神,我在手机的返回键事件中添加一个新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");
}