cocos2dx - 创建地图及玩家(伪)

时间:2021-11-11 19:42:58

接上一节内容:cocos2dx - 环境配置,项目创建

本节主要描述cocos中精灵的创建及点击事件的使用

打开创建好的test项目,看到下图的目录结构,真正的游戏逻辑路径在src下。

cocos2dx - 创建地图及玩家(伪)

AppDelegate类主要描述启动应用的一些设置及回调。

HelloWorldScene类是当前显示界面的场景类。

图片精灵

开始之前,先去掉HelloWorldScene下init方法的内容。然后创建Sprite类并添加到Scene节点中显示,如下:

    // 获取显示的游戏大小
    Size visibleSize = Director::getInstance()->getVisibleSize();
    // 获取显示区域的起始点
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
    
    // 加载图片精灵
    auto sprite = Sprite::create("1.jpg");
    // 设置位置在屏幕中间
    sprite->setPosition(Vec2(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));
    auto size = sprite->getContentSize();
    float scaleX = visibleSize.width / size.width;
    float scaleY = visibleSize.height / size.height;
    float scale = scaleX > scaleY ? scaleX : scaleY;
    sprite->setScale(scale);
    // 添加到节点上
    this->addChild(sprite, 0);

运行结果:

cocos2dx - 创建地图及玩家(伪)

 

游戏画面看起来有点小,在AppDelegate中找到  designResolutionSize ,并设置合适大小。

static cocos2d::Size designResolutionSize = cocos2d::Size(960, 640);

cocos2dx - 创建地图及玩家(伪)

看起来有点模糊,这里是因为我找的原图比较小,在加载时做了等比放大拉伸导致。(体会到没美术的痛苦)

 

屏幕点击事件

先添加一个玩家对象来表现效果,这里addChild第2个参数表示层级,设为1比上面的图片高,则显示在上层。

    // 加载图片精灵
    m_pPlayer = Sprite::create("player.png");
    // 设置位置在屏幕中间
    m_pPlayer->setPosition(Vec2(visibleSize.width / 2 + origin.x, 100 + origin.y));
    // 添加到节点上
    this->addChild(m_pPlayer, 1);

效果如下:

cocos2dx - 创建地图及玩家(伪)

在init添加如下代码,并实现具体的 onTouchMoved 等方法

表示监听this这个窗口的Touch事件,并回调到对应的 onTouchMoved等方法。

    // 添加屏幕点击事件监听
    auto dispatcher = Director::getInstance()->getEventDispatcher();
    auto myListener = EventListenerTouchOneByOne::create();
    //如果不加入此句消息依旧会向下传递  
    myListener->setSwallowTouches(true);
    myListener->onTouchBegan = std::bind(&HelloWorld::onTouchBegan, this, std::placeholders::_1, std::placeholders::_2);
    myListener->onTouchMoved = std::bind(&HelloWorld::onTouchMoved, this, std::placeholders::_1, std::placeholders::_2);
    myListener->onTouchEnded = std::bind(&HelloWorld::onTouchEnded, this, std::placeholders::_1, std::placeholders::_2);
    dispatcher->addEventListenerWithSceneGraphPriority(myListener, this);

在onTouchMoved加入如下代码用来控制player移动看效果。

void HelloWorld::onTouchMoved(Touch *pTouch, Event *pEvent)
{
    if (m_pPlayer)
    {
        // 计算移动后的位置
        float desX = m_pPlayer->getPositionX() + pTouch->getDelta().x;

        // 防止超出屏幕
        Size visibleSize = Director::getInstance()->getVisibleSize();
        Vec2 origin = Director::getInstance()->getVisibleOrigin();
        if (desX<origin.x)
        {
            desX = origin.x;
        }
        if (desX>origin.x+visibleSize.width)
        {
            desX = origin.x + visibleSize.width;
        }
        m_pPlayer->setPositionX(desX);
    }
}

这样游戏中就有了简单的地图背景(图片)及玩家,并且可以进行左右移动。o(∩_∩)o ~