目录
一、登陆场景头文件——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 (),你会在以后的开发中经常遇到这种情景。