目录
一、开发环境
二、开发内容
2. 1 新建自定义精灵
2.2 在welcome中创建新的menu
2.3 消息绑定以及消息响应
三、演示效果
四、知识点
4.1 内部消息响应
4.2 字体精灵说明
4.3 CC_SYNTHESIZE宏
一、开发环境
操作系统:UOS1060专业版本。
cocos2dx:版本4.0
环境搭建教程:统信UOS下配置安装cocos2dx开发环境
本课主要内容:
- 自定义精灵
- 复习复习精灵的加载以及位置设置
文章地址: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;
}
三、演示效果
四、知识点
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)文章来源:https://www.toymoban.com/news/detail-669919.html
总章:《入门级-Cocos2d 4.0塔防游戏开发》---实战文章来源地址https://www.toymoban.com/news/detail-669919.html
到了这里,关于《入门级-Cocos2dx4.0 塔防游戏开发》---第六课:欢迎界面开发(四、自定义精灵)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!