📄 movepic.cpp
字号:
#include "stdafx.h"
#include "MovePic.h"
MovePic::MovePic(LP_BITMAPX g_pBitmapBMP[6])
{
Numbers = 0;
MouseX=0;
MouseY=0;
First = NULL;
Last = NULL;
RButton=FALSE;
this->g_pBitmapBMP[0]=g_pBitmapBMP[0];
this->g_pBitmapBMP[1]=g_pBitmapBMP[1];
this->g_pBitmapBMP[2]=g_pBitmapBMP[2];
this->g_pBitmapBMP[3]=g_pBitmapBMP[3];
this->g_pBitmapBMP[4]=g_pBitmapBMP[4];
this->g_pBitmapBMP[5]=g_pBitmapBMP[5];
}
MovePic::~MovePic()
{
while(Numbers>0)
{
DelPic();
}
}
BOOL MovePic::AddPic(int way)
{
// 添加一张图片
MyNode *Temp;
int num;
Temp=(MyNode *)malloc(sizeof(MyNode));
if(NULL==Temp)
return FALSE;
switch(way)
{
case 0:
if(Numbers==0)
{
Temp->Qian=NULL;
Temp->Hou=NULL;
First=Temp;
Last=Temp;
Numbers++;
}
else
{
Last->Hou=Temp;
Temp->Qian=Last;
Last=Temp;
Temp->Hou=NULL;
Numbers++;
}
num=Random(5)+1;
Temp->Number=num;
Temp->MyDirection=0;
Temp->MyPic=g_pBitmapBMP[num];
Temp->MovW=800-Temp->MyPic->GetWidth();
Temp->MovH=600-Temp->MyPic->GetHeight();
Temp->PosX=Random(Temp->MovW+1);
Temp->PosY=Random(Temp->MovH+1);
if(Random(2)==0)
num=-1;
else
num=1;
Temp->SpeedX=num*4;
Temp->SpeedY=0;
Temp->OSpeedX=Temp->SpeedX;
Temp->OSpeedY=Temp->SpeedY;
Temp=NULL;
break;
case 1:
if(Numbers==0)
{
Temp->Qian=NULL;
Temp->Hou=NULL;
First=Temp;
Last=Temp;
Numbers++;
}
else
{
Last->Hou=Temp;
Temp->Qian=Last;
Last=Temp;
Temp->Hou=NULL;
Numbers++;
}
num=Random(5)+1;
Temp->Number=num;
Temp->MyDirection=1;
Temp->MyPic=g_pBitmapBMP[num];
Temp->MovW=800-Temp->MyPic->GetWidth();
Temp->MovH=600-Temp->MyPic->GetHeight();
Temp->PosX=Random(Temp->MovW+1);
Temp->PosY=Random(Temp->MovH+1);
Temp->SpeedX=0;
if(Random(2)==0)
num=-1;
else
num=1;
Temp->SpeedY=num*4;
Temp->OSpeedX=Temp->SpeedX;
Temp->OSpeedY=Temp->SpeedY;
Temp=NULL;
break;
case 2:
if(Numbers==0)
{
Temp->Qian=NULL;
Temp->Hou=NULL;
First=Temp;
Last=Temp;
Numbers++;
}
else
{
Last->Hou=Temp;
Temp->Qian=Last;
Last=Temp;
Temp->Hou=NULL;
Numbers++;
}
num=Random(5)+1;
Temp->Number=num;
Temp->MyDirection=2;
Temp->MyPic=g_pBitmapBMP[num];
Temp->MovW=800-Temp->MyPic->GetWidth();
Temp->MovH=600-Temp->MyPic->GetHeight();
Temp->PosX=Random(Temp->MovW+1);
Temp->PosY=Random(Temp->MovH+1);
if(Random(2)==0)
num=-1;
else
num=1;
Temp->SpeedX=num*4;
if(Random(2)==0)
num=-1;
else
num=1;
Temp->SpeedY=num*4;
Temp->OSpeedX=Temp->SpeedX;
Temp->OSpeedY=Temp->SpeedY;
Temp=NULL;
break;
}
return TRUE;
}
void MovePic::DelPic(void)
{
// 删除最上面的图片
MyNode *Temp;
if(Numbers>1)
{
Numbers--;
Temp=Last;
Last=Temp->Qian;
Last->Hou=NULL;
free(Temp);
}
else if(Numbers==1)
{
Numbers--;
Temp=Last;
First=NULL;
Last=NULL;
free(Temp);
}
}
void MovePic::MovPic(void)
{
// 计算移动图新的坐标
MyNode *bm1 = First;
int xPos,yPos;
while(bm1!=NULL)
{
/* switch(bm1->MyDirection)
{
case 0: 不明白那些人为什么要把3种情况分开
break; 处理方法都是一样的嘛
case 1:
break;
case 2:
break;
}*/
if(!RButton)
{
bm1->PosX+=bm1->SpeedX;
bm1->PosY+=bm1->SpeedY;
if(bm1->PosX>bm1->MovW)
{
bm1->PosX=bm1->MovW;
bm1->SpeedX=-bm1->SpeedX;
}
else if(bm1->PosX<0)
{
bm1->PosX=0;
bm1->SpeedX=-bm1->SpeedX;
}
if(bm1->PosY>bm1->MovH)
{
bm1->PosY=bm1->MovH;
bm1->SpeedY=-bm1->SpeedY;
}
else if(bm1->PosY<0)
{
bm1->PosY=0;
bm1->SpeedY=-bm1->SpeedY;
}
}
else
{
// 向鼠标移动的代码
// 运行程序之后不难发现有多张图片时
// 图片总是先排成一排,然后才移向鼠标位置
// 也就是说,图片总是先调整X坐标或Y坐标中的一个与鼠标的相同
// 为什么呢?因为随机移动图片使用的是45度移动,而不是真的随机移动
if(bm1->MovW<MouseX)
xPos=bm1->MovW;
else
xPos=MouseX;
if(bm1->MovH<MouseY)
yPos=bm1->MovH;
else
yPos=MouseY;
if((bm1->PosX-xPos)<0)
bm1->SpeedX=4;
else
bm1->SpeedX=-4;
if((bm1->PosY-yPos)<0)
bm1->SpeedY=4;
else
bm1->SpeedY=-4;
if(abs(bm1->PosX-xPos)<5)
bm1->PosX=xPos;
else
bm1->PosX+=bm1->SpeedX;
if(abs(bm1->PosY-yPos)<5)
bm1->PosY=yPos;
else
bm1->PosY+=bm1->SpeedY;
}
bm1=bm1->Hou;
}
bm1=NULL;
}
void MovePic::ShowPic(void)
{
// 绘制移动图
MyNode *bm1=First;
while(bm1!=NULL)
{
GetGraphics()->DrawBitmapMMX(bm1->PosX, bm1->PosY, bm1->MyPic, SCREENBUFFER);
bm1=bm1->Hou;
}
bm1 = NULL;
}
void MovePic::ShowMessage(HWND hWnd, int xPos, int yPos)
{
char MyMessage[20];
MyNode *Temp=Last;
if(Numbers==0)
{
::MessageBoxA(hWnd, "^_^现在还没有添加图片哦", "MovePic", MB_OK);
}
else
{
while(Temp!=NULL)
{
if((xPos>=Temp->PosX)&&(yPos>=Temp->PosY))
if((xPos<=(Temp->PosX+Temp->MyPic->GetWidth()))&&(yPos<=(Temp->PosY+Temp->MyPic->GetHeight())))
{
sprintf_s(MyMessage,"sprite%c.bmp",Temp->Number+48);
// 有人用的是itoa(),然后把转化后的字符串"sprite%s.bmp"进去
::MessageBoxA(hWnd,MyMessage,"MovePic",MB_OK);
// ::MessageBox(hWnd,MyMessage,"MovePic",MB_OK);
// 本来上面的两个语句都能用,因为
// #define MessageBox MessageBoxW
// #define MessageBox MessageBoxA
// 但是,昨天发现死活编译不过,查了一下定义才发现,原来
// #ifdef UNICODE
// #define MessageBox MessageBoxW
// #else
// #define MessageBox MessageBoxA
// #endif // !UNICODE
// 明白了吧,被定义成UNICODE啦
break;
}
Temp=Temp->Qian;
}
}
}
int MovePic::GetNum(void)
{
return Numbers;
}
void MovePic::SetMouse(int xPos, int yPos)
{
MouseX=xPos;
MouseY=yPos;
}
void MovePic::SaveSpeed(void)
{
MyNode *Temp=First;
while(Temp!=NULL)
{
Temp->OSpeedX=Temp->SpeedX;
Temp->OSpeedY=Temp->SpeedY;
Temp=Temp->Hou;
}
Temp=NULL;
RButton=TRUE;
}
void MovePic::LoadSpeed(void)
{
MyNode *Temp=First;
while(Temp!=NULL)
{
Temp->SpeedX=Temp->OSpeedX;
Temp->SpeedY=Temp->OSpeedY;
Temp=Temp->Hou;
}
Temp=NULL;
RButton=FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -