一.登录界面:
登录界面通常包括用户的登录、用户注册、快速登录等等菜单选项。
如下简单的登录界面,里面的所有菜单都是用CCMenuItemImage,这也是使用最频繁的菜单项。
实际开发中应该尽量将同一场景中各模块的图片资源打包成大图,这里使用TexturePacker打包图片.CCMenuItemImage使用大图中图片时可以使用如下方式加载.
代码如下:
复制代码
1.快速登录即不用输入账号密码,游戏记录上一次登录信息,这个功能相对简单,可以使用cocos2d-x自带的CCUserDefault类,这是一个单例类,可以实现简单的数据存储功能,它会在本地生成一个xml文件保存用户存储的键值对数据.
代码如下:
复制代码
2.本例中在登录主页面最重要的两个功能是更多游戏和注册,更多游戏说白了也就是通过指定url在手机上显示一个网页。以android平台为例,在android手机上显示一个网页肯定需要android本身的支持,但cocos2d-x使用的是c++语言,这就需要我们去从c++调用android的东西,对于做第三方sdk接入必不可少.下面就来看看如何cocos2d-x中调用android,本例中希望实现的是点击屏幕上方的更多游戏打开对应的页面.
代码如下:
复制代码
整个调用过程就这么简单,剩下就是android的具体实现,通常做sdk接入时,android的处理方法已经封装好,只需要把moreGame换成对应的接口.
3. 注册功能的实现使用的是http协议,这也是cocos2d-x开发中很常用的通信协议。在本例中点击登录页面的注册按钮会弹出注册页面,如下图所示。
页面很简单就3个CCEditBox和一个CCMenuItemImage.那如何实现注册功能呢?我们需要的是将注册的用户名和密码发送给服务器保存下来,并且获知是否注册成功,以及是否已经注册过.下面就来实现如何注册,cocos2d-x现在已经支持http请求,但我们在这里使用更加方便的curl来处理http请求.
代码如下:
复制代码
登录界面通常包括用户的登录、用户注册、快速登录等等菜单选项。
如下简单的登录界面,里面的所有菜单都是用CCMenuItemImage,这也是使用最频繁的菜单项。
![](http://d.9miao.com/attachment/forum/201402/10/140321qipimj7ippvtmzpi.png)
实际开发中应该尽量将同一场景中各模块的图片资源打包成大图,这里使用TexturePacker打包图片.CCMenuItemImage使用大图中图片时可以使用如下方式加载.
代码如下:
- CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("login.plist");//加载plist文件,login.png会自动加进缓存
- CCMenuItemImage* login_btn = CCMenuItemImage::create();
- login_btn->setNormalSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("loginA.png"));//设置正常状态的图片
- login_btn->setSelectedSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("loginB.png"));//设置选中状态的图片
- login_btn->setTarget(this, SEL_MenuHandler(&LoginScene::loginCallback));//回调函数
- //不使用时应该清除掉plist,同时清除纹理缓存.
- CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile("login.plist");
- CCTextureCache::sharedTextureCache()->removeTextureForKey("login.png");
代码如下:
- CCUserDefault::sharedUserDefault()->setStringForKey("userName", editBoxUsername->getText());
- CCUserDefault::sharedUserDefault()->setStringForKey("password", editBoxPassword->getText());
- //所以在快速登录的回调函数中只需要获取对应的"userName"和"password"即可.
- CCUserDefault::sharedUserDefault()->getStringForKey("userName").c_str()
- CCUserDefault::sharedUserDefault()->getStringForKey("password").c_str()
代码如下:
- //首先添加android平台必要的头文件
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
- #include <jni.h>
- #include "platform/android/jni/JniHelper.h"
- #include <android/log.h>
- #endif
- /*然后就是对回调函数的处理,调用android的静态函数相对简单,这里以调用非静态函数为例。调用非静态函数通常需要通过静态函数的单例对象来调用非静态函数,因而需要在android端返回类的单例对象,然后再通过这个对象去调用android的非静态方法。*/
- #if(CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
- JniMethodInfo minfo;
- bool isHave= JniHelper::getStaticMethodInfo(minfo,"org/sgcommunity/test/test","getInstance","()L org/sgcommunity/test/test;");
- jobject jobj;
- if (isHave)
- {
- CCLog("静态函数存在");
- //调用Java静态函数,取得单例对象。
- jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
- }
- isHave= JniHelper::getMethodInfo(minfo,"org/sgcommunity/test/test ","moreGame","()V");//moreGame即对应的android处理方法
- if (isHave)
- {
- CCLog("非静态函数存在");
- minfo.env->CallVoidMethod(jobj, minfo.methodID);//调用java非静态函数,第一个参数为上面取得的对象
- }
- #endif
- Java代码:
- static test ts= null;
- public class test extends Cocos2dxActivity{
- protected void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- fyqFengyanqi=this;
- }
- public static test getInstance(){//返回单例对象
- Log.d("INSTANCE", "Return instance");
- return ts;
- }
3. 注册功能的实现使用的是http协议,这也是cocos2d-x开发中很常用的通信协议。在本例中点击登录页面的注册按钮会弹出注册页面,如下图所示。
![](http://d.9miao.com/attachment/forum/201402/10/140409kisczk3utyneri70.png)
页面很简单就3个CCEditBox和一个CCMenuItemImage.那如何实现注册功能呢?我们需要的是将注册的用户名和密码发送给服务器保存下来,并且获知是否注册成功,以及是否已经注册过.下面就来实现如何注册,cocos2d-x现在已经支持http请求,但我们在这里使用更加方便的curl来处理http请求.
代码如下:
- //首先必须添加头文件
- #include "curl/curl.h"
- //使用get方式进行http请求,将注册的数据拼接到url的后面.
- CURL *curl;
- CURLcode res;
- curl = curl_easy_init();//初始化curl指针
- if (curl)
- {
- char ipstr[100]="";
- sprintf(ipstr, "http://182.50.2.240:11008/register?username=%s&password=%s",registerusername->getText(),secPassword->getText());//将用户名和密码拼接在url最后
- CCLog("%s",ipstr);
- char output[500]="";
- curl_easy_setopt(curl, CURLOPT_URL, ipstr);// curl_easy_setopt是具体的操作行为函数,根据参数指明进行何种操作
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, registerLayer::process_data);
- CCLog("%s",output);
- res = curl_easy_perform(curl);//执行所有的curl操作
- if(res==0)
- {
- CCLog("Succeed!");
- }
- else
- {
- CCLog("Failed!");
- }
- curl_easy_cleanup(curl);//调用结束,清除指针
- }
- /*获取服务器返回信息,CURLOPT_WRITEFUNCTION对应的回调函数的原型size_t function( char *ptr, size_t size, size_t nmemb, void *userdata),使用这个函数接收服务器返回的信息*/
- static const char* message=" ";
- size_t registerLayer::process_data(void *buffer, size_t size, size_t nmemb, void *user_p)
- {
- FILE *fp = (FILE *)user_p;
- size_t return_size = fwrite(buffer, size, nmemb, fp);
- messag=(char *)buffer;
- CCLog("%s",messag);
- if(!strcmp(messag, "b"))//假定注册成功,服务器返回字符b。
- {
- CCMessageBox("注册成功");
- }
- else
- {
- CCMessageBox("此用户已经注册过,请重试", "警告!");
- }
- return return_size;
- }