⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 movepic.cpp

📁 这是一个简单的MovePicture
💻 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 + -