`
mmdev
  • 浏览: 12934975 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

JAVA实现拼图游戏

 
阅读更多
packageorg.test;



/**
*<p>Title:LoonFramework</p>
*<p>Description:拼图图像处理[未优化](优化算法已内置于loonframework-game框架中。)</p>
*<p>Copyright:Copyright(c)2007</p>
*<p>Company:LoonFramework</p>
*
@authorchenpeng
*@email:ceponline@yahoo.com.cn
*
@version0.1
*/

importjava.awt.Canvas;
importjava.awt.Color;
importjava.awt.Event;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.MediaTracker;
importjava.awt.image.BufferedImage;

importorg.loon.framework.game.helper.ImageHelper;

publicclassBlockImageextendsCanvas{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;

privateImage_img;

privateImage_img2;

privateGraphicsbg;

privateImagebackimage;

privateintblocks[];

privatebooleanisEvent;

privateMediaTrackermt;

privateint_width;

privateint_height;

privateint_RS;

privateint_CS;

privateImagescreen=null;

privateGraphicslater=null;

privateint_objWidth;

privateint_objHeight;

privateint_COUNT;

/**
*析构函数,内部调用init方法。
*
*
@parambImage
*
@paramoverImage
*
@paramcs
*
@paramrs
*/
publicBlockImage(ImagebImage,ImageoverImage,intcs,intrs){
init(bImage,overImage,cs,rs);
}

/**
*初始化拼图参数。
*
*
@parambImage
*
@paramoverImage
*
@paramcs
*
@paramrs
*/
publicvoidinit(ImagebImage,ImageoverImage,intcs,intrs){
//列数
_CS=cs;
//行数
_RS=rs;
//加载拼图用图像。
_img=bImage;

//获得实际窗体宽。
_width=_img.getWidth(null);
//获得实际窗体高。
_height=_img.getHeight(null);
//获得单块图像宽。
_objWidth=_width/_CS;
//获得单块图像高。
_objHeight=_height/_RS;

//本程序直接使用backimage上一块图形区域缓冲选择项,所以实际背景图像高=图形高+额外图块高。
backimage=newBufferedImage(_width,_height+_objHeight,1);
//获得生成的图形
later=backimage.getGraphics();
//再创建一块图像区域,作为图像缓存用。
screen=newBufferedImage(_width,_height,1);
//获得缓存的图形
bg=screen.getGraphics();
//获得等同图片总数的数组。
_COUNT=_CS*_RS;
blocks
=newint[_COUNT];
//初始化为非点击。
isEvent=false;
//加载完成拼图的显示图。
_img2=overImage;
//初始化图块参数。
for(inti=0;i<_COUNT;i++){
blocks[i]
=i;
}
//载入MediaTracker,用以跟踪图像状态。
mt=newMediaTracker(this);
//加载被跟踪的图像。
mt.addImage(_img,0);
mt.addImage(_img2,
0);
//同步载入。
try{
mt.waitForID(
0);
}
catch(InterruptedExceptioninterruptedexception){
return;
}
//随机生成图像面板内容。
rndPannel();

}

/**
*描绘窗体图像。
*/
publicvoidpaint(Graphicsg){
//检查图像载入。
if(mt.checkID(0)){
//描绘底层背景。
bg.drawImage(backimage,0,0,null);
//判断是否触发完成事件。
if(!isEvent){
//设置背景色。
bg.setColor(Color.black);
//循环绘制小图片于背景缓存中。
for(inti=0;i<_CS;i++){
for(intj=0;j<_RS;j++)
bg.drawRect(i
*_objWidth,j*_objHeight,_objWidth,
_objHeight);

}

}
//仅当完成事件触发并且有胜利图片时,载入完成提示。
if(isEvent&&_img2!=null){
bg.drawImage(_img2,
0,0,null);
}
}
//举凡绘制图像时,应遵循显示图像仅绘制一次的基本原则,一次性的将背景绘制到窗体。
//简单来说,也就是采取[双缓存]的方式,所有复杂操作皆在缓存区完成,也只有这样才能避免产生延迟闪烁。
g.drawImage(screen,0,0,this);
g.dispose();
}

/**
*变更图像。
*/
publicvoidupdate(Graphicsg){
paint(g);
}

/**
*鼠标点击事件。
*/
publicbooleanmouseDown(Eventevent,inti,intj){

if(isEvent)
returntrue;
//换算点击位置与小图片。
intk=i/_objWidth;
intl=j/_objHeight;
copy(
0,0,0,_RS);
copy(k,l,
0,0);
copy(
0,_RS,k,l);
inti1=blocks[0];
//换算选中图片存储区。
blocks[0]=blocks[l*_CS+k];
blocks[l
*_CS+k]=i1;
intj1;
for(j1=0;j1<_COUNT;j1++){
if(blocks[j1]!=j1){
break;
}
}
if(j1==_COUNT)
isEvent
=true;
repaint();
returntrue;
}

publicbooleanmouseUp(Eventevent,inti,intj){
returntrue;
}

publicbooleanmouseDrag(Eventevent,inti,intj){
returntrue;
}

/**
*copy换算后的图像区域。
*
*
@parami
*
@paramj
*
@paramk
*
@paraml
*/
voidcopy(inti,intj,intk,intl){
later.copyArea(i
*_objWidth,j*_objHeight,_objWidth,_objHeight,
(k
-i)*_objWidth,(l-j)*_objHeight);
}

/**
*事件触发状态。
*
@return
*/
publicbooleanisEvent(){
returnisEvent;
}

publicvoidsetEvent(booleanisEvent){
this.isEvent=isEvent;
}

/**
*随机生成面板图片。
*
*/
voidrndPannel(){
later.drawImage(_img,
0,0,this);
for(inti=0;i<(_COUNT*_CS);i++){
intj=(int)((double)_CS*Math.random());
intk=(int)((double)_RS*Math.random());
intl=(int)((double)_CS*Math.random());
inti1=(int)((double)_RS*Math.random());
copy(j,k,
0,_RS);
copy(l,i1,j,k);
copy(
0,_RS,l,i1);
intj1=blocks[k*_CS+j];
blocks[k
*_CS+j]=blocks[i1*_CS+l];
blocks[i1
*_CS+l]=j1;
}

}

publicstaticvoidmain(String[]args){

Framefrm
=newFrame("简单的JAVA拼图效果实现[由Loonframework框架提供]");
frm.setSize(
480,500);
frm.setResizable(
false);
/**
*PS:ImageHelper.loadImage为Loonframework框架中helper下方法,为不依赖于javax扩展包而开发。
*可使用ImageIO相关方法代替。
*/
//加载图像。
ImagebackImage=ImageHelper.loadImage("C:/backimage.jpg",true);
ImageoverImage
=ImageHelper.loadImage("C:/over.gif",true);
//BlockImage中参数分别为用于分解的拼图,完成后显示文字,拆分图片为分几列,分拆分图片为几行。
//建议使用正方形图片作为背景图。
frm.add(newBlockImage(backImage,overImage,4,4));
backImage
=null;
overImage
=null;
//显示窗体。
frm.setVisible(true);

}

}


详细操作参见源码注释,所用图片如下(也可自由选取图形):






本代码算法支持自由成比例分隔图像行列,效果若下:



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics