cocos2d-x 纯代码创建透明格子精灵

原创 2016年07月16日 15:24:16

效果图:

这里写图片描述

代码

//
// Copyright (c) 2015-2016 x-studio365 - All Rights Reserved.
//
#define DARK_BYTE 0x99
#define LIGHT_BYTE 0xdd

void fillLinePixelsRGB888(const SIZE& size, const SIZE& cellSize, unsigned char*& ptr, int flag)
{
    auto startp = ptr;
    for (int i = 0; i < size.cx;)
    {
        switch (flag) {
        case 1:
            for (auto j = 0; j < cellSize.cx; ++j) {
                *ptr++ = DARK_BYTE;
                *ptr++ = DARK_BYTE;
                *ptr++ = DARK_BYTE;
                ++i;
            }
            flag = 2;
            break;
        case 2:
            for (auto j = 0; j < cellSize.cx; ++j) {
                *ptr++ = LIGHT_BYTE;
                *ptr++ = LIGHT_BYTE;
                *ptr++ = LIGHT_BYTE;
                ++i;
            }
            flag = 1;
            break;
        }
    }

    auto sizeb = ptr - startp;

    // copy remain bytes
    for (int loopi = 1; loopi < cellSize.cy; ++loopi)
    {
        ::memcpy(ptr, startp, sizeb);
        ptr += sizeb;
    }
}

void fillLinePixelsRGBA8888(const SIZE& size, const SIZE& cellSize, unsigned char*& ptr, int flag)
{
    auto startp = ptr;

    for (int i = 0; i < size.cx;)
    {
        switch (flag) {
        case 1:
            for (auto j = 0; j < cellSize.cx; ++j) {
                *ptr++ = DARK_BYTE;
                *ptr++ = DARK_BYTE;
                *ptr++ = DARK_BYTE;
                *ptr++ = DARK_BYTE;
                ++i;
            }
            flag = 2;
            break;
        case 2:
            for (auto j = 0; j < cellSize.cx; ++j) {
                *ptr++ = LIGHT_BYTE;
                *ptr++ = LIGHT_BYTE;
                *ptr++ = LIGHT_BYTE;
                *ptr++ = 0xff;
                ++i;
            }
            flag = 1;
            break;
        }
    }
    //}

    auto sizeb = ptr - startp;

    // copy remain bytes
    for (int loopi = 1; loopi < cellSize.cy; ++loopi)
    {
        ::memcpy(ptr, startp, sizeb);
        ptr += sizeb;
    }
}

Sprite* createTransparentBackgrondRGB888(const SIZE& canvasSize, const SIZE& cellSize/*, const Color3B& color1, const  Color3B& color2*/)
{
    if (canvasSize.cx < cellSize.cx || canvasSize.cy < cellSize.cy)
        return nullptr;

    SIZE size;
    int rx = canvasSize.cx % cellSize.cx;
    int ry = canvasSize.cy % cellSize.cy;
    size.cx = rx == 0 ? canvasSize.cx : canvasSize.cx + (cellSize.cy - rx);
    size.cy = ry == 0 ? canvasSize.cy : canvasSize.cy + (cellSize.cy - ry);


    Sprite* sp = nullptr;
    auto bytesPixels = size.cx * size.cy * 3;
    unsigned char* pixels((unsigned char*)malloc(bytesPixels));
    memset(pixels, 0x0, bytesPixels);

    // Fill Pixels
    unsigned char* ptr = pixels;

    // TODO: calculate somethings
    fillLinePixelsRGB888(size, cellSize, ptr, 1);
    fillLinePixelsRGB888(size, cellSize, ptr, 2);

    // copy remain bytes
    int lines = size.cy / cellSize.cy;
    auto sizeb = ptr - pixels;
    for (int loopi = 1; loopi < lines / 2; ++loopi)
    {
        memcpy(ptr, pixels, sizeb);
        ptr += sizeb;
    }
    if (lines % 2 != 0) {
        memcpy(ptr, pixels, (sizeb >> 1));
        ptr += (sizeb >> 1);
    }

    assert((ptr - pixels) == bytesPixels);

    // create texture2d by pixels
    Texture2D* texture = new Texture2D();

    if (texture->initWithData(pixels, bytesPixels, Texture2D::PixelFormat::RGB888, size.cx, size.cy, Size(size.cx, size.cy)))
    {
        sp = Sprite::createWithTexture(texture);
    }
    texture->release();

    free(pixels);
    return sp;
}

Sprite* createTransparentBackgrondRGBA8888(const SIZE& canvasSize, const SIZE& cellSize/*, const Color3B& color1, const  Color3B& color2*/)
{
    if (canvasSize.cx < cellSize.cx || canvasSize.cy < cellSize.cy)
        return nullptr;

    SIZE size;
    int rx = canvasSize.cx % cellSize.cx;
    int ry = canvasSize.cy % cellSize.cy;
    size.cx = rx == 0 ? canvasSize.cx : canvasSize.cx + (cellSize.cy - rx);
    size.cy = ry == 0 ? canvasSize.cy : canvasSize.cy + (cellSize.cy - ry);

    Sprite* sp = nullptr;
    auto bytesPixels = size.cx * size.cy * sizeof(unsigned int);
    unsigned char* pixels((unsigned char*)malloc(bytesPixels));
    memset(pixels, 0x0, bytesPixels);

    // Fill Pixels
    auto ptr = pixels;

    fillLinePixelsRGBA8888(size, cellSize, ptr, 1);
    fillLinePixelsRGBA8888(size, cellSize, ptr, 2);

    // copy remain bytes
    int lines = size.cy / cellSize.cy;
    auto sizeb = ptr - pixels;
    for (int loopi = 1; loopi < lines / 2; ++loopi)
    {
        memcpy(ptr, pixels, sizeb);
        ptr += sizeb;
    }
    if (lines % 2 != 0) {
        memcpy(ptr, pixels, (sizeb >> 1));
        ptr += (sizeb >> 1);
    }

    assert((ptr - pixels) == bytesPixels);

    // create texture2d by pixels
    Texture2D* texture = new Texture2D();

    if (texture->initWithData(pixels, bytesPixels, Texture2D::PixelFormat::RGBA8888, size.cx, size.cy, Size(size.cx, size.cy)))
    {
        sp = Sprite::createWithTexture(texture);
    }
    texture->release();

    free(pixels);
    return sp;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

[OpenGL] 利用精灵表制作动画

说到OpenGL动画绘制,我们首先想到的就是读取多张图片并加载为纹理,然后再绘制的时候不断切换纹理图片即可。作为练习,这是可以的,但是,当我们的动画非常丰富的时候,我们就要涉及到大量的图片读取和纹理加...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2016年07月13日 22:47
  • 2635

cocos2dx 3.0之判断点击精灵透明区域

本站文章转载务必在明显处注明:原文链接 http://blog.csdn.net/cjsen/article/details/17241027 前言 在Layer层中 如何判断触摸事件 在图片精...
  • CJsen
  • CJsen
  • 2013年12月24日 20:50
  • 3563

cocos2d-x 制作透明遮罩

在新公司的游戏项目中做新手引导..其中指定某些范围是亮的 其余地方都是暗的示意玩家去点击这个区域... 在网上找到 CCRenderTexture 很方便的就能实现 记录下这段学习历程 效...
  • azymq
  • azymq
  • 2013年09月05日 10:13
  • 2247

cocos2d-x 精灵的创建和基本使用

在cocos2d-x中,精灵可以说是一个最重要的组成元素,它代表游戏中一个最小的可见单位。同时也是CCNode一个最为灵活的子类,因为它可以通过装载一个平面纹理,从而具有丰富的表现力。       ...
  • decajes
  • decajes
  • 2014年05月12日 17:26
  • 3364

使用vc++创建windows透明窗口

使用vc++创建windows透明窗口windows下的透明窗口有不少的实现方法,最简单的当属空画刷啦,但是这篇文章将的是用layer window(分层窗口)来实现透明窗口。 见过vista/wi...
  • bjrxyz
  • bjrxyz
  • 2017年02月04日 18:53
  • 818

【Unity3d】窗体透明

偶然在国外网站上看到的一个脚本,通过纯色背景抠像的方法,把windows的窗体透明化,可以用来做无背景的小头像、桌面精灵等。首先新建一个叫TransparentWindow的CS脚本,输入如下代码:u...
  • dark00800
  • dark00800
  • 2017年04月21日 14:26
  • 1948

Unity 窗体透明

文章转自游戏蛮牛:http://www.manew.com/forum.php?mod=viewthread&tid=103087&_dsign=ec6d9a3d 偶然在国外网站上看到的一个...
  • liujunjie612
  • liujunjie612
  • 2017年06月19日 16:51
  • 693

【cocos2d-x游戏开发】场景,层,精灵的区别

场景是cocos2d中的一个重要概念,可以理解为一个舞台,
  • u013517637
  • u013517637
  • 2014年10月19日 19:46
  • 1292

在Cocos2d-X中玩转精灵

创建一个Cocos2d-X
  • u010105970
  • u010105970
  • 2014年09月28日 11:37
  • 1870

Cocos2dx创建精灵的5中方法

cocos2dx创建精灵的五种方法(包括使用图片名获取图片) 还是闲来无事,白白继续给大家分享经验,文笔不好还请见谅! 废话少说,直接上代码: // 创建精灵的五种方法 //...
  • tyxkzzf
  • tyxkzzf
  • 2014年08月19日 19:19
  • 2790
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d-x 纯代码创建透明格子精灵
举报原因:
原因补充:

(最多只允许输入30个字)