2014-08-25 17:51:09 no99es 阅读数 3722

工作需要,画一条线,连接屏幕中点和触摸点,这条线要很粗,要能灵活的调整zOrder。

在这个要求下,我先用了

glLineWidth(10)和DrawPrimitives::drawLine(……)重写了draw方法实现了这个功能。

但是后来却发现杀千刀的glLineWidth,10-200没有任何变化,再后来又发现,画出的线会被精灵华丽的挡

住,就算是把精灵的zOrder设为负数也无济于事。

无奈开始了百度之旅,论坛上发现了DrawNode这个东西,下手一试,果然有效。

DrawNode是将画出的图形作为Node存在于程序中的,可以和其他的Node一样随意的调整zOrder,而且也没有OpenGL 10点宽度的限制。但是DrawNode不会擦除上一帧留下的图形,所以我们需要一个全局指针,手动刷新。

下面是使用代码:

 

 

 

OK,经过这样的处理,总算达到了要求,线的宽度是可以随意调整的。

 

 

 

让我们看看超级粗的线!!

 

2013-11-01 19:49:38 u010229677 阅读数 18185

还是那么闲,白白继续分享经验


cocos2dx官网上经常更新新的版本,在2.1.5之后使用的python框架,这让习惯了2.1.5版本之前的程序们在新建项目的时候显得


手足无措,下面白白给大家分享一下新版本新建项目的方法。


1、首先请先下一个python,建议2.7.5就好。http://download.csdn.net/detail/u010229677/6489059


安装时直接next直到finsh


2、设置环境变量


我的电脑->属性->高级->环境变量->


在PATH中添加python的安装路径,例如:;E:\python2.7;,记得用分号与其他路径分开。


PATHEXT最后面添加.PY;.PYM


OK,python的环境已经配置好了,现在win+R打开运行,输入cmd打开控制台,输入python,若出现python的版本信息则说明


python已经ok了。


3、创建项目


首先把路径切换的你解压cocos2dx的盘符,我的cocos2dx在E盘下,在控制台输入E:回车


好了,现在进入cocos2dx创建项目的路径,例如:




好了,现在创建





在此白白要声明一点,-package这里一定要写三级目录,否则会坑,白白在这上面吃了点亏,望大家谨记。


现在你已经完成项目的创建了,新建的项目在哪呢?就在cocos2d-x-2.2的project文件夹下面哦。


2018-02-12 11:00:17 wsr270591269 阅读数 650

笔者在编写代码的时候想要修改Cocos Studio中text的内容,便上网去查找。但是网上一时没有找到直接讲解修改Cocos Studio中UI内容的文章。

于是笔者便参考了一下网上各个方面的讲解,自己摸索着编码调试,成功修改了Cocos Studio中text的内容。

笔者在下面举个简单的例子,用于参考。

Cocos Studio例子截图

笔者在Cocos Studio 创建了一个Layer 命名为 example
在这个Layer中 添加了一个图片(ImageView) 命名为 Image_ex
在这个图片(ImageView)中添加了一个文本(Text)命名为 Text_ex

下面给出代码:

首先须要包括几个头文件和命名空间

#include "cocostudio/CocoStudio.h"
#include "ui/CocosGUI.h"
using namespace cocos2d::ui;
//using namespace cocostudio;   
//网上有看到说包括这个命名空间,但是笔者没有使用这个命名空间

下面是修改Cocos Studio中text的内容的代码:

auto exampleLayer = CSLoader::createNode("example.csb");
auto imageView = static_cast<ImageView*>(exampleLayer->getChildByName("Image_ex"));
auto textView = static_cast<Text*>(imageView->getChildByName("Text_ex"));
textView->setText("revise the text");
2016-01-10 20:49:45 xiewuquan 阅读数 2706

cocos2d-x版本:3.2


使用ttf字体时,由于字体库不全,没有包含所有的字符,导致有些字符无法显示,修改代码让无法显示的字符用囗代替,能够明确看到有字符显示不了,代码修改如下:

unsigned char* FontFreeType::getGlyphBitmap(unsigned short theChar, long &outWidth, long &outHeight, Rect &outRect,int &xAdvance)
{
    bool invalidChar = true;
    unsigned char * ret = nullptr;

    do 
    {
        if (!_fontRef)
            break;

        auto glyphIndex = FT_Get_Char_Index(_fontRef, theChar);
        if(!glyphIndex)
        {
            // 字符找不到时默认用囗代替(not cocos)
            static int defIndex = FT_Get_Char_Index(_fontRef, 22231);
            glyphIndex = defIndex;
            if (!glyphIndex)
                break;
        }

        // ...
    } while (0);
}
unsigned char * FontFreeType::getGlyphBitmapWithOutline(unsigned short theChar, FT_BBox &bbox)
{   
    unsigned char* ret = nullptr;

    FT_UInt gindex = FT_Get_Char_Index(_fontRef, theChar);
    if (!gindex)
    {
        // 字符找不到时默认用囗代替(not cocos)
        static int defIndex = FT_Get_Char_Index(_fontRef, 22231);
        gindex = defIndex;
    }
    // ...

    return ret;
}

这样修改之后又有另外一个问题,EditBox只支持系统字体,使用EditBox做输入框时,比如聊天输入时正常,发出来就变成了囗。解决方法:修改EditBox各平台代码的setFont和setPlaceholderFont接口,使其支持ttf字体,代码如下:

// CCEditBoxImplWin.h
#define SET_EDIT_FONT(label, fontName, fontSize) \
if (FileUtils::getInstance()->isFileExist(fontName)) \
{ \
	TTFConfig config = label->getTTFConfig(); \
	config.fontFilePath = fontName; \
	config.fontSize = fontSize; \
	label->setTTFConfig(config); \
} \
	else \
{ \
	label->setSystemFontName(fontName); \
	label->setSystemFontSize(fontSize); \
}
// CCEditBoxImplWin.cpp
void EditBoxImplWin::setFont(const char* pFontName, int fontSize)
{
	if(_label != nullptr) {
		SET_EDIT_FONT(_label, pFontName, fontSize)
	}

	if(_labelPlaceHolder != nullptr) {
		SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)
	}
}

void EditBoxImplWin::setPlaceholderFont(const char* pFontName, int fontSize)
{
	if(_labelPlaceHolder != nullptr) {
		SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)
	}
}
// EditBoxImplAndroid.cpp
void EditBoxImplAndroid::setFont(const char* pFontName, int fontSize)
{
    if(_label != NULL) {
        SET_EDIT_FONT(_label, pFontName, fontSize)
    }
    
    if(_labelPlaceHolder != NULL) {
        SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)
    }
}

void EditBoxImplAndroid::setPlaceholderFont(const char* pFontName, int fontSize)
{
    if(_labelPlaceHolder != NULL) {
        SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)
    }
}
// EditBoxImplIOS.mm
void EditBoxImplIOS::setFont(const char* pFontName, int fontSize)
{
    bool isValidFontName = true;
    if(pFontName == NULL || strlen(pFontName) == 0) {
        isValidFontName = false;
    }

    float retinaFactor = _inRetinaMode ? 2.0f : 1.0f;
    NSString * fntName = [NSString stringWithUTF8String:pFontName];

    auto glview = cocos2d::Director::getInstance()->getOpenGLView();

    float scaleFactor = glview->getScaleX();
    UIFont *textFont = nil;
    if (isValidFontName) {
        textFont = [UIFont fontWithName:fntName size:fontSize * scaleFactor / retinaFactor];
    }
    
    if (!isValidFontName || textFont == nil){
        textFont = [UIFont systemFontOfSize:fontSize * scaleFactor / retinaFactor];
    }

    if(textFont != nil) {
        [_systemControl.textField setFont:textFont];
    }

    SET_EDIT_FONT(_label, pFontName, fontSize)
    SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)
}

void EditBoxImplIOS::setPlaceholderFont(const char* pFontName, int fontSize)
{
    if(_labelPlaceHolder != NULL) {
        SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)
    }
}

效果如下图,输入“啊啲啲啲啲啊”:






2017-03-10 16:11:58 zcl1804742527 阅读数 424

调度器(scheduler)是主要是为游戏提供定时事件和定时服务。常常用来游戏的一些定时处理的功能,例如一些逻辑判断,碰撞检测等。
Cocos2dx提供了三种常用的调度器(scheduler)来让我们使用

//默认调度器:
schedulerUpdate()
//自定义调度器:
schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
//单次调度器:
scheduleOnce(SEL_SCHEDULE selector, float delay)

1默认调度器(schedulerUpdate)
默认调度器使用Node的刷新事件update方法,该方法在每帧绘制之前都会被调用一次。由于每帧之间时间间隔较短,所以每帧刷新一次已足够完成大部分游戏过程中需要的逻辑判断。

我们在使用默认调度器(schedulerUpdate)时候,需要重载Node的update方法来执行自己的逻辑代码。如果需要停止这个调度器,可以使用unschedulerUpdate()方法。
//取消默认调度
unschedulerUpdate()
使用时候首先在.h文件里重写update方法:void update(float dt) 。
在调用的地方直接使用scheduleUpdate()方法调用update的实现。

例如:

HelloWorldScene.h

void update(float dt) override;
HelloWorldScene.cpp

bool HelloWorld::init()
{
    ...
    scheduleUpdate();
    return true;
}

void HelloWorld::update(float dt)
{
    log("update");
}

结果:

cocos2d: update
cocos2d: update
cocos2d: update
cocos2d: update

2自定义调度器(scheduler)
有时候引擎自带的调度器并不适合我们的需要,所以需要自己定义调度器。而cocos2dx则提供了此方法。
由于引擎的调度机制,自定义时间间隔必须大于两帧的间隔,否则两帧内的多次调用会被合并成一次调用。所以自定义时间间隔应在0.1秒以上

schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)
第一个参数selector即为你要添加的事件函数。
第二个参数interval为事件触发时间间隔。
第三个参数repeat为触发一次事件后还会触发的次数,默认值为kRepeatForever,表示无限触发次数。
//取消该调度器
unschedule(SEL_SCHEDULE selector, float delay)

以下是测试代码

HelloWorldScene.h

void updateCustom(float dt);
HelloWorldScene.cpp

bool HelloWorld::init()
{
    ...
    schedule(schedule_selector(HelloWorld::updateCustom), 1.0f, kRepeatForever, 0);
    return true;
}

void HelloWorld::updateCustom(float dt)
{
    log("Custom");
}

在控制台你会看到每隔1秒输出以下信息

cocos2d: Custom
cocos2d: Custom
cocos2d: Custom
cocos2d: Custom
cocos2d: Custom

3.单次调度器(schedulerOnce)
游戏中某些场合,你只想进行一次逻辑检测,Cocos2d-x同样提供了单次调度器。
该调度器只会触发一次

//取消该触发器
unschedule(SEL_SCHEDULE selector, float delay)

以下代码用来测试该调度器:

HelloWorldScene.h

void updateOnce(float dt);
HelloWorldScene.cpp

bool HelloWorld::init()
{
    ...
    scheduleOnce(schedule_selector(HelloWorld::updateOnce), 0.1f);
    return true;
}

void HelloWorld::updateOnce(float dt)
{
    log("Once");
}

这次在控制台你只会看到一次输出

cocos2d: Once
scheduleOnce(SEL_SCHEDULE selector, float delay)
//第一个参数是执行的函数
//表示几秒之后执行,并且只会执行一次

总结:
1.默认调度器:
直接调用schedulerUpdate() 函数,同时重写update方法,这样就是在用的地方直接使用scheduleUpdate()方法调用update的实现
2 自定义调度器:
调schedule(SEL_SCHEDULE selector, float interval, unsigned int repeat, float delay)函数 ,具体实现在selector函数中去执行
3.单次调度器:
调scheduleOnce(SEL_SCHEDULE selector, float delay)函数 ,具体实现在selector函数中去执行
补充:

 scheduler.unscheduleAllCallbacksForTarget(this);//取消指定节点的指定计划

Cocos 资料大全

阅读数 320

cocos动画

阅读数 448

没有更多推荐了,返回首页