Cocos2d x 如何在C++中为COI COOS2DX制作IOS游戏中的滑动菜单

Cocos2d x 如何在C++中为COI COOS2DX制作IOS游戏中的滑动菜单,cocos2d-x,Cocos2d X,我想做一个滑动菜单,就像水平菜单一样,在一个屏幕上有40个精灵分别标记为1级2级,最多40个。 在右下角将有另一个带有箭头的精灵,当我单击它时,它将滑到其他屏幕并显示41到80级。请向我提供如何使用它的基本概念。我将感谢你。 注意:我正在使用c++/p>在cocos2d-x中使用Xcode和ony want解决方案这是我过去的做法…我有一个游戏,玩家可以选择多艘太空船,每页4艘,每页上都有后退/前进箭头 创建一个场景派生类 放置所有菜单项,包括其上所有页面的控制箭头。您必须将所有项目隔开,以便第

我想做一个滑动菜单,就像水平菜单一样,在一个屏幕上有40个精灵分别标记为1级2级,最多40个。 在右下角将有另一个带有箭头的精灵,当我单击它时,它将滑到其他屏幕并显示41到80级。请向我提供如何使用它的基本概念。我将感谢你。
注意:我正在使用c++/p>在cocos2d-x中使用Xcode和ony want解决方案这是我过去的做法…我有一个游戏,玩家可以选择多艘太空船,每页4艘,每页上都有后退/前进箭头

创建一个场景派生类

放置所有菜单项,包括其上所有页面的控制箭头。您必须将所有项目隔开,以便第一页的项目位于屏幕的可见部分,下一组在右侧100%折扣,第三组在右侧200%折扣,以此类推

场景中的控制按钮启动一个动作,如果层向右移动,则将层100%向左移动;如果层向左移动,则将层100%向右移动

所有这些都附加到一个菜单,这就是应用操作的对象。如果需要,可以将菜单放入一个层中,使其具有可移动的背景。这取决于你

在下面的示例场景中,我只使用了一个简单的菜单

主要场景

mainsecene.cpp

请注意,让项目分布在多个页面上的公式可能有点棘手。有一个屏幕分数的概念,即项目网格在页面上所占的比例。还有菜单锚的概念,您希望网格位于页面上的什么位置

一些屏幕截图


这就是我过去的做法……我有一个游戏,玩家可以选择多艘太空船,每页4艘,每页上都有后退/前进箭头

创建一个场景派生类

放置所有菜单项,包括其上所有页面的控制箭头。您必须将所有项目隔开,以便第一页的项目位于屏幕的可见部分,下一组在右侧100%折扣,第三组在右侧200%折扣,以此类推

场景中的控制按钮启动一个动作,如果层向右移动,则将层100%向左移动;如果层向左移动,则将层100%向右移动

所有这些都附加到一个菜单,这就是应用操作的对象。如果需要,可以将菜单放入一个层中,使其具有可移动的背景。这取决于你

在下面的示例场景中,我只使用了一个简单的菜单

主要场景

mainsecene.cpp

请注意,让项目分布在多个页面上的公式可能有点棘手。有一个屏幕分数的概念,即项目网格在页面上所占的比例。还有菜单锚的概念,您希望网格位于页面上的什么位置

一些屏幕截图


我已经修改了现有的一个并上传到github。以下是链接:


你可能会发现它很有用。您可以直接将其添加到游戏中。

我已经修改了现有的一个并上传到github中。以下是链接:


你可能会发现它很有用。您可以直接将其添加到您的游戏中。

或者您也可以用更少的代码以现代的方式完成

// you have to include this header to use the ui classes
#include "ui/CocosGUI.h"
using namespace ui;

#define COLS 4
#define ROWS 4
#define ITEMS_PER_PAGE (ROWS * COLS)
#define TOTAL_PAGES_NUM 10

#define MENU_PADDING (Vec2(0.8,0.8))
#define MENU_ANCHOR (Vec2(0.5,0.5))

static Vec2 calcPosition(int itemNum)
{
    Size scrSize = Director::getInstance()->getWinSize();
    float Xs = scrSize.width;
    float Ys = scrSize.height;
    float Xb = MENU_PADDING.x*Xs / COLS;
    float Yb = MENU_PADDING.y*Ys / ROWS;
    float Xa = MENU_ANCHOR.x * Xs;
    float Ya = MENU_ANCHOR.y * Ys;
    int page = itemNum / ITEMS_PER_PAGE;

    int binCol = itemNum % COLS;
    int binRow = (itemNum - page * ITEMS_PER_PAGE) / COLS;

    float xPos = binCol * Xb + Xb / 2 + Xa - MENU_PADDING.x*Xs / 2 + page * Xs;
    float yPos = Ya - binRow*Yb - Yb / 2 + MENU_PADDING.y * Ys / 2;

    return Vec2(xPos, yPos);
}


//init method

// pageView is the container that will contain all pages
auto pageView = PageView::create();
pageView->setContentSize(winSize);

//if you want pages indicator just uncomment this
//pageView->setIndicatorEnabled(true);
//pageView->setIndicatorPosition(some position);
//pageView->setIndicatorSelectedIndexColor(some Color3B);


for (int i = 0; i < TOTAL_PAGES_NUM; i++) {

    auto layout = Layout::create();
    layout->setContentSize(winSize);

    // give each page a different random color
    int r = rand() % 200;
    int g = rand() % 200;
    int b = rand() % 200;
    auto bg = LayerColor::create(Color4B(Color3B(r, g, b)), winSize.width, winSize.height);
    layout->addChild(bg, 0);

    // populate each single page with items (which are in this case labels)
    for (int i = 0; i < ITEMS_PER_PAGE; i++) {
        auto label = LabelTTF::create(StringUtils::format("item %i", (i + 1)), "Comic Sans MS", 15);
        Vec2 pos = calcPosition(i);
        label->setPosition(pos);
        layout->addChild(label, 1);
    }

    pageView->addPage(layout);
}

this->addChild(pageView);

或者你可以用更少的代码用现代的方式来做

// you have to include this header to use the ui classes
#include "ui/CocosGUI.h"
using namespace ui;

#define COLS 4
#define ROWS 4
#define ITEMS_PER_PAGE (ROWS * COLS)
#define TOTAL_PAGES_NUM 10

#define MENU_PADDING (Vec2(0.8,0.8))
#define MENU_ANCHOR (Vec2(0.5,0.5))

static Vec2 calcPosition(int itemNum)
{
    Size scrSize = Director::getInstance()->getWinSize();
    float Xs = scrSize.width;
    float Ys = scrSize.height;
    float Xb = MENU_PADDING.x*Xs / COLS;
    float Yb = MENU_PADDING.y*Ys / ROWS;
    float Xa = MENU_ANCHOR.x * Xs;
    float Ya = MENU_ANCHOR.y * Ys;
    int page = itemNum / ITEMS_PER_PAGE;

    int binCol = itemNum % COLS;
    int binRow = (itemNum - page * ITEMS_PER_PAGE) / COLS;

    float xPos = binCol * Xb + Xb / 2 + Xa - MENU_PADDING.x*Xs / 2 + page * Xs;
    float yPos = Ya - binRow*Yb - Yb / 2 + MENU_PADDING.y * Ys / 2;

    return Vec2(xPos, yPos);
}


//init method

// pageView is the container that will contain all pages
auto pageView = PageView::create();
pageView->setContentSize(winSize);

//if you want pages indicator just uncomment this
//pageView->setIndicatorEnabled(true);
//pageView->setIndicatorPosition(some position);
//pageView->setIndicatorSelectedIndexColor(some Color3B);


for (int i = 0; i < TOTAL_PAGES_NUM; i++) {

    auto layout = Layout::create();
    layout->setContentSize(winSize);

    // give each page a different random color
    int r = rand() % 200;
    int g = rand() % 200;
    int b = rand() % 200;
    auto bg = LayerColor::create(Color4B(Color3B(r, g, b)), winSize.width, winSize.height);
    layout->addChild(bg, 0);

    // populate each single page with items (which are in this case labels)
    for (int i = 0; i < ITEMS_PER_PAGE; i++) {
        auto label = LabelTTF::create(StringUtils::format("item %i", (i + 1)), "Comic Sans MS", 15);
        Vec2 pos = calcPosition(i);
        label->setPosition(pos);
        layout->addChild(label, 1);
    }

    pageView->addPage(layout);
}

this->addChild(pageView);

非常感谢您的快速回复,先生。如果你能发送一个演示代码,对我来说会很容易。非常感谢Hanks brother。太好了。希望将来能收到你的帮助,因为这对我来说是一个巨大的祝福。欢迎你。请随意查看其他帖子…我已经发布了许多cocos2d-x的解决方案,其中大部分都有代码…很多都在github上。太好了。你能把你帖子的URL发给我吗。我真的很想看到他们所有人。我的身份证rajanmaheshwari1990@gmail.comReally谢谢你的快速回复,先生。如果你能发送一个演示代码,对我来说会很容易。非常感谢Hanks brother。太好了。希望将来能收到你的帮助,因为这对我来说是一个巨大的祝福。欢迎你。请随意查看其他帖子…我已经发布了许多cocos2d-x的解决方案,其中大部分都有代码…很多都在github上。太好了。你能把你帖子的URL发给我吗。我真的很想看到他们所有人。我的身份证rajanmaheshwari1990@gmail.com
// you have to include this header to use the ui classes
#include "ui/CocosGUI.h"
using namespace ui;

#define COLS 4
#define ROWS 4
#define ITEMS_PER_PAGE (ROWS * COLS)
#define TOTAL_PAGES_NUM 10

#define MENU_PADDING (Vec2(0.8,0.8))
#define MENU_ANCHOR (Vec2(0.5,0.5))

static Vec2 calcPosition(int itemNum)
{
    Size scrSize = Director::getInstance()->getWinSize();
    float Xs = scrSize.width;
    float Ys = scrSize.height;
    float Xb = MENU_PADDING.x*Xs / COLS;
    float Yb = MENU_PADDING.y*Ys / ROWS;
    float Xa = MENU_ANCHOR.x * Xs;
    float Ya = MENU_ANCHOR.y * Ys;
    int page = itemNum / ITEMS_PER_PAGE;

    int binCol = itemNum % COLS;
    int binRow = (itemNum - page * ITEMS_PER_PAGE) / COLS;

    float xPos = binCol * Xb + Xb / 2 + Xa - MENU_PADDING.x*Xs / 2 + page * Xs;
    float yPos = Ya - binRow*Yb - Yb / 2 + MENU_PADDING.y * Ys / 2;

    return Vec2(xPos, yPos);
}


//init method

// pageView is the container that will contain all pages
auto pageView = PageView::create();
pageView->setContentSize(winSize);

//if you want pages indicator just uncomment this
//pageView->setIndicatorEnabled(true);
//pageView->setIndicatorPosition(some position);
//pageView->setIndicatorSelectedIndexColor(some Color3B);


for (int i = 0; i < TOTAL_PAGES_NUM; i++) {

    auto layout = Layout::create();
    layout->setContentSize(winSize);

    // give each page a different random color
    int r = rand() % 200;
    int g = rand() % 200;
    int b = rand() % 200;
    auto bg = LayerColor::create(Color4B(Color3B(r, g, b)), winSize.width, winSize.height);
    layout->addChild(bg, 0);

    // populate each single page with items (which are in this case labels)
    for (int i = 0; i < ITEMS_PER_PAGE; i++) {
        auto label = LabelTTF::create(StringUtils::format("item %i", (i + 1)), "Comic Sans MS", 15);
        Vec2 pos = calcPosition(i);
        label->setPosition(pos);
        layout->addChild(label, 1);
    }

    pageView->addPage(layout);
}

this->addChild(pageView);