前のセクションのサーバー部分の開発が完了しました。このセクションでは、UI の作成から始まるクライアント部分の開発を開始します。
ログイン認証なのでログインインターフェースは当然必要で、UIは最低限ゲームっぽいものにする必要があるので、ここでは基本的な操作を使いたくないので、cocostudioを使って作ります。 cocostudio には次のような標準ログイン インターフェイスがあります:
手間を省くために、Cocostudio の最新バージョン (v2.2.8) を使用しました。 もちろん、cocostudio1.6 を使用して json ファイルを直接エクスポートすることもできます。 , しかし、それほど便利ではありません。初めて使用し、VS2012 用の C++ プロジェクトを構築するために使用したい場合は、まずストアで Cocos Framework v3.6 をダウンロードする必要があります。cocos->新しいプロジェクト LoginDemo を開始し、ログイン サンプルを選択します。テンプレートに追加すると、自動的に開き、Cocostudio によってこのインターフェイスが表示されます。 cocostudio では、プログラムで使用できるように、いくつかの重要なコントロールに名前を付ける必要があります。たとえば、以下に示すように、ユーザー名入力ボックスは txtUser に変更されます。
他の重要なコントロールには、という名前のパスワード入力ボックスが含まれます。 txtPass、ログイン ログイン ボタンは btnLogin という名前に変更され、LoginOut ボタンは役に立ちません。登録ボタン btnRegister と、ログインが成功したかどうかを示す結果ラベル txtResult を追加します。結局のところ、これは Text です。 [プロジェクト] -> [発行とパッケージ化] を選択します。以下に示すように、発行タイプは [Visual Studio プロジェクト] です:
その横にある設定ボタンをクリックし、データ形式を次のように設定します。 csb 形式。公開コンテンツは次のようにリソースとプロジェクト ファイルを公開します。図:
[OK] をクリックして公開します。UI の作成が完了したので、前のプロジェクトで作成したパスに移動して開くことができます。 VS プロジェクトを作成してコーディングを始めましょう。
まず第一に、ネットワークは常にエラーが発生しやすいものであるため、焦らずに実行してみましょう。率直に言うと、ログイン インターフェイスは表示されますが、Cocos+VS によってすでに実行されており、自動生成されるコードは次のようになります。
bool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } auto rootNode = CSLoader::createNode("MainScene.csb"); addChild(rootNode); return true;}
private: cocos2d::ui::TextField* txtUser; //用户名输入框 cocos2d::ui::TextField* txtPass; //密码 cocos2d::ui::Text* lblResult; //结果标签 cocos2d::ui::Button* btnRegister; //注册按钮 cocos2d::ui::Button* btnLogin; //登录按钮 void onBtnLoginClicked(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type); //登录点击 void onBtnRegClicked(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type); //注册点击
Node* HelloWorld::seekNodeByTag(Node* root, int tag){ if (!root) { return nullptr; } if (root->getTag()==tag) { return root; } //获取root下所有的孩子 const auto& arrayRootChildren = root->getChildren(); ssize_t length = arrayRootChildren.size(); for (ssize_t i=0; i<length; i++) { //取出root下的一个孩子结点 Node* child = dynamic_cast<Node*>(arrayRootChildren.at(i)); if (child) { Node* res = seekNodeByTag(child, tag); //在child下递归查找tag结点 if (res!=nullptr) { return res; //找到了 } } } return nullptr;}
//递归寻找在root根下以Name标记的结点Node* HelloWorld::seekNodeByName(cocos2d::Node* root, const std::string& name){ if (!root) { return nullptr; } if (root->getName() == name) { return root; } //获取root下所有的孩子 const auto& arrayRootChildren = root->getChildren(); for (auto& subWidget : arrayRootChildren) { //取出root下的一个孩子结点 Node* child = dynamic_cast<Node*>(subWidget); if (child) { Node* res = seekNodeByName(child, name); //在child下递归寻找name名字结点 if (res != nullptr) { return res; //找到了,就返回它 } } } return nullptr;}
本当にコントロールを取り出すかどうかをテストするには、ログイン ボタンの応答イベントに次の実験的なコードを記述します。
txtUser = dynamic_cast<TextField*>(this->seekNodeByName(rootNode, "txtUser")); txtPass = dynamic_cast<TextField*>(this->seekNodeByName(rootNode, "txtPass")); lblResult = dynamic_cast<Text*>(this->seekNodeByName(rootNode, "txtResult")); btnLogin = dynamic_cast<Button*>(this->seekNodeByName(rootNode, "btnLogin"));; btnRegister = dynamic_cast<Button*>(this->seekNodeByName(rootNode, "btnRegister")); lblResult->setString(""); btnLogin->addTouchEventListener(CC_CALLBACK_2(HelloWorld::onBtnLoginClicked, this)); //登录按钮关联单击事件 btnRegister->addTouchEventListener(CC_CALLBACK_2(HelloWorld::onBtnRegClicked, this)); //注册按钮关联单击事件