我从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();
}
答案 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:
答案 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()