Cocos2d-x Scene Update
Update
You can override update method in your scene(cocos2d::Layer).
GameScene.h
class GameScene : public cocos2d::Layer
{
public:
void update(float dt);
}
GameScene.cpp
void GameScene::update(float dt) {
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// Update position etc...
}
Background scroll
This example is longitudinal scroll.
bool GameScene::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// Create background(create 2 images, easy version)
for (int i=0; i < 2; i++) {
backgroundSpriteArray[i] = Sprite::create("space.png");
backgroundSpriteArray[i]->setPosition(Point(visibleSize.width / 2, (-1 * visibleSize.height * i) + visibleSize.height / 2));
this->addChild(backgroundSpriteArray[i], -1);
}
}
void GameScene::update(float dt) {
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
// Update background(height scroll)
for (int i=0; i < 2; i++) {
if (backgroundSpriteArray[i]->getPosition().y >= visibleSize.height + (visibleSize.height /2) - 1) {
backgroundSpriteArray[i]->setPosition(Point( (visibleSize.width / 2) + origin.x, (-1 * visibleSize.height) + (visibleSize.height / 2)));
}
}
for (int i=0; i < 2; i++) {
backgroundSpriteArray[i]->setPosition(Point(backgroundSpriteArray[i]->getPosition().x, backgroundSpriteArray[i]->getPosition().y + (0.75 * visibleSize.height * dt)));
}
}
Position update and enemy emerge
We can separate position update and emerge feature.
Add additional schedule method in init and implement enemy manager.
We have items in header std::vector
bool GameScene::init()
{
// General Update
this->scheduleUpdate();
// Update enemy
this->schedule(schedule_selector(GameScreen::enemy), 1.0); // 1.0 is interval
return true;
}
General update
for (int i=0; i < items.size(); i++) {
items[i]->setPosition(Point(items[i]->getPosition().x, items[i]->getPosition().y + (0.75 * visibleSize.height * dt)));
// If the asteroid is out of display, delete
if ( items[i]->getPosition().y > visibleSize.height * 2) {
this->removeChild(items[i]);
items.erase(items.begin() + i);
}
}
Emerge
void GameScene::emerge(float dt) {
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
int index = (arc4random() % 3) + 1;
Sprite *tempE = Sprite::create("enemy.png");
int xRandomPosition = (arc4random() % (int)(visibleSize.width - (tempE->getContentSize().width / 2))) + (tempE->getContentSize().width / 2);
tempE->setPosition(Point(xRandomPosition + origin.x, -tempE->getContentSize().height + origin.y));
items.push_back(tempE);
this->addChild(items[items.size()-1], -1);
}
