cocos2d-x (二):之常用控件

1.精灵Sprite
用于显示图片
 
Sprite *s = Sprite::create("abc.jpg");
 s->setAnchorPoint(Point(0,0));
 s->setPosition(0,0);
 this->addChild(s);


2.字体 LabelTTF 
一个字体标签控件
LabelTTF *label = LabelTTF::create();
label->setString("hello CZK");
label->setFontSize(36);
label->setPosition(size.width/2,size.height/2);
this->addChild(label);



3.log 
log 是cocos2d-x的一个log类,用于输出调试,在android环境下会在eclipse上打出log,在ios环境下会在xcode上输出
函数的使用与C语言的 printf函数类似
log("我是%s 今年是%d年","czk",2015);

4.MessageBox
MessageBox会弹出一个对话框
MessageBox("hello world","2015");

5.输入框 TextFieldTTF
//第一个变量:在无输入时,输入框默认显示的内容
//第二个变量:字体
//第三个变量:字体大小
 TextFieldTTF *tf = TextFieldTTF::textFieldWithPlaceHolder("请输入","宋体",20);
 tf->setPosition(size.width/2,size.height/2);
 addChild(tf);
但上面这个只是让输入框显示出来而已,点击输入框会没反应,需要手动添加监听器

//定义监听器
 auto listener = EventListenerTouchOneByOne::create();
 //闭包函数的函数体是另外一个代码域,可以通过[]把参数tf传到里面去
 listener->onTouchBegan=[tf](Touch *t,Event *event)
 {
  if(tf->getBoundingBox().containsPoint(t->getLocation()))
  {
   log(">>>");
   tf->attachWithIME();
  }else
  {
   tf->detachWithIME(); 
  }
  
  return false;
 };
 Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener,tf);

EventListenerTouchOneByOne为单点触摸所使用,即针对一个控件与一次单点触摸
   tf->attachWithIME(); 激活输入框,使输入框可以读取到我们输入的字符
    tf->detachWithIME();  当点击控件之外的区域,使输入框为非激活状态
addEventListenerWithSceneGraphPriority对控件tf添加监听器


6.自定义类
创建一个类,命名为Ball
在Ball.h添加如下内容
#include <iostream>
#include "cocos2d.h"
using namespace cocos2d;
class Ball:public Sprite
{
public:
 virtual bool init();
 CREATE_FUNC(Ball);
};


Ball.cpp
#include "Ball.h"


bool Ball::init()
{
 initWithFile("def.jpg");
 return true;
}

a.引入头文件cocos2d.h
b.添加命名空间 cocos2d
c.重写虚函数 init()
d.添加 CREATE_FUNC(Ball);
 
CREATE_FUNC(Ball) 可以把这个类放到内存池中自动管理,并自动调用init初始化,它的实现如下
#define CREATE_FUNC(__TYPE__) \
static __TYPE__* create() \
{ \
    __TYPE__ *pRet = new(std::nothrow) __TYPE__(); \
    if (pRet && pRet->init()) \
    { \
        pRet->autorelease(); \
        return pRet; \
    } \
    else \
    { \
        delete pRet; \
        pRet = NULL; \
        return NULL; \
    } \
}

CREATE_FUNC这个宏特别重要,他可以让程序使用cocos2d-x的方法自动管理内存。如果有一个类对象没进行内存释放,在以后的每一帧中都会添加一点内存占用,这样会使程序崩溃。而且在后期,查找内存泄露是一件很麻烦的事情

实现时,仅需调用类的create方法就可以使用了
 auto b = Ball::create();
 b->setPosition(200,200);
 addChild(b);


7.菜单

MenuItem为菜单项,如常见的文件,编辑项,cocos2d-x支持使用字符标签、图片等来创建一个菜单项



 Size size = Director::getInstance()->getVisibleSize();
 MenuItemFont* menu_file = MenuItemFont::create("File",[](Object* obj){
  log("file menu item touched");
 });
 menu_file->setAnchorPoint(Point(0,0));

 MenuItemFont* menu_edit = MenuItemFont::create("Edit",[](Object* obj){
  log("edit menu item touched");
 });
 menu_edit->setAnchorPoint(Point(1,0));
 auto menu = Menu::create(menu_file,menu_edit,NULL);
 addChild(menu);


MenuItemFont的点击监听可以使用如上方法实现,也可以采用如下方式实现
MenuItemFont* menu_edit = MenuItemFont::create("Edit",CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
void HelloWorld::menuCloseCallback(Ref* sender)
{
    log("edit menu item touched");
}

创建完MenuItem后,把各MenuItem加入到Menu中,Menu::create是一个变长函数,最后一定要多加一个NULL,表示后面已经没有了
Menu * Menu::create(MenuItem* item, ...)
{
   ...
}

点击File和Edit会打印出如下log:
edit menu item touched
file menu item touched
edit menu item touched
file menu item touched
edit menu item touched
file menu item touched

8 TableView 表格

TableView可以创造一个可以点击拖动的表格,点击表格里的每一行都会触发事件,可以通过代码响应
在HelloWorld::init中添加如下代码
 //表格
 TableView * tv = TableView::create(this,Size(300,300)); //HelloWorld要继承TabelViewDataSource,作为数据源
 tv->setAnchorPoint(Point(0,0));
 tv->setPosition(100,0);
 tv->setDelegate(this); //为了监听列表项中的点击事件并给予响应 this要继承TableViewDelegate作为监听以便回调
 addChild(tv);


其中
TableView* TableView::create(TableViewDataSource* dataSource, Size size)
void setDelegate(TableViewDelegate* pDelegate)
这两个函数所需的变量有  TableViewDataSource   TableViewDelegate
TableViewDataSource  为数据源
TableViewDelegate  为事件托管
在这里,我们让HelloWorld 继承 TableViewDataSource , TableViewDelegate让后直接把this作为变量
继承 TableViewDataSource   后需要实现 TableViewDataSource   的虚函数

在HellpWorld.h 中添加
需要引入头文件
#include <cocos-ext.h>
以及如下命名空间
USING_NS_CC_EXT;
public:
    virtual Size cellSizeForTable(TableView *table);

    virtual TableViewCell* tableCellAtIndex(TableView *table, ssize_t idx);

    virtual ssize_t numberOfCellsInTableView(TableView *table);

继承TableViewDelegate后需要实现TableViewDelegate的虚函数
public:
 virtual void scrollViewDidScroll(ScrollView* view) {};
 virtual void scrollViewDidZoom(ScrollView* view) {};
 virtual void tableCellTouched(TableView* table, TableViewCell* cell);


HellpWorld.cpp 中实现这几个函数
//表格的规格 高300 宽50
Size HelloWorld::cellSizeForTable(TableView *table){
 return Size(300,50);
}
//表格每一项的内容显示 与标记
TableViewCell* HelloWorld::tableCellAtIndex(cocos2d::extension::TableView* table,ssize_t idx){
 //如果每次都返回一个新的TableViewCell的话,那么程序的计算量将非常大
 //可以从table获取TableViewCell
 //如果没有,返回值为空
 TableViewCell *cell = table->dequeueCell();
 LabelTTF *label;
 if(cell == NULL){
  cell = TableViewCell::create();
  label = LabelTTF::create();
  label->setTag(2);
  label->setAnchorPoint(Point(0,0));
  label->setFontSize(20);
  cell->addChild(label);
 }else{
  label = (LabelTTF*)cell->getChildByTag(2);
 }
 label->setString(StringUtils::format("label %d",(int)idx));
 return cell;
}
//表格的容量  
ssize_t HelloWorld::numberOfCellsInTableView(cocos2d::extension::TableView* table){
 return 100;
}
//点击事件的响应
void HelloWorld::tableCellTouched(TableView* table, TableViewCell* cell)
{
 LabelTTF *label = (LabelTTF*)cell->getChildByTag(2);
 log("%s",label->getString().c_str());
}


点击表格中的行,会打印出如下log

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你关于 cocos2d-x 中 scrollView 的问题。 scrollView 是 cocos2d-x常用的 UI 控件之一,可以用来显示大量的内容,并支持滑动、缩放等功能。在 scrollView 中,可以添加多个子控件,比如 label、sprite 等,也可以添加自定义的控件。 在使用 scrollView 时,需要先创建一个 ScrollView 对象,然后设置它的属性,比如大小、位置、滑动方向等。接着,再往 scrollView 中添加子控件,最后将 scrollView 添加到场景中即可。 下面是一个简单的示例代码,演示如何创建一个垂直方向的 scrollView: ``` // 创建 scrollView 对象 auto scrollView = ScrollView::create(); scrollView->setContentSize(Size(200, 300)); scrollView->setDirection(ScrollView::Direction::VERTICAL); scrollView->setInnerContainerSize(Size(200, 800)); scrollView->setPosition(Vec2(100, 100)); // 往 scrollView 中添加子控件 for (int i = 0; i < 10; i++) { auto label = Label::createWithSystemFont("Label " + std::to_string(i), "Arial", 24); label->setPosition(Vec2(100, 700 - i * 70)); scrollView->addChild(label); } // 将 scrollView 添加到场景中 this->addChild(scrollView); ``` 在上面的代码中,我们首先创建了一个 scrollView 对象,设置了它的大小、位置和滑动方向等属性。然后,使用循环往 scrollView 中添加了 10 个 label,最后将 scrollView 添加到场景中。 通过以上代码,你可以学会如何使用 cocos2d-x 中的 scrollView 控件。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值