Java 游戏中实现全屏和自由切换

<原创来自 cnmm22:http://blog.csdn.net/cnmm22/article/details/44492359>

包括在 awt  swing  中。

 

我写了一段代码,在awt swing 中通用:

 

    Boolean fullsm;  //定义一个类成员变量,配合按键和监听事件使用。

    public void setwindows() {

 

       // dispose();     //退出显示时清理资源

       // this.setUndecorated(false);  //设置标题

       // this.setVisible(false);

       this.getGraphicsConfiguration().getDevice().setFullScreenWindow(null);  //关键代码只有一句

       this.setSize(SCREENWSCREENH);  //屏幕的宽和高

       this.addWindowListener(new WindowAdapter() {//设置退出监听

           public voidwindowClosing(WindowEvent e) {

              System.exit(0);

           }

       });

       this.setResizable(false);

       setVisible(true);

//从此处开始实现让窗口显示自动居中的功能

Toolkit tk = Toolkit.getDefaultToolkit();

       Dimensiond = tk.getScreenSize();

       double x = d.getWidth();  //得到的屏幕宽

       double y = d.getHeight(); //得到屏幕高

       int w = (int) (x - SCREENW) / 2;

       int h = (int) (y - SCREENH) / 2;

       if (w > 0 && h > 0) {

           this.setLocation(wh);

       }else{

           this.setLocation(1, 1);

       }

       fullsmfalse;

    }

 

    public void setfullsm() {

       // dispose();

       // this.setUndecorated(true);

       // this.setVisible(false);

       this.getGraphicsConfiguration().getDevice().setFullScreenWindow(this);

       fullsmtrue;

    }

 

其中包含几个意思:

 

1、 方法可以配合监听事件或按键使用,具体我就不做演示了。引用对象要继承自 Frame  Jframe等组件

 

2、  被我注释掉的3段代码

 

       // dispose();

       // this.setUndecorated(false);

       // this.setVisible(false);

 

是一种释放窗口资源的写法,但经我的测试,若你设置了按键adapter,这3段代码会产生问题:按键会短暂失灵,对于游戏这意味着什么?

 

另,实际我也测试了,在多次全屏-窗口-全屏-窗口切换后,系统资源并没用显著变化。

 

所以,dispose();能不用就不用吧。

 

3、 在全屏切换后,超出的屏幕区域会遗留以前被paint的精灵等,这时最好通过对屏幕尺寸进行计算,在paint()方法的最后绘制出多余区域的遮挡,甚至可以放上一些logo在多余后的区域。我是这样做的:

       if (fullsm) {

           g.setColor(new Color(255, 255, 237));

           g.fillRect(SCREENW, 0, (intx- SCREENW, (inty);  //绘制遮挡

           g.fillRect(0, SCREENH, (intx, (inty- SCREENH);    //绘制遮挡

           if (x > SCREENH+100){  //判断屏幕是否有充足多余位置,若有可以放上logo

              g.setColor(new Color(255, 51, 102));

              FontfullnewFont("宋体", Font.ITALIC, 34);

              g.setFont(full);

              g.drawString("任意内容 ", (intx-399, (int)y-54);

           }

       }

 

一定要在paint()最后绘制, 不然也遮挡不了。

 

4、本程序包括一个让窗口显示自动居中的功能。

你可能感兴趣的:(java)