Hey all,
I am experimenting with displaying "images" defined in a TW3ImageData instance in SMS that I have created in code, but I can't seem to get them to be drawn using alphablending...
I have images using a palette that I cycle so I copy the colours from the cBallPalette over to an internal Palette of 16 TW3RGBA values.
Code:
cBallPalette: array[0..(16 * 4) - 1] of Integer = (
$00,$00,$00,$00, // $00 transparent colour
$66,$66,$66,$80, // $01 shadow colour
$FF,$FF,$FF,$FF, // $02
$FF,$FF,$FF,$FF, // $03
$FF,$FF,$FF,$FF, // $04
$FF,$FF,$FF,$FF, // $05
$FF,$00,$00,$FF, // $06
$FF,$00,$00,$FF, // $07
$FF,$00,$00,$FF, // $08
$FF,$00,$00,$FF, // $09
$FF,$00,$00,$FF, // $0A
$FF,$00,$00,$FF, // $0B
$FF,$00,$00,$FF, // $0C
$FF,$DD,$DD,$FF, // $0D
$FF,$FF,$FF,$FF, // $0E
$FF,$FF,$FF,$FF // $0F
);
type
TRetroBall = class
private
{...}
FPalette : array[0..16 - 1] of TW3RGBA;
FImage : TW3ImageData;
// handle to image pixels
FImagePixels : Variant;
{...}
FImage := FCanvas.CreateImageData(FWidth, FHeight);
FImagePixels := FImage.Handle;
for i := 0 to High(FPalette) do
begin
FPalette[i].r := cBallPalette[i*4 + 0];
FPalette[i].g := cBallPalette[i*4 + 1];
FPalette[i].b := cBallPalette[i*4 + 2];
FPalette[i].a := cBallPalette[i*4 + 3];
end;
{...}
// create the image using indices into the palette
sy := 0;
for dy := 0 to FHeight - 1 do
begin
sx := 0;
for dx := 0 to FWidth - 1 do
begin
bIndex := Trunc(sy) * cBallW + Trunc(sx);
aColor := cBallData[bIndex];
mIndex := 4 * (FWidth * dy + dx);
FImagePixels.data[mIndex + 0] := FPalette[aColor].r;
FImagePixels.data[mIndex + 1] := FPalette[aColor].g;
FImagePixels.data[mIndex + 2] := FPalette[aColor].b;
FImagePixels.data[mIndex + 3] := FPalette[aColor].a;
sx := sx + IncX;
end;
sy := sy + IncY;
end;
// draw the image
FCanvas.PutImageData(FImage, Trunc(FPosX - FWidth div 2), Trunc(FPosY - FHeight div 2));
The image draws just fine, but any time I use a colour that has an Alpha value < 255, it is coming out like it was solid colours with an alpha of 255.
In the screenshot below, the black should be transparent (and is in my palette), and the shadow grey should be partially transparent...as you can see, they are not:
notalphablending.jpg
Here is the paint routine:
Code:
procedure TApplication.PaintView(Canvas: TW3Canvas);
var
x, y, w : Integer;
c : Integer;
aColor : Integer;
mHandle: Variant;
mIndex: Integer;
bIndex: Integer;
begin
FCenter.X := (GameView.Width div 2) - (cBallW div 2);
FCenter.Y := (GameView.Height div 2) - (cBallH div 2);
// Clear background
Canvas.FillStyle := 'rgb(102,102,102';
Canvas.FillRectF(0,0,GameView.Width,GameView.Height);
// Clear background
Canvas.FillStyle := 'rgb(255,0,99)';
Canvas.FillRectF(10,10,60,12);
Canvas.Font := '10pt verdana';
FRetroBall.Render;
if GameView.FrameRate > 0 then
FRetroBall.Update(1/GameView.FrameRate);
// Canvas.PutImageData(FBuffer, 0, 0, 0, 0, CImageWidth, CImageHeight);
// Draw our framerate on the screen
Canvas.FillStyle := 'rgb(255,255,255)';
Canvas.FillTextF('FPS:' + IntToStr(GameView.FrameRate), 10, 20, MAX_INT);
end;
Any ideas?
cheers,
Paul
Bookmarks