Hola a todos, a ver si me podéis echar una mano (al cuello no :P).
Estoy intentando implementar una clase en C# para pintar texto en pantalla, con el siguiente codigo:
using System;
using System.Collections.Generic;
using System.Text;
using Tao.Sdl;
namespace SSE
{
class SSE2DText
{
public static void drawText(String text, String fontname, int size, int colorR,
int colorG, int colorB, short x, short y, byte trans)
{
SdlTtf.TTF_Init();
IntPtr font = SdlTtf.TTF_OpenFont(fontname, size);
if (font == IntPtr.Zero)
{
Logger.getInstance().writeError("Error al cargar la fuente");
Logger.getInstance().closeLog();
}
Sdl.SDL_Color fgcolor = new Sdl.SDL_Color((byte)colorR, (byte)colorG,
(byte)colorB, trans);
IntPtr buffer = SdlTtf.TTF_RenderText_Blended(font, text, fgcolor);
IntPtr textSurface = Sdl.SDL_DisplayFormatAlpha(buffer);
Sdl.SDL_SetAlpha(textSurface, Sdl.SDL_SRCALPHA, trans);
SSE.draw(textSurface, x, y);
}
public static void drawText(String text, String fontname, int size, int colorR,
int colorG, int colorB, short x, short y)
{
drawText(text, fontname, size, colorR, colorG, colorB, x, y, 255);
}
}
}
SSE.draw(img, x, y) hace un blitSurface a la pantalla y poco más.
Compila y funciona todo perfectamente exepto la transparencia, que por motivos que no acabo de entender, no funciona. Alguien sabe algo al respecto? Gracias, :)
¿Nadie? :oops:
Buenas!
No he utilizado el modulo TTF pero mirando un poco, creo que al hacer el rendertext ya te devuelve una surface con el alpha activado y me parece que con:
IntPtr textSurface = Sdl.SDL_DisplayFormatAlpha(buffer);
Sdl.SDL_SetAlpha(textSurface, Sdl.SDL_SRCALPHA, trans);
te lo estas cargando...la prueba rapida es quitar esas dos lineas y si ves que funciona va bien la cosa. Si eso funciona aun podrias perder rendimiento por estar en distinto formato... pero ahora puedes probar a no activar el alpha con setalpha PORQUE eso tambien se carga el alpha per-pixel.
SDL soporta alpha per-surface(se activa con el SetAlpha() y se aplica a toda la surface por igual) o per-pixel(cada pixel tiene su componente alpha independiente) pero estos dos tipos no se pueden mezclar y si mal no recuerdo, el per-surface se carga al per-pixel.
Dime si te funciono...
Por cierto, no se como ira esto de SDL sobre C# pero hay tienes 2 memory leaks gordos... a no ser que lo libere el solito pero no lo creo...
Saludos!
No funciona tampoco quitando esas dos lineas... Ahora el código que tengo es este:
SdlTtf.TTF_Init();
IntPtr font = SdlTtf.TTF_OpenFont(fontname, size);
if (font == IntPtr.Zero)
{
Logger.getInstance().writeError("Error al cargar la fuente");
Logger.getInstance().closeLog();
}
Sdl.SDL_Color fgcolor = new Sdl.SDL_Color((byte)colorR, (byte)colorG,
(byte)colorB, trans);
IntPtr textSurface = SdlTtf.TTF_RenderText_Blended(font, text, fgcolor);
Sdl.SDL_SetAlpha(textSurface, Sdl.SDL_SRCALPHA, trans);
SSE.draw(textSurface, x, y);
Saludos y gracias!