cocos2dx 学习路上每日踩坑

来源:互联网 发布:mac 固态硬盘windows10 编辑:程序博客网 时间:2024/06/02 06:35

唐突的开始吧。


2015年12月24日:

1.[已解决]使用代码创建一个白色1px * 1px的图片,在 image->initWithImageData(cc_2x2_white_image,16); 时报错,因为无法识别图片的格式。(踩坑的纪录:需要创建一个能任意设置大小的矩形精灵,所以想到用小图来进行拉伸。但是在使用纯白色1px*1px的png创建精灵时,发现被拉伸后的图片变成了半透明图片。使用32px*32px的白色图片拉伸时,图片周围会变得比较模糊,所以采用代码写像素点,生成1px*1px图片的方式来做,结果就是酱紫了)。

    static unsigned char cc_2x2_white_image[] = {    0xFF, 0xFF, 0xFF, 0xFF,    0xFF, 0xFF, 0xFF, 0xFF,    0xFF, 0xFF, 0xFF, 0xFF,    0xFF, 0xFF, 0xFF, 0xFF    };        Image * image = new Image();    image->initWithImageData(cc_2x2_white_image, 16);     Texture2D * texture = new Texture2D();    texture->initWithImage(image,Texture2D::PixelFormat::BGRA8888);    //然后使用texture来创建精灵

解决之法:(妈哒,引擎有自带的示例啊)

    static unsigned char cc_2x2_white_image[] = {        // RGBA8888        0xFF, 0xFF, 0xFF, 0xFF,        0xFF, 0xFF, 0xFF, 0xFF,        0xFF, 0xFF, 0xFF, 0xFF,        0xFF, 0xFF, 0xFF, 0xFF    };    auto image = new Image();    image->initWithRawData(cc_2x2_white_image, sizeof(cc_2x2_white_image), 2, 2, 8);//注意初始化的方式,这是一个2*2像素的点    auto texture = new Texture2D();    texture->initWithImage(image);    auto spriteBar = Sprite::createWithTexture(texture);



2. [尚未解决]需要实现在黑夜中,主角举着火把照亮周围的情景。(踩坑记录:游戏中为了营造紧张效果,让玩家的可见场景缩小到主角周围300px以内。当时想法是使用ClippingNode来做这个效果,就是使用一个黑色层来做底板,用一个有渐变效果的白色圆来做模板,然后穿透底板,显示黑色底板下的游戏场景。但是ClippingNode并不能支持这种简便效果,ClippingNode的alpha通道只是设置透明度大于一定值的像素点能起作用。也就是当alpha通道设置比较大时,半透明的点就不会起作用而已。不能做到下图效果)。

例如:(网上截图,也不知道能不能拿来用)



3. [尚未解决]这是关于多点触摸的问题,游戏层使用了多点触摸,从游戏暂停界面选择继续游戏后,(仅有)游戏层的onTouchesEnded会被触发。(踩坑记录:游戏的暂停界面做法就是在游戏层之上贴了一层Layer,然后创建了一个空的单点触摸监听器,设置了setSwallowTouches用来屏蔽触摸,只是暂停界面上的按钮能够响应。游戏层中使用的是多点触摸的方式。问题就在于,点击了暂停层的继续游戏按钮(注:在按钮中会让暂停层removeFromParentAndCleanup),暂停层消失,游戏层的onTouchesEnded被触发)。

例如:代码涉及多个文件,太长,就不放了,可以写一个小示例去测试。


4.[已解决]关于暂停pause()的问题,暂停操作不能关联子节点。(踩坑记录:一般在做暂停的时候,我会直接调用游戏层的pause()函数,这样会导致游戏场景暂停了,但是里面的动画、动作都还在正常继续播放。暂停游戏层时,没法自动将关联的子节点暂停掉。)

解决之法:在游戏层写一个方法,递归调用所有子节点的pause,同样的方法写resume。

void MYGameLayer::pauseAllNode(cocos2d::Node *node){    node->pause();    for (auto &it : node->getChildren()) {        pauseAllNode(it);    }}


5.[已解决]在游戏中使用rand_0_1()取随机值时,每次去到的前三四个值都十分相近。(踩坑记录:在游戏中需要取随机值来判断下一个障碍物的颜色,我使用了rand_0_1()取了一个值,拿这个值来和0.5进行比较,结果发现每次取到的前几个值都十分接近,而且我有设置了srand(),取值的时候大概是1秒取2次,没有在一个很短的时间内取值。这种取值方法的问题在于,每次需要随机数时取出的前几个值都是极其接甚至相同的,例如:0.713097  0.713097  0.713112)

解决之法:不使用rand_0_1(),而是使用rand()取一个整数,然后除100取余,然后拿余数来进行操作。使用rand()前,也需要进行一次srand(time(0))来设置随机数种子。至于rand_0_1()为什么会有问题,目前还是不清楚。

0 0
原创粉丝点击