Hello,
I'm trying to figure out this: let's say I have a sprite moving. When it goes a certain coordinate it should gradually disappear behind the backgroud.
Imagine a sprite representing the hero entering a house. I'd like this sprite to get lower drawing priority as it moves through the door: I'd like to "see" only the portion of the hero that it's not yet inside the house.
Is it possible to do that? Any hint? Consider the case in which I only have two sprites: the background and the hero and I cannot break them down to smaller parts (because it would be too much work).
Thanks
Hiding a sprite behind the background
-
Shadow Verified
- Admin / PSXDEV
- Posts: 2670
- Joined: Dec 31, 2012
- PlayStation Model: H2000/5502
- Discord: Shadow^PSXDEV
If you're using a polygon as your sprite, you can use a transparent polygon.
This is how you can draw a transparent polygon (note that it is old and unoptimised code):
The easiest method however is to lower all RGB value down equally in a loop.
Here is some old and crude code I wrote a while ago to do that.
NOTE: This code fades it out, and then back in again:
This is how you can draw a transparent polygon (note that it is old and unoptimised code):
Code: Select all
///////////////////////////////////////////////////////////
// Draw a transparent rectangle.
// The transparency 'colour' is calculated from the foreground
// and background pixels.
//
// EG: DrawTransRect(10,0, 20,0, 10,39, 20,39, 25,25,25, 0);
///////////////////////////////////////////////////////////
void DrawTransRect(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int r, int g, int b, int ot)
{
POLY_F4 f4; // f4 = 4 sided polygon
SetPolyF4(&f4); // initialise the primitive
setRGB0(&f4, r, g, b); // set the foreground fill colour
setSemiTrans(&f4, 1); // semi-transparency (0=off | 1=on)
setXY4(&f4, x1,y1, x2,y2, x3,y3, x4,y4); // draw 4 lines (4 sets of x/y coordinates)
//DrawPrim(&f4); // copy shape to frame buffer
GsSortPoly(&f4, &WorldOrderingTable[CurrentBuffer], ot); // put the polygon into the ordering table
}
Here is some old and crude code I wrote a while ago to do that.
NOTE: This code fades it out, and then back in again:
Code: Select all
// display the license.tim image until the timer reaches 245, which will fade the
// license.tim image out. when it has, continue to titleFadeI(); to fade in the
// license.tim image back in.
void timerFadeLicense()
{
int i=0, timerA=130;
for (i=0; i<timerA; i++)
{
if (DEBUG_FADE) printf("Fading LICENSE.TIM out=%d\n",i);
// if the luminosity is 0...
// otherwise, decrease the luminosity by a multiple of 2
if (LicenseSprite[0].r=LicenseSprite[0].g=LicenseSprite[0].b==0 || i>=64)
{
if (DEBUG_FADE) printf("LicenseSprite[0]=%d\n",LicenseSprite[0].r=LicenseSprite[0].g=LicenseSprite[0].b);
break;
}
else
{
LicenseSprite[1].r=LicenseSprite[1].g=LicenseSprite[1].b-=2; // luminosity -2
LicenseSprite[0].r=LicenseSprite[0].g=LicenseSprite[0].b-=2; // luminosity -2
}
if(!DTL_H2000) CheckCD();
if(cderror==1) display(0);
else display(1);
}
timerA=130; // reset the timer
LicenseSprite[0].r=LicenseSprite[0].g=LicenseSprite[0].b=0;
}
Development Console: SCPH-5502 with 8MB RAM, MM3 Modchip, PAL 60 Colour Modification (for NTSC), PSIO Switch Board, DB-9 breakout headers for both RGB and Serial output and an Xplorer with CAETLA 0.34.
PlayStation Development PC: Windows 98 SE, Pentium 3 at 400MHz, 128MB SDRAM, DTL-H2000, DTL-H2010, DTL-H201A, DTL-S2020 (with 4GB SCSI-2 HDD), 21" Sony G420, CD-R burner, 3.25" and 5.25" Floppy Diskette Drives, ZIP 100 Diskette Drive and an IBM Model M keyboard.
PlayStation Development PC: Windows 98 SE, Pentium 3 at 400MHz, 128MB SDRAM, DTL-H2000, DTL-H2010, DTL-H201A, DTL-S2020 (with 4GB SCSI-2 HDD), 21" Sony G420, CD-R burner, 3.25" and 5.25" Floppy Diskette Drives, ZIP 100 Diskette Drive and an IBM Model M keyboard.
Who is online
Users browsing this forum: No registered users and 4 guests