[Java 游戏编程]游戏框架预览
来源:互联网 发布:贾利尔.奥卡福数据 编辑:程序博客网 时间:2024/05/19 15:41
游戏窗体:
JFrame 容器加载一个游戏画布实现【add(GamePanel)】
pack()方法表示由JComponent来决定窗体大小
import javax.swing.JFrame;public class Game {public static void main(String []args) {JFrame window = new JFrame("First Game");window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);window.add(new GamePanel());window.pack();window.setVisible(true);}}
游戏画布:
构造函数中
/*实现GUI event的处理*/
setFocusable(true); 设置GamePanel成为控件焦点
requestFocus(); 请求获取焦点
游戏线程的创建:
addNotify(); 方法在JFrame加载了GamePanel后执行 因为方便开始游戏线程 所以重写了该方法 该方法一定要先执行super.addNotify 父类方法 然后在执行游戏线程等
双缓冲:
private BufferedImage image; // 后备缓冲【back-buffer 是一个与屏幕大小一样的虚拟屏幕】 与屏幕 互相切换 平滑的实现游戏中动态效果
private Graphics2D g; // 游戏画刷 用于把图像画到image中
gameRender(); // 渲染到后备缓冲 【具体细节参照实现】
gameDraw(); // 将后备缓冲绘制到屏幕上 【具体细节参照实现】
计算fps:
一般游戏为30fps
startTime = System.nanoTime(); 获取当前时间【单位纳秒】
URDTime = (System.nanoTime - startTime) / 1000000; 求出 当前循环中的游戏逻辑使用时间【单位微秒】
waitTime = targetTime - URDTimeMillis; 求出fps【单位微秒】
import javax.swing.*;import java.awt.*;import java.awt.image.*;public class GamePanel extends JPanel implements Runnable {private static final int WIDTH = 400;private static final int HEIGHT = 400;private Thread thread;private boolean running;private BufferedImage image;// game canvasprivate Graphics2D g; // game paint brushprivate int FPS = 30;private double averageFPS;public GamePanel() {setPreferredSize(new Dimension(WIDTH, HEIGHT));setFocusable(true);requestFocus();}// FUNCTIONSpublic void addNotify() {super.addNotify();if (thread == null) {thread = new Thread(this);thread.start();}// other game thread stuff}private void gameStart() {running = true;}public void run() {gameStart();image = new BufferedImage (WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);g = (Graphics2D) image.getGraphics();long startTime;long URDTimeMillis;long waitTime;long totalTime = 0;int frameCount = 0;int maxFrameCount = 30;long targetTime = 1000 / FPS;// GAME LOOPwhile (running) {startTime = System.nanoTime();gameUpdate();gameRender();gameDraw();URDTimeMillis = (System.nanoTime() - startTime) / 1000000;waitTime = targetTime - URDTimeMillis;try {Thread.sleep(waitTime);}catch (Exception e) { } totalTime += System.nanoTime() - startTime;frameCount++;if (frameCount == maxFrameCount) {averageFPS = 1000.0 / ((totalTime / frameCount) / 1000000);frameCount = 0;totalTime = 0;}}}private void gameUpdate() {}private void gameRender() {// draw to screen image firstg.setColor(Color.WHITE);g.fillRect(0, 0, WIDTH, HEIGHT);g.setColor(Color.BLACK);g.drawString("FPS: " + averageFPS, WIDTH / 2, HEIGHT / 2);}private void gameDraw() {// draw to game screen image secondGraphics g2 = this.getGraphics();g2.drawImage(image, 0 , 0, null);g2.dispose();}}
0 0
- [Java 游戏编程]游戏框架预览
- Flash游戏编程框架
- DirectX 游戏编程之游戏框架
- 游戏编程的框架初探
- 01-windows游戏编程-框架
- Java游戏编程初步
- Java游戏编程
- Java游戏编程初步
- JAVA游戏编程01
- Java编程扑克游戏
- java游戏编程初步
- Java游戏编程---Java 线程
- Android游戏编程——View游戏框架
- 游戏框架
- 游戏框架
- 游戏框架
- java游戏编程(1)线程
- Java游戏编程读书笔记(2)
- linux内核编译时出现的错误
- 文件读写操作
- STL 之输出迭代器
- Android 面试有感
- Mac Store 证书签名大清理及证书生成过程
- [Java 游戏编程]游戏框架预览
- UVA 10905 Children's Game
- Hive集成Mysql作为元数据
- linux c/c++调用系统自带的动态函数
- 代理模式 Proxy (结构型)
- ubuntu12安装后语言和软件源设置(二)
- Eclipse 自动补全 import
- hdu 2036 改革春风吹满(求多边形面积)
- svn中编辑log message