📄 mdraw.java
字号:
/*程序:MDraw.java
*说明:扫雷游戏绘图运算。
* 图片加载、图片贴图、次显示页转换、画面更新等
*/
import java.awt.*;
import javax.swing.*;
class MDraw{
//游戏数据
int GRIDX; //地图x轴格数
int GRIDY; //地图y轴格数
int MINES; //地雷数
Container c;//容器
//次显示区
Image offI;
Graphics offG;
//图片数组
Image[] imgSmile;
Image[] imgMap;
Image[] imgCount;
//所有图片宽与长
int SMILE_WIDTH;
int SMILE_HEIGHT;
int MAP_WIDTH;
int MAP_HEIGHT;
int COUNT_WIDTH;
int COUNT_HEIGHT;
//各区域坐标
int STATE_X;//游戏状态区
int STATE_Y;
int COUNT_X;//时间计数
int COUNT_Y;
int MCOUNT_X;//地雷计数
int MCOUNT_Y;
int MAP_X;//地雷区
int MAP_Y;
int SMILE_X;//笑脸
int SMILE_Y;
public MDraw(int gridx, //地图x轴格数
int gridy, //地图y轴格数
int mines, //地雷数
Container c){//容器
//资料初始
this.GRIDX=gridx;
this.GRIDY=gridy;
this.MINES=mines;
this.c=c;
//建立次画面
offI=c.createImage(c.getWidth(),c.getHeight());
offG=offI.getGraphics();
//读入所有图片
imgSmile=new Image[5]; //游戏状态图(笑脸)
for(int i=0;i<=4;i++)
imgSmile[i]=(new ImageIcon("pic/smile/s"+i+".gif")).getImage();
imgCount=new Image[10];//计数(LED字型)
for(int i=0;i<=9;i++)
imgCount[i]=(new ImageIcon("pic/count/"+i+".gif")).getImage();
imgMap=new Image[15]; //地图上(数字、地雷)
for(int i=0;i<=14;i++)
imgMap[i]=(new ImageIcon("pic/map/m"+i+".gif")).getImage();
//纪录图片宽与长
SMILE_WIDTH=imgSmile[0].getWidth(null);//游戏状态图
SMILE_HEIGHT=imgSmile[0].getHeight(null);
COUNT_WIDTH=imgCount[0].getWidth(null);//计数图
COUNT_HEIGHT=imgCount[0].getHeight(null);
MAP_WIDTH=imgMap[0].getWidth(null);//地图状态图
MAP_HEIGHT=imgMap[0].getHeight(null);
//所有区域坐标
MAP_X=MAP_WIDTH;//地雷区
MAP_Y=MAP_HEIGHT*5;
DrawMapFrame(MAP_X-3,MAP_Y-3,
GRIDX*MAP_WIDTH+6,GRIDY*MAP_HEIGHT+6,
3,false);
STATE_X=MAP_WIDTH;//游戏状态区
STATE_Y=MAP_HEIGHT;
DrawMapFrame(STATE_X-3,STATE_Y-3,
GRIDX*MAP_WIDTH+6,MAP_HEIGHT*3+6,
3,false);
MCOUNT_X=STATE_X+(MAP_HEIGHT*3-COUNT_HEIGHT)/2;//地雷数
MCOUNT_Y=STATE_Y+(MAP_HEIGHT*3-COUNT_HEIGHT)/2;
DrawMapFrame(MCOUNT_X-2,MCOUNT_Y-2,
COUNT_WIDTH*3+4,COUNT_HEIGHT+4,
2,false);
COUNT_X=(STATE_X-3)+
(GRIDX*MAP_WIDTH+6)-MAP_WIDTH-COUNT_WIDTH*3;//秒数
COUNT_Y=MCOUNT_Y;
DrawMapFrame(COUNT_X-2,COUNT_Y-2,
COUNT_WIDTH*3+4,COUNT_HEIGHT+4,2,false);
SMILE_X=(STATE_X-3)+(GRIDX*MAP_WIDTH+6-SMILE_WIDTH)/2;//笑脸
SMILE_Y=STATE_Y+(MAP_HEIGHT*3-SMILE_HEIGHT)/2;
//画出立体框
DrawMapFrame(0,0,(GRIDX+2)*MAP_WIDTH,(GRIDY+6)*MAP_HEIGHT,
4,true);
//mapInit();//地图初始化
showCount(MCOUNT_X,MCOUNT_Y,MINES);//显示地雷数
showCount(COUNT_X,COUNT_Y,0);//显示秒数
showSmile(0);//显示笑脸
}
//显示地图图标
public void showMap(int x,int y,int mode){
if(x>=0 && x<GRIDX &&//防止超出数组
y>=0 && y<GRIDY){
offG.drawImage(imgMap[mode],
MAP_X+x*MAP_WIDTH,
MAP_Y+y*MAP_HEIGHT,
null);
}
}
//显示笑脸
public void showSmile(int i){
if(i>=0 && i<=4)
offG.drawImage(imgSmile[i],SMILE_X,SMILE_Y,null);
update();
}
//显示计数数字
public void showCount(int x,int y,int count){
if(count>=0){
offG.drawImage(imgCount[(count%1000)/100],x,y,null);
offG.drawImage(imgCount[(count%100)/10],x+COUNT_WIDTH,y,null);
offG.drawImage(imgCount[(count%10)],x+COUNT_WIDTH*2,y,null);
update();//更新画面
}
}
//画出砖块组动作区地图外框
public void DrawMapFrame(int x,int y,int wid,int hig,int side,boolean raised){
//定义多边形坐标
int xx[][]={{x,x+wid,x+wid-side,x+side},//上
{x+wid-side,x+wid,x+wid,x+wid-side},//右
{x+side,x+wid-side,x+wid,x},//下
{x,x+side,x+side,x}};//左
int yy[][]={{y,y,y+side,y+side},//上
{y+side,y,y+hig,y+hig-side},//右
{y+hig-side,y+hig-side,y+hig,y+hig},//下
{y,y+side,y+hig-side,y+hig}};//左
//画出多边形
for(int i=0;i<=3;i++){
if(raised){//设定框为凸起
switch(i){//不同边设定不同颜色
case 0:
offG.setColor(new Color(250,250,250));
break;
case 1:
offG.setColor(new Color(120,120,120));
break;
case 2:
offG.setColor(new Color(100,100,100));
break;
case 3:
offG.setColor(new Color(240,240,240));
break;
}
}else{//设定框为凹陷
switch(i){//不同边设定不同颜色
case 0:
offG.setColor(new Color(100,100,100));
break;
case 1:
offG.setColor(new Color(240,240,240));
break;
case 2:
offG.setColor(new Color(250,250,250));
break;
case 3:
offG.setColor(new Color(120,120,120));
break;
}
}
offG.fillPolygon(xx[i],yy[i],4);
}
update();//更新画面
}
public void update(){
c.getGraphics().drawImage(offI,0,0,null);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -