coco2d-x 基础系列 (07) 带有一些特殊效果的场景变换

本文介绍了一个使用 Cocos2d-x 实现的多场景管理类,该类可以创建并切换四个不同的游戏场景,并且每个场景之间的转换都有独特的过渡效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新建立四个场景,每个场景切换有特殊的效果。

代码结构比较清晰。

#ifndef SCENES_H
#define SCENES_H

#include "cocos2d.h"

USING_NS_CC;

class Scenes : public Ref {
public:
	Scenes();
	~Scenes();
	
	void initialize();
	Scene *createScene2();
	Scene *createScene3();
	Scene *createScene4();
	
	inline Scene *getScene1() {	return scene1; };
protected:
	Scene *scene1;
	Scene *scene2;
	Scene *scene3;
	Scene *scene4;

};

#endif

#include "Scenes.h"

USING_NS_CC;

Scenes::Scenes() {
	initialize();
}

Scenes::~Scenes() {}

void Scenes::initialize() {	
	// some upfront items that we need
	auto dirs = Director::getInstance();
	Size visibleSize = dirs->getVisibleSize();
	Vec2 origin = dirs->getVisibleOrigin();

	// create a scene
	scene1 = Scene::create();

	// create a node to hold non-sprites
	auto nodeItems = Node::create();
	nodeItems->setName("nodeItems");
	
	// create a node to hold menu
	auto menuNode = Node::create();
	menuNode->setName("menuNode");
	int index = 2;

	auto thisSceneLabel = Label::createWithTTF("This is a Scene", "Marker Felt.ttf", 32);
	thisSceneLabel->setPosition(200, 400);
	scene1->addChild(thisSceneLabel, 1);
	
	auto menuItem1 = MenuItemFont::create("Make a new scene");
	menuItem1->setName("menuItem1");
	menuItem1->setPosition(visibleSize.width/2, visibleSize.height - 80);
	menuItem1->setCallback([&](cocos2d::Ref *sender) {
		Director::getInstance()->replaceScene(createScene2());
	});

	auto menu = Menu::create(menuItem1, NULL);
	menu->setName("menu");
	menuNode->addChild(menu, 1);
	menu->setPosition(Vec2::ZERO);
	scene1->addChild(menuNode, 2);
};

Scene *Scenes::createScene2() {
	auto dirs = Director::getInstance();
	Size visibleSize = dirs->getVisibleSize();
	
	scene2 = Scene::create();
	
	// Retains the ownership.
	// This increases the Ref's reference count.
	scene2->retain();
	
	auto nodeItems = Node::create();
	nodeItems->setName("menuNode");
	
	auto menuNode = Node::create();
	nodeItems->setName("menuNode");

	auto thisSceneLabel = Label::createWithTTF("This is a new Scene: Scene2", "Marker Felt.ttf", 32);
	thisSceneLabel->setPosition(400, 500);
	scene2->addChild(thisSceneLabel, 1);

	auto menuItem1 = MenuItemFont::create("Make a new scene using a transition fade");
	menuItem1->setPosition(400, 500);
	menuItem1->setName("menuItem1");
	
	menuItem1->setPosition(500, 200);

	menuItem1->setCallback([&](cocos2d::Ref *sender) {
		Director::getInstance()->replaceScene(TransitionFade::create(0.5, createScene3(), Color3B(0, 255,255)));
	});

	auto menu = Menu::create(menuItem1, NULL);
	menu->setName("menu");
	menuNode->addChild(menu, 1);
	menu->setPosition(Vec2::ZERO);
	scene2->addChild(menuNode, 2);

	return scene2;
}

Scene *Scenes::createScene3() {

	auto dirs = Director::getInstance();
	auto visibleSize = dirs->getVisibleSize();
	

	scene3 = Scene::create();
	scene3->retain();

	auto nodeItems = Node::create();
	nodeItems->setName("nodeItems");
	
	auto menuNode = Node::create();
	menuNode->setName("menuNode");
	
	auto thisSceneLabel = Label::createWithTTF("This scene used a transition", "Marker Felt.ttf", 32);
	thisSceneLabel->setPosition(400, 400);
	scene3->addChild(thisSceneLabel, 1);

	auto menuItem1 = MenuItemFont::create("Make a new Scene using a Flip");
	menuItem1->setPosition(300, 300);

	menuItem1->setCallback([&](cocos2d::Ref *sender) {
		Director::getInstance()->replaceScene(TransitionFlipX::create(2, createScene4()));
	});
	
	auto menu = Menu::create(menuItem1, NULL);
	menu->setPosition(Vec2::ZERO);
	menuNode->addChild(menu, 1);
	scene3->addChild(menuNode, 2);
	return scene3;
}

Scene *Scenes::createScene4() {

	scene4 = Scene::create();
	scene4->retain();

	auto thisSceneLabel = Label::createWithTTF("scene4: this scene use a flip", "Marker Felt.ttf", 32);
	thisSceneLabel->setPosition(300, 200);
	scene4->addChild(thisSceneLabel, 1);

	return scene4;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值