《入门级-Cocos2dx4.0 塔防游戏开发》---第六课:欢迎界面开发(四、自定义精灵)

这篇具有很好参考价值的文章主要介绍了《入门级-Cocos2dx4.0 塔防游戏开发》---第六课:欢迎界面开发(四、自定义精灵)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

 一、开发环境

二、开发内容

2. 1 新建自定义精灵

2.2 在welcome中创建新的menu

2.3 消息绑定以及消息响应

三、演示效果

四、知识点

4.1 内部消息响应

4.2 字体精灵说明

4.3 CC_SYNTHESIZE宏


 一、开发环境

操作系统:UOS1060专业版本。

cocos2dx:版本4.0

环境搭建教程:统信UOS下配置安装cocos2dx开发环境

本课主要内容:

  1. 自定义精灵
  2. 复习复习精灵的加载以及位置设置

文章地址:https://arv000.blog.csdn.net/article/details/132237172

二、开发内容

有时我们需要自定义一些精灵来完成一些内容。

本节课通过编写存档按钮,来简单的讲解自定义精灵的开发。

游戏设置了三个存档按钮,为了对按钮进行区分。因此在创建精灵时,我们可以通过传递不同的索引参数来进行判断控制,并且通过索引来记录不同的存档内容。

我们可以将sprite当成一个容器,里面可以添加多个sprite进行组合使用。

2. 1 新建自定义精灵

新建Sprite目录,中添加文件SlotMenuSprite.h,SlotMenuSprite.cpp,

SlotMenuSprite.h内容如下:

#ifndef _SPRITE_SLOT_MENU_SPRITE_H_
#define _SPRITE_SLOT_MENU_SPRITE_H_

#include "cocos2d.h"
USING_NS_CC;

class SlotMenuSprite : public Sprite {

public:
    SlotMenuSprite();
    ~SlotMenuSprite();
    virtual bool initWithNum(int num);
    CREATE_FUNC(SlotMenuSprite)
        // 
        void touchSavelotDelete(Ref * pSender);
        void touchConformDelete(Ref *pSender);
        void touchCancelDelete(Ref *pSender);
        bool touchBeganSaveslot(Touch* touch,Event * event);
        bool touchEndedSaveslot(Touch* touch,Event * event);
        void createNewGame();
        void initEvent();
        static SlotMenuSprite *createMenu(int num);

private:
    Label *label_hint_;
    MenuItemSprite *menu_item_sprite_saveslot_delete_;
    Sprite *sprite_saveslot_;
    MenuItemSprite *menu_item_sprite_confirm_delete_;
    MenuItemSprite *menu_item_sprite_cancel_delete_;
    CC_SYNTHESIZE(int,num,Num)
};

#endif

SlotMenuSprite.cpp文件内容如下:

#include "SlotMenuSprite.h"

SlotMenuSprite::SlotMenuSprite()
{

}

SlotMenuSprite::~SlotMenuSprite()
{

}

bool SlotMenuSprite::initWithNum(int num)
{
    if(!Sprite::init()){
        return  false;
    }
   setNum(num);
   sprite_saveslot_ = Sprite::createWithSpriteFrameName("mainmenu_saveslot_0001.png");
   addChild(sprite_saveslot_);

   if(UserDefault::getInstance()->getIntegerForKey(StringUtils::format("Slot%d",getNum()).c_str(),0) == 0){
        createNewGame();
     //   menu_item_sprite_saveslot_delete_->setVisible(false);
   }
   initEvent();
   return true;
}

void SlotMenuSprite::touchSavelotDelete(Ref *pSender)
{
    CCLOG("SlotMenuSprite::touchSavelotDelete");
}

void SlotMenuSprite::touchConformDelete(Ref *pSender)
{
     CCLOG("SlotMenuSprite::touchConformDelete");
}

void SlotMenuSprite::touchCancelDelete(Ref *pSender)
{
    CCLOG("SlotMenuSprite::touchCancelDelete");
}

bool SlotMenuSprite::touchBeganSaveslot(Touch *touch, Event *event)
{

    auto sprite = static_cast<Sprite*>(event->getCurrentTarget());
    Point localtoinInNode = sprite->convertTouchToNodeSpace(touch);
    Rect rect = Rect(0,0,sprite->getContentSize().width,sprite->getContentSize().height);
    if(rect.containsPoint(localtoinInNode)){
        sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("mainmenu_saveslot_0002.png"));
        CCLOG("SlotMenuSprite::touchBeganSaveslot");
        return  true;
    }
    return  false;
}

bool SlotMenuSprite::touchEndedSaveslot(Touch *touch, Event *event)
{
    // 跳转到游戏界面
    return  false;
}

void SlotMenuSprite::createNewGame()
{
    auto label = Label::createWithTTF("new game","Comic_Book.ttf",42,Size::ZERO,TextHAlignment::LEFT,TextVAlignment::TOP);
    label->setColor(Color3B(219,205,139));
    label->setPosition(Point(sprite_saveslot_->getContentSize().width/2,sprite_saveslot_->getContentSize().height/2));
    sprite_saveslot_->addChild(label);
}

void SlotMenuSprite::initEvent()
{
    auto saveslot_listener = EventListenerTouchOneByOne::create();
    saveslot_listener->onTouchBegan = CC_CALLBACK_2(SlotMenuSprite::touchBeganSaveslot,this);
    saveslot_listener->onTouchEnded = CC_CALLBACK_2(SlotMenuSprite::touchEndedSaveslot,this);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(saveslot_listener,sprite_saveslot_);
}

SlotMenuSprite *SlotMenuSprite::createMenu(int num)
{
    auto slotMenu = new SlotMenuSprite();
    // 创建存储按钮
    if(slotMenu && slotMenu->initWithNum(num)){
        slotMenu->autorelease();
        return slotMenu;
    }
    CC_SAFE_DELETE(slotMenu);
    return nullptr;
}

我们在新自定义的精灵中添加了sprite_saveslot_作为背景,并在其中还添加了label

2.2 在welcome中创建新的menu

我们在welcome中添加initMenuSave中添加

 auto slot_0 = SlotMenuSprite::createMenu(2);
    slot_0->setPosition(Point(sprite_menu_save_->getContentSize().width/2,sprite_menu_save_->getContentSize().height/2));
    sprite_menu_save_->addChild(slot_0);


    auto slot_1 = SlotMenuSprite::createMenu(1);
    slot_1->setPosition(Point(sprite_menu_save_->getContentSize().width/4 - 30,sprite_menu_save_->getContentSize().height/2));
    sprite_menu_save_->addChild(slot_1);

    auto slot_2 = SlotMenuSprite::createMenu(3);
    slot_2->setPosition(Point(sprite_menu_save_->getContentSize().width/4*3 + 30,sprite_menu_save_->getContentSize().height/2));
    sprite_menu_save_->addChild(slot_2);

这样我们就可以在欢迎页面中添加自定义餐单了。

2.3 消息绑定以及消息响应

在处理自定义精灵中的按钮touch消失需要特别注意,因为坐标的问题,因此我们需要将 touch的坐标转为精灵内部坐标,因此需要使用。sprite->convertTouchToNodeSpace(touch);将坐标进行转化。

bool SlotMenuSprite::touchBeganSaveslot(Touch *touch, Event *event)
{

    auto sprite = static_cast<Sprite*>(event->getCurrentTarget());
    Point localtoinInNode = sprite->convertTouchToNodeSpace(touch);
    Rect rect = Rect(0,0,sprite->getContentSize().width,sprite->getContentSize().height);
    if(rect.containsPoint(localtoinInNode)){
        sprite->setSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("mainmenu_saveslot_0002.png"));
        CCLOG("SlotMenuSprite::touchBeganSaveslot");
        return  true;
    }
    return  false;
}

三、演示效果

《入门级-Cocos2dx4.0 塔防游戏开发》---第六课:欢迎界面开发(四、自定义精灵),cosos2d,cocos2d,游戏引擎,塔防

四、知识点

4.1 内部消息响应

在处理自定义精灵中的按钮touch消失需要特别注意,因为坐标的问题,因此我们需要将 touch的坐标转为精灵内部坐标,因此需要使用。sprite->convertTouchToNodeSpace(touch);将坐标进行转化。

4.2 字体精灵说明

Label::createWithTTF("new game","Comic_Book.ttf",42,Size::ZERO,TextHAlignment::LEFT,TextVAlignment::TOP);

这部分代码创建了一个基于 TrueType 字体(TTF)的 Label 对象。具体说明如下:
new game:这是要显示在标签中的文本内容。
Comic_Book.ttf:这是字体文件的路径或名称,用于在标签中渲染文本。你需要在项目中有这个字体文件。目录为Resources/Comic_Book.ttf
42:这是文本的字体大小。
Size::ZERO:这是文本标签的预期尺寸。这里使用 `Size::ZERO` 表示让标签根据内容自动调整大小。
TextHAlignment::LEFT:这是文本的水平对齐方式,这里设置为左对齐。
TextVAlignment::TOP:这是文本的垂直对齐方式,这里设置为顶部对齐。

label->setColor(Color3B(219,205,139))

这部分代码设置了标签的颜色。
Color3B(219,205,139):这是一个颜色对象,用 RGB 值表示颜色。具体来说,这个颜色对象表示浅黄色。这个颜色将会应用于标签的文本部分。

综合起来,这段代码的作用是创建一个文本标签,内容为 "new game",使用 "Comic_Book.ttf" 字体,字体大小为 42,左对齐且顶部对齐,同时设置文本的颜色为浅黄色。

4.3 CC_SYNTHESIZE宏

`CC_SYNTHESIZE` 是一个宏,用于快速生成 getter 和 setter 方法,以简化属性的声明和实现。在 cocos2d-x 旧版本中,这是一个常用的宏,用于生成属性的存取方法。

具体来说,`CC_SYNTHESIZE` 宏允许你在一个类中声明一个属性,并自动生成对应的 getter 和 setter 方法。这样,你可以通过调用这些方法来获取和设置属性的值,而不需要手动编写这些方法。

示例用法:

class MyClass : public Node {
public:
    // 声明一个整数属性 score,同时自动生成 getter 和 setter 方法
    CC_SYNTHESIZE(int, _score, Score);

    // 声明一个字符串属性 name,同时自动生成 getter 和 setter 方法
    CC_SYNTHESIZE(std::string, _name, Name);
};

上述代码中,使用 `CC_SYNTHESIZE` 宏声明了两个属性 `_score` 和 `_name`,并生成了对应的 `getScore()`、`setScore()`、`getName()` 和 `setName()` 方法。

需要注意,`CC_SYNTHESIZE` 宏在较新版本的 cocos2d-x 中可能已经不再推荐使用,因为现代 C++ 提供了更好的方式来定义属性,如使用类的访问控制来实现属性的封装。因此,在新的项目中,建议考虑使用现代 C++ 的特性来定义属性。

上一节:《入门级-Cocos2dx4.0 塔防游戏开发》---第五课:欢迎界面开发(三、事件响应)

下一节:  《入门级-Cocos2dx4.0 塔防游戏开发》---第七课:游戏界面开发(自定义Layer)

总章:《入门级-Cocos2d 4.0塔防游戏开发》---实战文章来源地址https://www.toymoban.com/news/detail-669919.html

到了这里,关于《入门级-Cocos2dx4.0 塔防游戏开发》---第六课:欢迎界面开发(四、自定义精灵)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cocos2dx上做边下边玩小包热更

    因为公司业务需求需要做边下边玩的小包下载,在这里记录一下思路 下载库我使用的是cocos2dx 4.x的CCDownloader来下载文件 大体思路就是hook住fileutils中的getFileData函数和isFileExist函数。 isFileExist:无论初始包里文件是否存在,只要文件是游戏的资源文件这里都要返回“文件存在”

    2024年02月03日
    浏览(30)
  • 《入门级-Cocos2d 4.0塔防游戏开发》---第二课:游戏加载界面开发

    目录 一、开发环境介绍 二、开发内容 2.1 修改窗口的大小。 2.2 添加加载场景相关代码 2.3 添加资源 三、显示效果 四、知识点  4.1 Sprite 4.2 定时器 操作系统:UOS1060专业版本。 cocos2dx:版本 环境搭建教程: 统信UOS下配置安装cocos2dx开发环境_三雷科技的博客-CSDN博客        游

    2024年02月15日
    浏览(43)
  • win10 vs2022 搭建 cocos2d-x 3.17 开发环境

    https://cocos2d-x.org/download/ 也可以在 github 下载 https://github.com/cocos2d/cocos2d-x/tags https://docs.cocos2d-x.org/cocos2d-x/v3/zh/ https://docs.cocos2d-x.org/api-ref/cplusplus/v3x/index.html 需要 python2 , 安装后可以用 python2 的绝对路径运行 cocos 的 setup.py 如何没有把 python2 加入到环境变量, 可以修改引擎路径下

    2024年02月08日
    浏览(35)
  • Pygame和Cocos2d

    Pygame和Cocos2d都是 Python 中常用的游戏引擎,但它们的设计目标、特点和使用场景略有不同。 Pygame与Cocos2d,目前是使用人数最多的两个Python游戏库。根据某知名产品点评网站的数据显示,Cocos2d排名第一,Pygame排名第二。 Pygame是一种基于SDL(Simple DirectMedia Layer)的Python库,主要

    2024年01月21日
    浏览(33)
  • cocos2D插件转3D插件

    cocos2D插件转3D插件

    2024年02月16日
    浏览(33)
  • Cocos2d-x实现文字颜色渐变

    更改CCLabel文件的updateColor()函数中的顶点颜色即可,代码如下: 效果图:  

    2024年02月12日
    浏览(32)
  • cocos2d-x C++与Lua交互

    Cocos版本: 3.10 Lua版本: 5.1.4 环境: window Visual Studio 2013 Lua 作为一种脚本语言, 它的运行需要有 宿主 的存在,通过 Lua虚拟栈 进行数据交互。 它的底层实现是 C 语言,C语言封装了很多的API接口,使得C/C++与Lua之间可以很方便的通信交互。 Lua的官网: https://www.lua.org/ 在coc

    2024年02月08日
    浏览(32)
  • 使用“Cocos引擎”创建的cpp工程如何在VS中调试Cocos2d-x源码

    前段时间Cocos2d-x更新了一个Cocos引擎,这是一个集合源码,IDE,Studio这一家老小的整合包,我们可以使用这个Cocos引擎来创建我们的项目。 在Cocos2d-x被整合到Cocos引擎之前,我们可以不那么方便地在我们创建的工程里调试Cocos2d-x的代码,当我们使用了整合后的Cocos引擎,调试

    2024年02月12日
    浏览(41)
  • cocos2d-x Android原生平台与Lua交互

    版本: cocos2d-x 语言: C++/Java/Lua cocos2d-x原生平台Android 接入第三方SDK, 需要了解 LuaJavaBridge 的使用。 它封装了用于 Java 和 Lua 的相互调用, 其调用通过 C++ 为中介,简要的流程: Lua调用Java: Lua - C++ - Java Java调用Lua: Java - C++ - Lua 以此方式来实现数据的交互, 接下来我们分别说下

    2024年02月08日
    浏览(34)
  • cocos2d-x 3.17 推箱子 0.1

    此版本为推箱子游戏的基础版本, 后续添加如下功能 人物动画 TiledMap 解析 射线碰撞检测 下一步提示, C++算法解析 道具, 可以回退一步 通过 cocos 命令新建一个项目, 将本项目的 Reources 目录和 Classes 目录复制过去即可 使用图集绘制 Sprite , 然后手动处理碰撞检测 游戏学论著翻译

    2024年02月08日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包