Files
TempleOS-Rijn/TempleOS/Demo/Graphics/PixelCollision.CPP
T
2018-09-08 21:45:37 +02:00

93 lines
3.3 KiB
C++

$SP,"<1>",1$
/*
This CSprite was converted to a bitmap
in the <CTRL-R> menu. If you don't convert
to a bitmap, you will probably
register collisions as the pieces
are drawn on top of each other. You
can work with a nonzero val if
you choose or convert to a bitmap.
*/
U0 DrawShapes(CDC *dc,I64 x,I64 y,I64 rop)
{
if (ip_lb)
dc->bkcolor=RED;
else
dc->bkcolor=BLACK;
dc->color=rop+RED;
GrRect (dc,x-10,y-30-10,20,20);
GrRect (dc,x-10-30,y-10,20,20);
SpritePlot3(dc,x,y,0,$IB,"<1>",1$); //This just shows it works with CSprite
dc->color=rop+BLACK;
GrRect (dc,x-10,y+30-10,20,20);
GrRect (dc,x-10+30,y-10,20,20);
}
U0 PixelCollision()
{
CDC *dc=DCAlias;
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
WordStat;
WinMax;
DocClear;
while (!ScanChar) {
dc->color=RED;
GrRect(dc,Fs->win_pixel_width-200,Fs->win_pixel_height-200,200,200);
DrawShapes(dc,Fs->win_pixel_width>>1,Fs->win_pixel_height>>1,ROP_EQU);
dc->collision_cnt=0;
DrawShapes(dc,ipx-Fs->win_pixel_left-Fs->win_scroll_x,ipy-Fs->win_pixel_top-Fs->win_scroll_y,ROP_COLLISION);
if (ip_lb) {
dc->color=ROP_EQU+BLACK;
GrPrintF(dc,0,0*FONT_HEIGHT,"Non-RED background pixels overwritten.");
GrPrintF(dc,0,2*FONT_HEIGHT,"Collisions:%d",dc->collision_cnt);
dc->color=ROP_EQU+RED;
GrPutS(dc,0,3*FONT_HEIGHT,"BKCOLOR=RED");
} else {
dc->color=ROP_EQU+BLACK;
GrPutS(dc,0,0*FONT_HEIGHT,"Non-BLACK background pixels overwritten.");
GrPutS(dc,0,1*FONT_HEIGHT,"(Unchanged pixels of gr_dc2 are 'BLACK'.)");
GrPrintF(dc,0,2*FONT_HEIGHT,"Collisions:%d",dc->collision_cnt);
dc->color=ROP_EQU+BLACK;
GrPutS(dc,0,3*FONT_HEIGHT,"BKCOLOR=BLACK");
}
if (Blink) {
dc->color=ROP_EQU+BLACK;
GrPutS(dc,0,5*FONT_HEIGHT,"Hold Left Mouse");
}
DrawShapes(dc,ipx-Fs->win_pixel_left-Fs->win_scroll_x,ipy-Fs->win_pixel_top-Fs->win_scroll_y,ROP_EQU);
//This waits for the Window Mgr task
//to update the screen.
WinMgrSync;
//This will not flicker as long as it occurs just
//after a acreen update $LK,"WinMgrSync","MN:WinMgrSync"$.
DCFill(dc);
}
SettingsPop;
DCDel(dc);
}
/* If you are dealing with many objects,
create a bitmap just for checking collisions
using $LK,"DCNew","MN:DCNew"$(). You probably want to check
only when they are near each other or it will
take too long. See $LK-A,"::/TempleOS/Demo/GameStarters/Rocks.CPP"$.
*/
PixelCollision;
2óÿÿÿôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ