📄 dxlib.cpp
字号:
}
int SetAnimate(ANIMATE* lpanimate,double x,double y,int step,int surcount,COLORREF keycolor,UINT type)
{
lpanimate->x=x;
lpanimate->y=y;
lpanimate->play=1;
lpanimate->step=step;
lpanimate->surcount=surcount;
lpanimate->keycolor=keycolor;
lpanimate->visible=1;
lpanimate->type=type;
return 1;
}
int SetAnimatePos(ANIMATE* lpanimate,double x,double y)
{
lpanimate->x=x;
lpanimate->y=y;
return 1;
}
int PlayAnimate(ANIMATE* lpanimate)
{
if(lpanimate->step==0||lpanimate->surcount==0)return 0; //意外错误返回
lpanimate->play=1;
lpanimate->frame+=1;
if(lpanimate->frame>(lpanimate->surcount*lpanimate->step))lpanimate->frame=0;
lpanimate->cur=(lpanimate->frame/lpanimate->step)%lpanimate->surcount;
return 1;
}
int StopAnimate(ANIMATE* lpanimate)
{
lpanimate->play=0;
lpanimate->frame=0;
lpanimate->cur=0;
return 1;
}
int SetCharacterPos(CHARACTER* lpcharacter,double x,double y)
{
switch(lpcharacter->relation)
{
case CHARACTER_ANIMATE:
int i;
for(i=0;i<lpcharacter->lpanimate->surcount;i++)
{
SetGraphPos(&lpcharacter->lpanimate->graph[i],
lpcharacter->x-lpcharacter->lpanimate->graph[i].xctrl,
lpcharacter->y-lpcharacter->lpanimate->graph[i].yctrl+lpcharacter->doublevalue[Z]);
}
break;
case CHARACTER_GRAPH:
SetGraphPos(lpcharacter->lpgraph,
lpcharacter->x-lpcharacter->lpgraph->xctrl,
lpcharacter->y-lpcharacter->lpgraph->yctrl+lpcharacter->doublevalue[Z]);
break;
}
SetRectPos(lpcharacter->colliderect,(int)lpcharacter->x,(int)lpcharacter->y,lpcharacter->width,lpcharacter->height);
return 1;
}
BOOL Act(RECT RA, RECT RB, double Per)
{
BOOL a = FALSE, b = FALSE, c = FALSE, d = FALSE;
double Aadd_Top = (1 - Per / 100) * ((double)RA.bottom - (double)RA.top) / 2;
double Aadd_Left = (1 - Per / 100) * ((double)RA.right - (double)RA.left) / 2;
double Badd_Top = (1 - Per / 100) * ((double)RB.bottom - (double)RB.top) / 2;
double Badd_Left = (1 - Per / 100) * ((double)RB.right - (double)RB.left) / 2;
RECT rect;
if(RA.right-RA.left>RB.right-RB.left)
{
rect=RA;
RA=RB;
RB=rect;
}
if(RA.left + (int)Aadd_Left < RB.right - (int)Badd_Left && RA.left + (int)Aadd_Left >= RB.left + (int)Badd_Left) a = TRUE;
if(RA.right - (int)Aadd_Left < RB.right - (int)Badd_Left && RA.right - (int)Aadd_Left >= RB.left + (int)Badd_Left) b = TRUE;
if(RA.bottom-RA.top>RB.bottom-RB.top)
{
rect=RA;
RA=RB;
RB=rect;
}
if(RA.top + (int)Aadd_Top < RB.bottom - (int)Badd_Top && RA.top + (int)Aadd_Top >= RB.top + (int)Badd_Top) c = TRUE;
if(RA.bottom - (int)Aadd_Top < RB.bottom - (int)Badd_Top && RA.bottom - (int)Aadd_Top >= RB.top + (int)Badd_Top) d = TRUE;
if ((a && c) || (a && d) || (b && c) || (b && d))
{return TRUE;}
else
{return FALSE;}
}
HRESULT DrawLine(INT x1,INT y1,INT x2,INT y2,LPDIRECTDRAWSURFACE7* lplpsur,COLORREF color)
{
DDSURFACEDESC2 ddsd;
INT curx=x1;
INT lx,ly,x_inc,y_inc,i,err=0,lx2,ly2;
memset(&ddsd,0,sizeof(DDSURFACEDESC2));
ddsd.dwSize=sizeof(DDSURFACEDESC2);
DD_Call((*lplpsur)->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL));
BYTE* surbuf=(BYTE*)ddsd.lpSurface;
LONG lpitch=ddsd.lPitch;
INT surwid=ddsd.dwWidth;
INT surhgt=ddsd.dwHeight;
BYTE* startbuf=surbuf;
INT endbuf=surhgt*lpitch;
BYTE r,g,b;
WORD pix16;
switch(bitcount)
{
case 15:
surbuf=surbuf+(x1<<1)+y1*lpitch;
break;
case 16:
surbuf=surbuf+(x1<<1)+y1*lpitch;
break;
case 24:
surbuf=surbuf+(x1*3)+y1*lpitch;
break;
case 32:
surbuf=surbuf+(x1<<2)+y1*lpitch;
break;
default:break;
}
lx=x2-x1;
ly=y2-y1;
if(lx>=0)
{
x_inc=1;
}
else
{
x_inc=-1;
lx=-lx;
}
if(ly>=0)
{
y_inc=lpitch;
}
else
{
y_inc=-lpitch;
ly=-ly;
}
lx2=lx<<1;
ly2=ly<<1;
if(lx>=ly)
{
err=ly2-lx;
for(i=0;i<=lx;i++)
{
INT cur=(INT)(surbuf-startbuf);
if(cur>=0&&curx<surwid&&curx>=0&&cur<=endbuf)
{
switch(bitcount)
{
case 15:
r=RGB_GETBLUE(color)>>3;
g=RGB_GETGREEN(color)>>3;
b=RGB_GETRED(color)>>3;
pix16=(r<<10)|(g<<5)|(b);
*surbuf=(BYTE)(pix16&0xFF);
*(surbuf+1)=(BYTE)(pix16>>8);
break;
case 16:
r=RGB_GETBLUE(color)>>3;
g=RGB_GETGREEN(color)>>2;
b=RGB_GETRED(color)>>3;
pix16=(r<<11)|(g<<5)|(b);
*surbuf=(BYTE)(pix16&0xFF);
*(surbuf+1)=(BYTE)(pix16>>8);
break;
case 24:
*surbuf=RGB_GETBLUE(color);
*(surbuf+1)=RGB_GETGREEN(color);
*(surbuf+2)=RGB_GETRED(color);
break;
case 32:
*surbuf=RGB_GETBLUE(color);
*(surbuf+1)=RGB_GETGREEN(color);
*(surbuf+2)=RGB_GETRED(color);
break;
default:break;
}
}
if(err>=0)
{
err-=lx2;
surbuf+=y_inc;
}
err+=ly2;
switch(bitcount)
{
case 15:
surbuf+=x_inc<<1;
break;
case 16:
surbuf+=x_inc<<1;
break;
case 24:
surbuf+=x_inc*3;
break;
case 32:
surbuf+=x_inc<<2;
break;
default:break;
}
curx+=x_inc;
}
}
else
{
err=lx2-ly;
for(i=0;i<=ly;i++)
{
INT cur=(INT)(surbuf-startbuf);
if(cur>=0&&curx<=surwid&&curx>=0&&cur<=endbuf)
{
switch(bitcount)
{
case 15:
r=RGB_GETBLUE(color)>>3;
g=RGB_GETGREEN(color)>>3;
b=RGB_GETRED(color)>>3;
pix16=(r<<10)|(g<<5)|(b);
*surbuf=(BYTE)(pix16&0xFF);
*(surbuf+1)=(BYTE)(pix16>>8);
break;
case 16:
r=RGB_GETBLUE(color)>>3;
g=RGB_GETGREEN(color)>>2;
b=RGB_GETRED(color)>>3;
pix16=(r<<11)|(g<<5)|(b);
*surbuf=(BYTE)(pix16&0xFF);
*(surbuf+1)=(BYTE)(pix16>>8);
break;
case 24:
*surbuf=RGB_GETBLUE(color);
*(surbuf+1)=RGB_GETGREEN(color);
*(surbuf+2)=RGB_GETRED(color);
break;
case 32:
*surbuf=RGB_GETBLUE(color);
*(surbuf+1)=RGB_GETGREEN(color);
*(surbuf+2)=RGB_GETRED(color);
break;
default:break;
}
}
if(err>=0)
{
err-=ly2;
switch(bitcount)
{
case 15:
surbuf+=x_inc<<1;
break;
case 16:
surbuf+=x_inc<<1;
break;
case 24:
surbuf+=x_inc*3;
break;
case 32:
surbuf+=x_inc<<2;
break;
default:break;
}
curx+=x_inc;
}
err+=lx2;
surbuf+=y_inc;
}
}
DD_Call((*lplpsur)->Unlock(NULL));
return DD_OK;
}
int DrawRect(RECT rect,LPDIRECTDRAWSURFACE7* lplpsur,COLORREF color)
{
DrawLine(rect.right,rect.top,rect.right,rect.bottom,lplpsur,color);
DrawLine(rect.right,rect.bottom,rect.left,rect.bottom,lplpsur,color);
DrawLine(rect.left,rect.bottom,rect.left,rect.top,lplpsur,color);
DrawLine(rect.left,rect.top,rect.right,rect.top,lplpsur,color);
return 1;
}
int ReleaseGraphs(GRAPH* graphs)
{
int i;
for(i=0;i<sizeof(graphs)/sizeof(GRAPH);i++)
{
SafeRelease(graphs[i].lpsur);
}
return 1;
}
int ReleaseAnimate(ANIMATE animate)
{
int i;
for(i=0;i<sizeof(animate.graph)/sizeof(GRAPH);i++)
SafeRelease(animate.graph[i].lpsur);
return 1;
}
int ReleaseAnimates(ANIMATE* animates)
{
int i,j;
for(i=0;i<sizeof(animates)/sizeof(ANIMATE);i++)
{
for(j=0;j<sizeof(animates[i].graph)/sizeof(GRAPH);j++)
SafeRelease(animates[i].graph[j].lpsur);
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -