Java libGDX将sprite中的颜色设置为透明

Java libGDX将sprite中的颜色设置为透明,java,android,libgdx,sprite,Java,Android,Libgdx,Sprite,我在画精灵,从精灵表到屏幕。精灵的背景是黑色的。如果可能的话,我希望黑色,而且只有黑色,被渲染成透明的。所以,假设我有一个红色的背景。然后我有一个精灵,它有一个蓝色的圆圈和一个黑色的背景。当我把它画到屏幕上时,我只想看到蓝色的圆圈(当然还有红色的背景)。下面是我当前项目的代码。非常感谢您的帮助 public void render(float delta) { Gdx.gl.glClearColor(1f, 1f, 1f, 1f); Gdx.

我在画精灵,从精灵表到屏幕。精灵的背景是黑色的。如果可能的话,我希望黑色,而且只有黑色,被渲染成透明的。所以,假设我有一个红色的背景。然后我有一个精灵,它有一个蓝色的圆圈和一个黑色的背景。当我把它画到屏幕上时,我只想看到蓝色的圆圈(当然还有红色的背景)。下面是我当前项目的代码。非常感谢您的帮助

   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();
        }
您正在寻找“色度键”或“颜色键”支持(您希望黑色成为您的“色度颜色”)。一般来说,libgdx不支持这一点。看

但是,大多数工具(和Libgdx)都支持“alpha通道”,这是一种指定任何像素透明度的方式,与其颜色无关。您应该能够在生成图像时,甚至在将图像打包到spritesheet时设置透明度。或者,您也可以自己对图像进行预处理。看


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

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


我用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)

下面是一些我用来使颜色透明的代码。在本例中,我有一系列来自混合器渲染输出的关键帧,它们使用全绿色作为颜色键,即绿色屏幕

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()
导入pygame
输出_FN='spritesheet.png'
精灵大小=256
列=4
行数=4
运输颜色=(0255,0)
屏幕大小=((精灵大小*列,精灵大小*列))
screen=pygame.display.set_模式(屏幕大小)
x、 y=0,0
列,行=0,0
sheet=pygame.Surface(屏幕大小)
对于范围(1,25)内的i:
如果i<10:
fn=“%s%i.png”(“000”,i)
其他:
fn=“%s%i.png”(“00”,i)
keyframe=pygame.image.load(fn)
关键帧。设置颜色关键帧(传输颜色)
x=列*精灵大小
y=行*精灵大小
图.blit(关键帧,(x,y))
如果列+1==列:
列=0
行+=1
其他:
列+=1
运行=真
运行时:
pygame.display.update()
筛板(第(0,0)页)
对于pygame.event.get()中的e:
如果e.type==pygame.QUIT:
运行=错误
如果e.type==pygame.KEYDOWN:
kname=pygame.key.name(e.key)
如果kname='q':
运行=错误
如果kname='s':
pygame.image.save(屏幕,输出)
pygame.quit()

只是一个简单的问题。你绝对需要黑色背景的雪碧版本吗?如果没有,您只需使用Photoshop或删除黑色部分,然后将新图像保存为PNG格式。在这种格式中,图像的所有“空”部分都是透明的。不,我不需要一个黑色背景的精灵版本,只是我的空白精灵表是这样的:我想如果我在gimp中使图像透明(我使用的),在运行时会更容易。谢谢你的回复!我想我会尝试用gimp编辑精灵,并将背景变成透明的。我变得非常绝望,我甚至提出了一种方法,将精灵纸纹理转换成像素贴图,循环所有像素,检查是否有黑色,如果是,将其更改为透明。然后返回新的雪碧表。但由于某些原因,这并不起作用:/