libGDX将精灵中的颜色设置为透明

时间:2015-04-02 00:31:29

标签: java android libgdx sprite

我从spritesheet到屏幕绘制精灵。精灵有黑色背景。如果可能的话,我希望黑色,只有黑色,才能呈现透明。所以,说我有一个红色背景。然后我有一个带有黑色背景的蓝色圆圈的精灵。当我将它绘制到屏幕上时,我只想要看到蓝色圆圈(显然是红色背景)。这是我当前项目的代码。非常感谢!

   public void render(float delta) {
            Gdx.gl.glClearColor(1f, 1f, 1f, 1f);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

            batch.setProjectionMatrix(camera.combined);
            batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
            batch.enableBlending();

            camera.update();
            generalUpdate();

            batch.begin();
            // Rendering Code
            Assets.sprite_moon.draw(batch);

            if (Assets.accelerated) {
                Assets.sprite_flame.draw(batch);
            }
            Assets.sprite_rocket.draw(batch);

            Assets.sprite_blue.draw(batch);
            // End render code
            batch.end();
            batch.disableBlending();
        }

4 个答案:

答案 0 :(得分:1)

您正在寻找“色度键”或“色键”支持(并且您希望黑色成为您的“色度”)。通常,这不是libgdx支持的。见Removing a Sprites Color Key libGDX

但是,大多数工具(和Libgdx)都支持“alpha通道”,这是一种指定任何像素的透明度的方式,与其颜色无关。您应该能够在生成图像时设置透明度,或者甚至在将图像打包到spritesheet中时设置透明度。或者您可以自己在图像上构建预处理过程。见How do you tell libgdx to use a specific color for transparency?

如果您真的想要使用色度键方法,可以尝试使用自定义着色器,但我会避免使用这种方法,除非您有充分理由使用着色器。

答案 1 :(得分:0)

我知道这是旧的,但为了优先起见,如果没有人想下载GIMP,我使用这个免费的网站让我的精灵变得透明png:

http://www.online-image-editor.com/

答案 2 :(得分:0)

我在python3中编写了以下脚本,用带有Alpha通道的PNG替换了一堆带有颜色键透明度的图像。随意使用它,称之为:process_image(" a.bmp"," a.png")

它需要scipy和numpy,你可以用pip3安装。

 #!/usr/bin/env python3

 from scipy import misc
 import numpy as np

 def process_image(filepath, outfile):
     image = misc.imread(filepath)
     if image.shape[2] == 3:
         alpha = np.expand_dims(np.full(image.shape[:2], 255), axis=2)
         image = np.append(image, alpha, axis=2)

     width, height = image.shape[1], image.shape[0]
     color_key = image[0,0,:3]

     for x in range(width):
         for y in range(height):
             pixel = image[y,x,:3]
             if np.array_equal(pixel, color_key):
                 image[y,x,3] = 0
     misc.imsave(outfile, image)

答案 3 :(得分:0)

以下是一些我用来使颜色透明的代码。在这种情况下,我从Blender渲染输出中获得了一系列关键帧,这些关键帧使用全绿色作为色键,即。绿屏。

import pygame

OUTPUT_FN = 'spritesheet.png'
SPRITE_SIZE = 256
COLUMNS = 4
ROWS = 4
TRANSP_COLOR = (0,255,0)

screen_size = ((SPRITE_SIZE * COLUMNS, SPRITE_SIZE * COLUMNS))
screen = pygame.display.set_mode(screen_size)

x, y = 0, 0
column, row = 0,0

sheet = pygame.Surface(screen_size)

for i in range(1,25):
    if i < 10:
        fn = "%s%i.png" % ("000", i)
    else:
        fn = "%s%i.png" % ("00", i)
    keyframe = pygame.image.load(fn)
    keyframe.set_colorkey(TRANSP_COLOR)
    x = column * SPRITE_SIZE
    y = row * SPRITE_SIZE 
    sheet.blit(keyframe, (x,y))
    if column + 1 == COLUMNS:
        column = 0
        row += 1
    else:
        column += 1


running = True
while running:
    pygame.display.update()
    screen.blit(sheet, (0,0))


    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            running = False
        if e.type == pygame.KEYDOWN:
            kname = pygame.key.name(e.key)
            if kname == 'q':
                running = False
            if kname == 's':
                pygame.image.save(screen, OUTPUT_FN)

pygame.quit()