问题
I have started Game Development using cocos2dx. And started with HelloWorld sample game. I am able to run this sample game. But when I try to change the Background Color, I am getting error in
**HelloWorldScene.h**
The type 'HelloWorld' must implement the inherited pure virtual method 'cocos2d::CCRGBAProtocol::setOpacity'
**Changes:**
class HelloWorld : public cocos2d::CCLayerColor
and also in
**HelloWorldScene.cpp**
Invalid arguments '
Candidates are:
bool initWithColor(const cocos2d::_ccColor4B &, ?, ?)
bool initWithColor(const cocos2d::_ccColor4B &)
'
**Changes:**
CC_BREAK_IF(!CCLayerColor::initWithColor(ccc4(255,255,255,255)));
I am new for cocos2dx and also for C++. Is there any thing left to include or what? Please help me to solve this issue. Thank You.
EDIT:
HelloWorldScene.cpp
#include "HelloWorldScene.h"
using namespace cocos2d;
using namespace CocosDenshion;
CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do {
// 'scene' is an autorelease object
//CCScene *scene = CCScene::create();
scene = CCScene::create();
CC_BREAK_IF(!scene);
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
CC_BREAK_IF(!layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
bool bRet = false;
do {
//////////////////////////////
// 1. super init first
//if ( !CCLayer::init())
//{
//return false;
//}
//CC_BREAK_IF(!CCLayer::init());
CC_BREAK_IF(!CCLayerColor::initWithColor(ccc4(255,255,255,255)));
/////////////////////////////
// 2. add a menu item with "X" image, which is clicked to quit the program
// you may modify it.
// add a "close" icon to exit the progress. it's an autorelease object
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback) );
pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) );
// create menu, it's an autorelease object
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition( CCPointZero );
this->addChild(pMenu, 1);
/////////////////////////////
// 3. add your codes below...
// add a label shows "Hello World"
// create and initialize a label
CCLabelTTF* pLabel = CCLabelTTF::create("GAME", "Thonburi", 38);
// ask director the window size
CCSize size = CCDirector::sharedDirector()->getWinSize();
// position the label on the center of the screen
pLabel->setPosition( ccp(size.width / 2, size.height - 20) );
// add the label as a child to this layer
this->addChild(pLabel, 1);
// add "HelloWorld" splash screen"
CCSprite* pSprite = CCSprite::create("Untitled1.png");
// position the sprite on the center of the screen
pSprite->setPosition( ccp(size.width/2, size.height/2) );
// add the sprite as a child to this layer
this->addChild(pSprite, 0);
CCSprite* player = CCSprite::create("Player.png", CCRectMake(0, 0, 27, 50));
player->setPosition(ccp(player->getContentSize().width/2, size.height/2));
this->addChild(player);
bRet = true;
} while (0);
return bRet;
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
HelloWorldScene.h
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
#include "SimpleAudioEngine.h"
//class HelloWorld : public cocos2d::CCLayer
class HelloWorld : public cocos2d::CCLayerColor
{
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommand to return the exactly class pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
// implement the "static node()" method manually
CREATE_FUNC(HelloWorld);
};
#endif // __HELLOWORLD_SCENE_H__
回答1:
The best way to change the background colour is to simply do:
glClearColor(1.0,1.0,1.0,1.0);
during your Scene init() method. This way you can completely skip the CCLayerColor steps, and you get the bonus of better overall performances. Cheers!
回答2:
Above Code is correct but one thing is to be noted here for higher versions of cocos 2dx CCLayerColor is used and for lower versions CCLayer is used in HelloWorld.h and HelloWorld.cpp while extend the line
class HelloWorld :public cocos2d::CCLayerColor
in HelloWorld.h
and
CC_BREAK_IF(!CCLayerColor::initWithColor(ccc4(255,255,255,255)));
in HelloWorld.cpp
回答3:
Try with this:
HelloWorldScene.cpp
CCLayerColor* layer1 = CCLayerColor::create(ccc4(255, 255, 255, 255), x, y);
layer1->setPosition( ccp(x/2, y/2));
addChild(layer1);
layer1->runAction(CCRepeatForever::create(CCSequence::create(
CCTintTo::create(6, 255, 0, 255),
CCTintTo::create(6, 255, 255, 255),
CCDelayTime::create(1),
NULL)));
回答4:
I have tried running the HelloWorld example with your changes, i am not getting any errors and i am able to change the background color. I am pasting my classes here. I hope it will help you. Also check my blog on cocos2dx, it is mainly for the bigineers www.touchscreenstudio.com
HelloWorldScene.h
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
#include "Box2D/Box2D.h"
#include "SimpleAudioEngine.h"
class HelloWorld : /*public cocos2d::CCLayer*/ public cocos2d::CCLayerColor
{
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommand to return the exactly class pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
// implement the "static node()" method manually
CREATE_FUNC(HelloWorld);
CCNode* getNode();
};
#endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.cpp
#include "HelloWorldScene.h"
using namespace cocos2d;
CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
bool bRet = false;
do
{
//////////////////////////////////////////////////////////////////////////
// super init first
//////////////////////////////////////////////////////////////////////////
//CC_BREAK_IF(! CCLayer::init());
CC_BREAK_IF(!CCLayerColor::initWithColor(ccc4(255,255,255,255)));
//////////////////////////////////////////////////////////////////////////
// add your codes below...
//////////////////////////////////////////////////////////////////////////
// 1. Add a menu item with "X" image, which is clicked to quit the program.
// Create a "close" menu item with close icon, it's an auto release object.
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
// Place the menu item bottom-right conner.
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
// Create a menu with the "close" menu item, it's an auto release object.
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);
// Add the menu to HelloWorld layer as a child layer.
this->addChild(pMenu, 1);
// 2. Add a label shows "Hello World".
// Create a label and initialize with string "Hello World".
CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);
CC_BREAK_IF(! pLabel);
// Get window size and place the label upper.
CCSize size = CCDirector::sharedDirector()->getWinSize();
pLabel->setPosition(ccp(size.width / 2, size.height - 50));
// Add the label to HelloWorld layer as a child layer.
this->addChild(pLabel, 1);
// 3. Add add a splash screen, show the cocos2d splash image.
CCSprite* pSprite = CCSprite::create("HelloWorld.png");
CC_BREAK_IF(! pSprite);
// Place the sprite on the center of the screen
pSprite->setPosition(ccp(size.width/2, size.height/2));
// Add the sprite to HelloWorld layer as a child layer.
// this->addChild(pSprite, 0);
CCNode* myNode = getNode();
addChild(myNode, 3);
bRet = true;
} while (0);
return bRet;
}
void HelloWorld::menuCloseCallback(CCObject* pSender)
{
// "close" menu item clicked
removeChildByTag(10);
CCDirector::sharedDirector()->end();
}
CCNode* HelloWorld::getNode()
{
CCNode* n = CCNode::create();
n->setTag(9);
return n;
}
回答5:
For those experiencing same problem, you are changing the color indeed but the layer's opacity is set to 0. Try this:
this->setColor(color);//set color as you normally would
this->setOpacity(255);//set opacity to 255 to be completely visible or as needed
This did the trick for me. (My apologies if there is a syntax error in the above code, I use JSB and not cpp)
来源:https://stackoverflow.com/questions/17587536/not-able-to-change-the-background-of-the-scene-in-cocos2dx-android