二、登陆场景界面

本文详细介绍了登陆界面的构成,包括背景、文本、Logo、角色动画等元素,并讲解了LoginScene.h和LoginScene.cpp文件中的关键代码,强调了Scene与Layer的关系以及静态方法Scene* scene()的重要性。

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

目录

一、登陆场景头文件——LoginScene.h

 二、登陆场景ccp文件——LoginScene.cpp

三、载入logo界面——切换场景到登陆场景

四、注意

正文

登陆界面的元素有登陆界面背景、游戏版本(文本格式)、游戏名字logo、游戏角色两个及其进入动画、进入游戏和跳动动画及其背景、游戏声明及其背景。这些就是整个登陆界面的元素,有些是Sprite、有些是LabelTTF创建的文本。具体细节见下面代码。

一、登陆场景头文件——LoginScene.h

#pragma once 
#include "cocos2d.h"
USING_NS_CC;

class LoginScene : public Layer
{
public:
	LoginScene();
	~LoginScene();
	
	static Scene* scene();
	virtual bool init();
	CREATE_FUNC(LoginScene);
private:
	void initUI();
	void initWebView();
	void startGame(Ref *pSender);
};

其中,类LoginScene继承(is-a)自Layer,这些类已经写过很多遍了,需要注意:LoginScene其实继承了很多层(Layer)的成员,但是该类中成员函数static Scene*scene();是为创建场景存在,LoginScene本质是层,我们的“精灵”等加入层,而在scene()把层加入了场景中,这和示例的HelloWorldScene中的静态方法一致,以后会经常用到这种方法,需要特别注意,都是一样套路。具体实现见登陆场景ccp文件——LoginScene.cpp.

 二、登陆场景ccp文件——LoginScene.cpp

#include "LoginScene.h"
#include "StoryScene.h"

// C++调用Java层 xiaominghimi.blog.51cto.com/2614927/908804
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#endif

LoginScene::LoginScene()
{}

LoginScene::~LoginScene()
{}

Scene* LoginScene::scene()
{
	// 创建一个autorelease对象:场景
	auto scene = Scene::create();
	// 创建一个autorelease对象:层
	auto layer = LoginScene::create();// 调用了StoryScene::init()方法
	// 向场景中加入层
	scene->addChild(layer);
	// 返回场景
	return scene;
}

bool LoginScene::init()
{
	bool bRef = false;
	do
	{
		CC_BREAK_IF(!Layer::init());
		initUI();
		initWebView();

		bRef = true;
	} while (0);
	
	return bRef;
}

void LoginScene::initUI()
{
	Size visibleSize = Director::getInstance()->getVisibleSize();
	// 加载背景
	SpriteFrame* spriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("login_bei.png");
	Sprite* backGround = Sprite::createWithSpriteFrame(spriteFrame);

	backGround->setScale(1.877f);
	backGround->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));

	this->addChild(backGround);

	// 加载LOGO
	SpriteFrame* logoSpriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("login_logo.png");
	Sprite* logo = Sprite::createWithSpriteFrame(logoSpriteFrame);

	logo->setAnchorPoint(Vec2(0, 1));
	logo->setPosition(Vec2(15, visibleSize.height - 40));

	this->addChild(logo);

	// 大小姐
	SpriteFrame* daxiaojieSpriteFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("login_daxiaojie.png");
	Sprite* daxiaojie = Sprite::createWithSpriteFrame(daxiaojieSpriteFrame);

	daxiaojie->setAnchorPoint(Vec2(1, 0));
	daxiaojie->setPosition(Vec2(visibleSize.width + daxiaojie->getContentSize().width, visibleSize.height / 2 * 0.8));
	// 大小姐动画
	MoveBy* daxiaojieMove = MoveBy::create(0.2f, Vec2(0 - daxiaojie->getContentSize().width, 0));
	daxiaojie->runAction(daxiaojieMove);

	this->addChild(daxiaojie);

	// mt 傻馒
	Sprite* shaman = Sprite::createWithSpriteFrame( SpriteFrameCache::getInstance()->getSpriteFrameByName("login_shaman.png") );
	shaman->setAnchorPoint(Vec2(0, 1));
	shaman->setPosition(Vec2(0 - shaman->getContentSize().width, visibleSize.height / 2 * 1.2));
	this->addChild(shaman);

	MoveBy* shamanMove = MoveBy::create(0.2f, Vec2(shaman->getContentSize().width, 0));
	shaman->runAction(shamanMove);

	// 版本
	LabelTTF* version = LabelTTF::create("v1.0.1", "Arial", 25);
	version->setAnchorPoint(Vec2(0, 1));
	version->setPosition(Vec2(10, visibleSize.height - 15));
	this->addChild(version);

	// 黑框
	Sprite* fff = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("login_fff.png"));
	fff->setScaleX(10.67f);
	fff->setPosition(Vec2(visibleSize.width / 2, fff->getContentSize().height / 2));
	this->addChild(fff);

	// 底部文字
	Sprite* y = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("login_y.png"));
	y->setPosition(Vec2(visibleSize.width / 2, y->getContentSize().height / 2 + 7));
	this->addChild(y);

	// 离散效果
	Sprite* suduxian = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("login_suduxian.png"));
	suduxian->setScaleX(1.877f);
	suduxian->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
	this->addChild(suduxian);

	// 开始游戏背景
	Sprite* startGameBackground = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("login_textbase.png"));
	startGameBackground->setScale(1.877f);
	startGameBackground->setPosition(visibleSize.width / 2, 115);
	this->addChild(startGameBackground);

	// 开始按钮
	Sprite* startGameNormal = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("login_logo.png"));
	Sprite* startGameselected = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Texture_startgame.png"));

	MenuItemSprite* enterGameItem = MenuItemSprite::create(startGameNormal, startGameselected, nullptr,menu_selector(LoginScene::startGame));
	enterGameItem->setPosition(Vec2(visibleSize.width / 2, 115));

	Menu* enterGameMenu = Menu::create(enterGameItem, nullptr);// 最后一个参数要加上

	enterGameMenu->setPosition(0.0f, 50.0f);
	this->addChild(enterGameMenu);

	/*开始按钮动画*/
	ScaleTo* scaleBiger = ScaleTo::create(0.3f, 1.02f);
	ScaleTo* scaleLitter = ScaleTo::create(0.3f, 1.0f);
	Sequence* sequence = Sequence::create(scaleBiger, scaleLitter, NULL);

	enterGameMenu->runAction(RepeatForever::create(sequence));

}

void LoginScene::startGame(Ref *pSender)
{
	Director* director = Director::getInstance();
	Scene* storyScene = StoryScene::scene();// 注意:StoryScene继承自Layer
	director->replaceScene(storyScene);
}

/// 在安卓平台才会生效的东西
void LoginScene::initWebView()
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
	JniMethodInfo minfo;//定义Jni函数信息的结构体
	bool isHave = JniHelper::getStaticMethodInfo("com/Bigosprite/CarDemo/CarDemo", "getInstance", "()Lcom/Bigosprite/CarDemo/CarDemo");
	if (isHave){
		jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
		isHave = JniHelper::getMethodInfo(minfo, "com/Bigosprite/CarDemo/CarDemo", "openWebView", "()v");
		if (isHave){
			minfo.env->CallVoidMethod(jobj, minfo.methodID);
		}
	}
#endif
}

这里的StoryScene是登陆场景之后的故事场景类,将在下篇文章中介绍。

三、载入logo界面——切换场景到登陆场景
引入头文件#include "LoginScene.h",然后在CopyrightScene类的方法gotoNextScene()中注册即可,具体代码如下:

// 切换场景
void CopyrightScene::gotoNextScene(float dt)
{
	auto director = Director::getInstance();
	Scene* _loginScene = LoginScene::scene();
	director->replaceScene(_loginScene);
}
四、注意

HelloWorldScene继承自Layer,LoginScene继承自Layer,并且下一篇文章的故事场景类StoryScene也继承自Layer,既然是场景,为什么不继承Scene呢?这里有个小技巧:Scene里面放的是层(Layer),Layer中又放置各种UI(Sprite),这里继承自Layer是因为在*Scene类中添加了静态方法Scene* scene(),该方法返回一个场景,并且该方法中”层“已经加入了“场景”。请记住:我们写场景类的时候,类继承于Layer,并添加公有静态方法Scene* scene (),你会在以后的开发中经常遇到这种情景。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值