`
乱世群英
  • 浏览: 18718 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

java 游戏编程 (三)

阅读更多
上篇说到的动画,在显示上有个比较大的问题,动画在闪烁。这是因为程序不断直接绘制屏幕造成。避免闪烁,我们用双倍缓存。缓存区是绘图时使用的屏外内存。双缓存不是直接绘制屏幕,而是绘制到后缓存区然后复制到屏幕。

page flipping技术。跳过复制缓存区,直接把后缓存区变为显示缓存区。

以上这些情况用BufferStrategy类处理。Jframe,Window这些对象都有BufferStrategy。调用getBufferStrategy()方法。调用show方法显示绘图缓存区,当然之前要用createBufferStrategy()方法创建
如:
frame.createBufferStrategy(2);  //表示两个缓冲区
BufferStrategy str = frame.getBufferStrategy();
Graphics g = str.getDrawGraphics()
g.dispose();
str.show();


这样我们对MyScreenMgr 这个类进行扩充。MyScreenMgr 这个类在http://luanshiqunying-sina-com.iteye.com/blog/408389第一篇里
/**
 * 
 */
package com.jsheng.game.util;

import java.awt.DisplayMode;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JFrame;

/** function:
 * company: jsheng
 * @author wanghn      wanghaining9999@sina.com
 * describe:
 */
public class MyScreenMgr {
	
	private GraphicsDevice device;
	 
    public MyScreenMgr() {
        GraphicsEnvironment environment =
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        device = environment.getDefaultScreenDevice();
    }
	 public DisplayMode findFirstCompatibleMode(
		        DisplayMode modes[])
		    {
		        DisplayMode goodModes[] = device.getDisplayModes();
		        for (int i = 0; i < modes.length; i++) {
		            for (int j = 0; j < goodModes.length; j++) {
		                if (displayModesMatch(modes[i], goodModes[j])) {
		                    return modes[i];
		                }
		            }

		        }

		        return null;
		    }
	 
	    public DisplayMode getCurrentDisplayMode() {
	        return device.getDisplayMode();
	    }
	    public boolean displayModesMatch(DisplayMode mode1,
	            DisplayMode mode2)

	        {
	            if (mode1.getWidth() != mode2.getWidth() ||
	                mode1.getHeight() != mode2.getHeight())
	            {
	                return false;
	            }

	            if (mode1.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI &&
	                mode2.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI &&
	                mode1.getBitDepth() != mode2.getBitDepth())
	            {
	                return false;
	            }

	            if (mode1.getRefreshRate() !=
	                DisplayMode.REFRESH_RATE_UNKNOWN &&
	                mode2.getRefreshRate() !=
	                DisplayMode.REFRESH_RATE_UNKNOWN &&
	                mode1.getRefreshRate() != mode2.getRefreshRate())
	             {
	                 return false;
	             }

	             return true;
	        }
	 public void setFullScreen(DisplayMode displayMode){
		 final JFrame frame = new JFrame();
	        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        frame.setUndecorated(true);
	        frame.setIgnoreRepaint(true);
	        frame.setResizable(false);

	        device.setFullScreenWindow(frame);

	        if (displayMode != null &&
	            device.isDisplayChangeSupported())
	        {
	            try {
	                device.setDisplayMode(displayMode);
	            }
	            catch (IllegalArgumentException ex) { }
	            frame.setSize(displayMode.getWidth(),
	                displayMode.getHeight());
	        }
	        try {
	            EventQueue.invokeAndWait(new Runnable() {
	                public void run() {
	                    frame.createBufferStrategy(2);
	                }
	            });
	        }
	        catch (InterruptedException ex) {
	            // 处理
	        }
	        catch (InvocationTargetException  ex) {
	            // 处理
	        }
		    }
	 
	 /*
	  * 取得显示图形描述表,使用双缓存,需要调用update方法
	  */
	    public Graphics2D getGraphics() {
	        Window window = device.getFullScreenWindow();
	        if (window != null) {
	            BufferStrategy strategy = window.getBufferStrategy();
	            return (Graphics2D)strategy.getDrawGraphics();
	        }
	        else {
	            return null;
	        }
	    }

	    public void update() {
	        Window window = device.getFullScreenWindow();
	        if (window != null) {
	            BufferStrategy strategy = window.getBufferStrategy();
	            if (!strategy.contentsLost()) {
	                strategy.show();
	            }
	        }
	    }
	    public int getWidth() {
	        Window window = device.getFullScreenWindow();
	        if (window != null) {
	            return window.getWidth();
	        }
	        else {
	            return 0;
	        }
	    }
	    
	    public int getHeight() {
	        Window window = device.getFullScreenWindow();
	        if (window != null) {
	            return window.getHeight();
	        }
	        else {
	            return 0;
	        }
	    }
	    
	    public Window getFullScreenWindow() {
	        return device.getFullScreenWindow();
	    }
	    
	    /*
	     * 生成与当前显示器兼容的图像,就是与显示器有相同位深度和颜色模型的图像。
	     * 生成的图像为BufferedImage,是系统内存中存放的非加速图像。
	     */
	    public BufferedImage createCompatibleImage(int w, int h,
	            int transparancy)
	        {
	            Window window = device.getFullScreenWindow();
	            if (window != null) {
	                GraphicsConfiguration gc =
	                    window.getGraphicsConfiguration();
	                return gc.createCompatibleImage(w, h, transparancy);
	            }
	            return null;
	        }
	    
	    public void reScreen() {
	        Window window = device.getFullScreenWindow();
	        if (window != null) {
	            window.dispose();
	        }
	        device.setFullScreenWindow(null);
	    }
}

对这个新类的使用注意一点就是显示的选择方式改为提供一系列的可选的显示方式,由这个类自己去寻找合适的显示方式。
分享到:
评论

相关推荐

    JAVA游戏编程

    JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门 JAVA游戏编程 JAVA入门

    游戏编程游戏编程java游戏编程java

    总的来说,Java游戏编程涵盖了广泛的编程知识,从基础到高级,从理论到实践,都需要深入理解和掌握。通过不断的学习和实践,开发者可以利用Java创造出丰富多样的游戏世界。在"JavaGames"这个压缩包中,可能包含了...

    Java游戏编程(游戏开发与编程序列).rar

    Java游戏编程是软件开发领域中的一个分支,它利用Java编程语言来创建各种类型的游戏,从简单的2D小游戏到复杂的3D大作。本资源“Java游戏编程(游戏开发与编程序列).rar”可能包含一系列教程、源代码示例或者相关...

    Java游戏编程原理与实践教程+随书原代码

    Java游戏编程原理与实践教程是一本深入探讨如何使用Java语言进行游戏开发的专业书籍。它涵盖了游戏编程的基础概念、核心技术以及实战技巧,旨在帮助读者从零基础到熟练掌握Java游戏开发。书中结合了大量的实例和源...

    《Java 2游戏编程》

    《Java 2游戏编程》是一本专为游戏开发爱好者和专业人士设计的教程,由美国作者Thomas Petchel撰写,并由晏利斌、孙淑敏、邵荣等人翻译成中文。这本书深入浅出地介绍了如何使用Java 2平台进行游戏开发,涵盖了从基础...

    java游戏编程导学

    Java游戏编程导学 在Java游戏开发领域,Java以其跨平台、高效稳定的特点,成为许多开发者的选择。本导学将深入探讨如何利用Java语言来创建引人入胜的游戏。Java游戏编程不仅涉及到基本的编程概念,还涵盖了图形渲染...

    Java游戏编程原理与实践教程源码

    Java游戏编程原理与实践是计算机科学中的一个重要领域,它结合了Java编程语言的特性与游戏设计的技巧。在这个教程源码包中,包含了多种经典游戏的实现,如推箱子、俄罗斯方块、超级玛丽等,这些都是游戏开发初学者和...

    java游戏编程原理与实践教程pdf+源代码

    Java游戏编程原理与实践教程是一本深入探讨如何使用Java语言进行游戏开发的专业书籍,由陈锐、夏敏捷、葛丽萍三位专家共同编著。这本书不仅涵盖了基础的编程概念,还详细介绍了游戏开发中的关键技术和实战技巧。通过...

    JAVA游戏编程.

    在JAVA游戏编程的世界里,开发者可以利用JAVA的强大功能和丰富的库来创造引人入胜的游戏体验。本课程资料集合了从基础知识到高级技术的全面学习路径,帮助你深入理解JAVA在游戏开发中的应用。 首先,从第二章的...

    Java游戏编程读书笔记

    在深入探讨Java游戏编程的世界之前,我们先要理解Java作为一种编程语言的基础特性。Java是由Sun Microsystems(现为Oracle公司)于1995年推出的,它是一种面向对象、跨平台的语言,具有“一次编写,到处运行”的特性...

    Java游戏编程入门

    想学JAVA游戏编程吗?快来了解下吧!这个资源是Java初学者的极品教程,讲的简单透彻。

    Java游戏编程

    Java游戏编程是一个涵盖广泛的主题,它涉及到使用Java编程语言来创建各种类型的游戏,从简单的2D小游戏到复杂的3D大作。在这个领域中,开发者需要掌握基础的编程概念,以及特定于游戏开发的技术。 首先,Java是一种...

    java游戏编程光盘源代码

    java游戏编程光盘源代码!~

    Java游戏编程源码教程

    Java游戏编程源码教程是一门深入浅出的学习资源,适合对Java编程有兴趣并希望进入游戏开发领域的初学者。本教程通过实例源码讲解,旨在帮助读者掌握Java在游戏开发中的应用,逐步提升编程技巧和游戏设计能力。 首先...

    JAVA游戏编程源代码

    以下将详细介绍与"JAVA游戏编程源代码"相关的技术要点。 1. **Java基础知识**:Java是面向对象的语言,理解类、对象、封装、继承和多态等核心概念至关重要。同时,熟悉Java语法,如控制流(if-else,switch,循环)...

    Java游戏编程开发教程

    Java游戏编程开发教程是针对那些想要利用Java语言创建游戏的开发者设计的一套全面学习资源。Java作为一种跨平台、面向对象的编程语言,因其强大的性能和灵活性,在游戏开发领域有着广泛的应用。本教程将深入探讨如何...

    Java游戏编程小手册

    "Java游戏编程小手册" 本资源是一个Java游戏编程的小手册,涵盖了Java游戏开发的基本概念、技术和框架。下面是从该资源中提炼出的知识点: 一、Java游戏开发概述 Java游戏开发是使用Java语言创建游戏的过程。...

    《Java游戏编程》源代码

    在百科里搜索“Java游戏编程” (http://baike.baidu.com/view/647813.htm),就能发现一部好书——《Java游戏编程》,是深入学习java可望而不可求(难买)的好书

    Java 游戏编程入门

    在《Java游戏编程入门》这本书中,作者向我们揭示了使用Java语言开发游戏的基本概念和技术。这是一本适合初学者的教程,旨在帮助那些对编程和游戏开发感兴趣的人快速掌握必要的技能。书中不仅包含了Java语言的基础...

    Java2游戏编程.pdf

    本书的出版标志着Java游戏编程技术的深入探索和应用,是对游戏开发人员和爱好者来说一本非常实用的参考书籍。 从书的内容来看,涵盖了Java游戏编程的众多方面,主要包括以下几点: 1. Java 2D游戏编程基础:书中从...

Global site tag (gtag.js) - Google Analytics