源码下载地址:http://download.csdn.net/source/3503308
第三:设计师
好的程序不仅能够让玩家玩设计好的游戏,还应该让他们的新想法得以实现,这就需要为他们提供设计平台
1:布局在游戏界面中,新建一个类来完成里面的全部功能,玩家可以点选右边的图来设计自己的想法
左边是布局,可以用一个CRect数组设置其区域
CRect pic[6];//用于存储六个图片的位置
CRect place[64];//用于存储64个格子的位置
BOOL CDesignDlg::OnInitDialog()
{
num=0;//默认初始为第十关
chosed=0;//默认选中的是墙
//初始化六个图片的位置
dc=GetDC();
flag=false;
//int i,j;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
face1[i][j]=-1;
for(i=0;i<=2;i++)
{
pic[i].left=480;
pic[i].right=530;
pic[i].top=40+60*i;
pic[i].bottom=90+60*i;
}
for(i=3;i<=5;i++)
{
pic[i].left=540;
pic[i].right=590;
pic[i].top=40+(i-3)*60;
pic[i].bottom=90+(i-3)*60;
}
//初始化64个位置
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
{
place[8*i+j].left=BEGIN+50*j;
place[8*i+j].top=BEGIN+50*i;
place[8*i+j].right=BEGIN+50*(j+1);
place[8*i+j].bottom=BEGIN+50*(i+1);
}
CDialog::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
其次就是需要绘制了,其中绘制图片的函数参见界面的模块,
2:鼠标操作,通过鼠标来选择和绘制图形,需要一些标签来确定是否选中的状态
void CDesignDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int i=0,j=0;
if(flag==false)//表示没有选择目标
{
for(i=0;i<=5;i++)
{
if(pic[i].PtInRect(point))
{
if(i==5)
chosed=6;
else
chosed=i;
flag=true;
CDesignDlg::draw_chosed(dc);
}
}
}
else
{
for(i=0;i<=5;i++)
{
if(pic[i].PtInRect(point))
{
if(i==5)
chosed=6;
else
chosed=i;
CDesignDlg::draw_chosed(dc);
}
}
if(i>=5)//表示不再图片区域
{
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
{
if(place[8*i+j].PtInRect(point))
{
face1[i][j]=chosed;
break;
}
}
CDesignDlg::draw_face1(dc);
}
}
CDialog::OnLButtonDown(nFlags, point);
}
3:保存绘制的图形
对于保存图形,使用ini文件比较容易操作,节名,键名和键值,比txt文档方便操作,但是使用注册表又没有太大必要。对于ini文件的操作主要有几个函数
WritePrivateProfileString
GetPrivateProfileString
保存的时候需要对绘制的图形做些判断,例如没有人或者人多与1个,或者箱子的数目与目的地的数目不等呀,需要反馈给玩家重新设计
void CDesignDlg::OnSave()
{
int i,j,box,des,man;
box=des=man=0;
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
{
if(face1[i][j]==3)
man++;
if(face1[i][j]==2||face1[i][j]==6)
box++;
if(face1[i][j]==4||face1[i][j]==6)
des++;
}
if(man==0)
{
MessageBox("没有人的游戏","提示");
return ;
}
if(man>1)
{
MessageBox("游戏人数多于1","提示");
return;
}
if(des!=box)
{
MessageBox("目的地数与箱子数不相等","Warning!");
return ;
}
CString section;
CString key,value;
CString s;
CString path="./save.ini";
section="已保存总数";key="总数";
GetPrivateProfileString(section,key,s,value.GetBuffer(0),100,path);
num=(int)atof(value.GetBuffer(0));//获取以保存的总数
section.Format("界面数据%d",num+1);//默认重20关开始
BOOL f=false;
for( i=0;i<=7;i++)
for(j=0;j<=7;j++)
{
key.Format("%d",8*i+j);
value.Format("%d",face1[i][j]);
f=WritePrivateProfileString(section,key,value,path);
if(f==false)
break;
}
if(f==false)
MessageBox("保存失败","warning");
else
{
MessageBox("保存成功","warning");
section="已保存总数";key="总数";value.Format("%d",num+1);
WritePrivateProfileString(section,key,value,path);
}
}
4:清除界面
设计者对界面不满意时应该可以清除界面,其实也很简单,只要初始化界面即可
void CDesignDlg::OnClear()
{
for(i=0;i<=7;i++)
for(j=0;j<=7;j++)
face1[i][j]=-1;
RedrawWindow();
CDesignDlg::OnPaint();
}