Eclpse中Java游戏应用程序开发

原创 2006年06月01日 17:20:00
EclpseJava游戏应用程序开发
                            飘飘白云 kesalin@hotmail.com
本文内容:Java游戏应用程序框架,全屏的切换,将Java工程打包,读取相对工程目录文件以及从打包的jar中读取文件的方法。
建立测试项目
1,     eclipse中新建名为 PackTestjava项目,Source页中选择Allow output folders for source folders选项,允许工作输出文件到bin目录下(方便管理)。
2,     eclipse工作目录下,找到PackTest/src目录,在其下建立以下两个目录:com/test,res/images
PackTest.java,MainFrame.java,Tools.java拷贝到test目录下;
将两个png图片分别命名为house.png, ballon.png放到images目录下,在eclipse中刷新项目。
3,     编译运行,应该可以看到屏幕上画出两副图片来。同时可以按
F键进入全屏模式,按ESC键退出全屏模式。
在非IDE环境下运行程序
1,     使用命令行
进入到eclipse的工作目录下的PackTest目录下,新建名为run.batbat文件,输入内容:java -cp bin; com.test.PackTest,保存,双击就可以运行。
注意:这里要求指定bin为工作输出目录。如果你的程序还涉及到网络访问,远程访问等要求更高安全级别的安全策略,则需要在PackTest目录下新建policy文件(没有后缀!),输入内容:
grant {
    permission java.security.AllPermission;
};
同时修改run.bat文件:
java -cp bin; -Djava.security.policy=policy com.test.PackTest
2,     打包运行
(1)将eclipse的工作目录下的PackTest/bin目录下的所以文件以及目录拷贝到一个新的文件夹中比如c:/pack,pack目录下新建manifest.mf文件,输入内容为:
Manifest-Version: 1.0
Main-Class: com.test.PackTest
Created-By: 1.4.2_07 (Sun Microsystems Inc.)
注意:1),冒号后面必须要有一个空格,每行结束要用enter键换行;
2),Main-Class项指定应用程序的入口,应该是有Main()函数的类名。
(2)进入dos,移动到c:/pack目录下输入命令:
Jar cvmf manifest.mf packtest.jar *.*

生成所需的packtest.jar文件,双击就可以运行。如果默认打开方式不是javaw.exe那么可以指定打开方式为javaw.exe,也可以写一个bat文件,如run.bat,输入:java -jar packtest.jar  ,并放置到与packtest.jar同一目录下。

//*******************************Tools.java**************************************

/**
  * Copy Right Information : 转载或引用请保留此信息--飘飘白云
  * Project     : PackTest
  * JDK version used  : jdk1.4.2
  * Version     : 1.0.0
  * Created By    : kesalin@hotmail.com
  * Created date   : 2006-6-1 15:47:08
  * Discription    :
  * Modification history 
  *
  **/

package com.test;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.net.URLClassLoader;

import javax.imageio.ImageIO;

public class Tools
{

    /**
     * 创建缓冲图片
     *
     * @param w
     * @param h
     * @return
     */
    public static Image createBufferedImage(int w, int h) {
        //创建
        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

        //清屏
        Graphics g = bi.getGraphics();
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, w, h);
        g.dispose();
       
        return bi;
    }
   

    /**
     * @param comp
     * @param fileName 图像的相对路径文件名字
     * @return image
     */
    public static Image getImage(Component comp,String fileName)
    {
        URLClassLoader urlLoader = (URLClassLoader)comp.getClass().getClassLoader();
        URL url = urlLoader.findResource(fileName);
       
        Image image = Toolkit.getDefaultToolkit().getImage(url);
        MediaTracker mediatracker = new MediaTracker(comp);
       
        try {
            mediatracker.addImage(image, 0);
            mediatracker.waitForID(0);
        } catch (InterruptedException _ex) {
            System.out.println("#Error#Tools->getImage():" + fileName +" failed."+_ex);
            image = null;
        }
        if (mediatracker.isErrorID(0)) {
            image = null;
        }

        return image;
    }
   

    /**
     * @param comp
     * @param fileName 图像的相对路径文件名字
     * @return
     */
    public static BufferedImage getBufferedImage(Component comp, String fileName)
    {
        BufferedImage bi = null;
        try {
            URLClassLoader urlLoader = (URLClassLoader) comp.getClass().getClassLoader();
            bi = ImageIO.read(urlLoader.getResourceAsStream(fileName));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bi;
    }
}

//*********************PackTest.java***********************************

package com.test;

public class PackTest
{
    public static void main(String[] args) {
        MainFrame packTest = new MainFrame("Java游戏应用程序框架及各种运行方法");
        packTest.show();
    }
}

//********************MainFrame.java

package com.test;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;


public class MainFrame extends JFrame implements Runnable
{

    // 系统相关
    public Graphics2D g2d;
    public Image bufferImage;// 双缓冲
    private JDesktopPane desktop;
 
    GraphicsEnvironment ge = null;
    GraphicsDevice gd = null;
    private boolean isFullScreen = false;// 全屏标志
    private boolean isAppExit = false;// 应用程序结束标志
    private int sleepTime = 10;
   
   
    // 显示相关的属性
    private  int displayModeWidth;// 屏幕水平分辨率
    private  int displayModeHeight;
    private  int gameWidth = 1024;//游戏屏幕宽度
    private  int gameHeight = 768;
  
   
    // 主线程
    private Thread mainThread;
   
    // 时间处理
    private  long curT;
   
   
    // FPS control
    public  int       fps;
    public  long      fpsT;
    public  int       fpsC             = 0;
    public static final int FPS_SEQU         = 1;    // FPS_SEQU 秒更新一下fps
    public static final int FPS_EXP          = 7;
    public static final int FPS_EXP_FLOAT    = 2;
    public static final int SLEEPTIME_ADJUST = 2;
    public static final int SLEEPTIME_MIN    = 5;
    public static final int SLEEPTIME_MAX    = 30;
   
    // 资源变量
    Image ballon = null;
    BufferedImage house = null;
   
   
    /**
     * 构造函数
     * @param title
     */
    public MainFrame(String title) {
        super(title);
        setDefaultCloseOperation(EXIT_ON_CLOSE);// 关闭应用程序
       
        // 初始化JFrame
        initJFrame();
       
        processKeyEvent();
       
        // 启动应用程序
        start();
    }

    /**
     * 初始化JFrame
     */
    public void initJFrame() {
       
        // 取得GraphicsDevice,在某些集成显卡上可能不能工作
        ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        gd = ge.getDefaultScreenDevice();
             
       // 取得显示分辨率的大小
      displayModeWidth = gd.getDisplayMode().getWidth();
      displayModeHeight = gd.getDisplayMode().getHeight();
     
      // 设置应用程序窗口大小
      setSize(gameWidth, gameHeight);
     
      // 创建双缓冲
      bufferImage = Tools.createBufferedImage( gameWidth, gameHeight);
      g2d = (Graphics2D)bufferImage.getGraphics();
      g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
              RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
     
      desktop = new JDesktopPane();
      getContentPane().add(desktop);
       
    }
   
    /**
     * 处理切换全屏按键事件
     */
    private void processKeyEvent()
    {
        // 如果支持全屏
        if( gd.isFullScreenSupported() )
        {
            addKeyListener( new KeyListener() {
                public void keyTyped(KeyEvent e) {
                }

                public void keyPressed(KeyEvent e) {
                    // 按escape键退出全屏
                    if( e.getKeyCode() == KeyEvent.VK_ESCAPE ) {
                        if( isFullScreen ) {
                            isFullScreen = false;
                            changeScreenSize();
                        }
                    }
                    // 按F键进入全屏
                    else if( e.getKeyCode() == KeyEvent.VK_F ) {
                        if( !isFullScreen ) {
                            isFullScreen = true;
                            changeScreenSize();
                        }
                    }
                }
   
                public void keyReleased(KeyEvent e) {  
                }
            }) ;
        }
    }
   
    public void paint(Graphics g ) {
        if( isFullScreen )
            g.drawImage(bufferImage,0,0,displayModeWidth,displayModeHeight,this);
        else
            g.drawImage(bufferImage,0,0,gameWidth,gameHeight,this);
    }
   
    /**
     * 切换全屏,并重画
     */
    public void changeScreenSize() {
        if( isFullScreen ) {
            dispose();
            setUndecorated(true);// 隐藏JFrame上的Title bar
            gd.setFullScreenWindow(this);
            show();
        }
        else {
            dispose();
            gd.setFullScreenWindow(null);
            setUndecorated(false);
            this.setResizable(false);
            show();
        }
    }
   
    /**
     * 更新刷新频率
     */
    private  void updateFPS() {
        // FPS control
        if( (fpsT + FPS_SEQU * 1000) > curT ){
            fpsC ++;
        }
        else {
            fps = fpsC / FPS_SEQU;
            fpsT = curT;
            fpsC = 0;
           
            // 调整FPS
            if( fps < FPS_EXP - FPS_EXP_FLOAT ){
                if( sleepTime > SLEEPTIME_MIN )
                    sleepTime -= SLEEPTIME_ADJUST;
            }
            else if( fps > FPS_EXP + FPS_EXP_FLOAT ){
                if( sleepTime < SLEEPTIME_MAX )
                    sleepTime += SLEEPTIME_ADJUST;
            }
        }
    }
   
    /**
     * 启动主线程
     */
    public void start() {
        // 启动主线程
        mainThread = new Thread(this);
        mainThread.start();
    }
   
    public void run()
    {
        gameInit();
       
        for(;!isAppExit;)
        {
            curT = System.currentTimeMillis();
            updateFPS();
            gameMain();

            gameDraw();
            repaint();
           
            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
                System.out.println("#Error#MainFrame->gcWait():" + e);
            }
        }
       
        if( isAppExit ) {
            this.dispose();
        }
    }
   
    /**
     * 初始化应用程序
     */
    public void gameInit() {
       
    }
   
    /**
     * 游戏主逻辑处理
     */
    public void gameMain() {
        if( ballon == null ) {
            ballon = Tools.getImage(this,"res/images/ballon.png");
        }
       
        if( house == null ) {
            house = Tools.getBufferedImage(this,"res/images/house.png");
        }
    }
   
    /**
     * 游戏描绘处理
     */
    public void gameDraw() {
        g2d.drawImage(ballon,0,0,this);
        g2d.drawImage(house,0,ballon.getHeight(null),this);
    }
}

<全文完>

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS 5的应用程序开发,功能,改变游戏规则

iOS 5的应用程序开发,功能,改变游戏规则   正文:   Android已经提出在为iPhone激烈的市场竞争的威胁,有必要争这些设备的新功能。为了在苹果创造的iOS 5所以自然就载有创新的功能和...
  • cykix
  • cykix
  • 2014年08月09日 08:54
  • 373

iPad的应用程序开发和iPad的游戏开发简介

iPad可以考虑采取任何IT公司迄今为止进行认真的平板电脑基地重要的一步。随着不断增长的应用程序,iPad应用开发和iPad游戏开发的需求,现在是需求的最新资讯移动应用程序开发方案。随着最新的版本和更...
  • xiiioe
  • xiiioe
  • 2014年07月05日 13:13
  • 194

Java Web应用程序开发

Java Web应用程序开发 用Tomcat构建WEB站点 WEB应用的相关知识 Web应用程序简介 应用程序:指允许用户执行特定任务的软件程序,主要分为桌面应用程序和Web应用程序两种类型。...

Java数据库应用程序开发基础

  • 2013年09月14日 19:19
  • 121KB
  • 下载

Java Web应用程序开发1

一、Web应用程序简介 应用程序:指允许用户执行特定任务的软件程序,主要分为桌面应用程序和Web应用程序两种类型。 1、桌面应用程序(Desktop Application):一般是指采用客户机/...

Java面向对象应用程序开发

  • 2010年05月07日 15:17
  • 12.56MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Eclpse中Java游戏应用程序开发
举报原因:
原因补充:

(最多只允许输入30个字)