[学习笔记]小型java游戏引擎_1

原创 2014年03月31日 20:34:44

https://www.youtube.com/playlist?list=ELp5mgUw5g9EY      上的教学视频学习笔记

主要难点:

1.如何用线程 和 循环 控制游戏的 开始,停止状态

2.如何用循环解决 游戏画面 帧数的渲染和控制

3.一些图形图像,缓冲的类

Image, BufferedImage, BufferStrategy, Canvas



代码如下:

package com.main;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.util.Random;
import javax.swing.JFrame;

public class Game extends Canvas implements Runnable
{
	public JFrame jframe;
	public final int WIDTH = 400;  //界面宽度
	public final int HEIGHT = 300; //界面高度
	public final int SCALE = 2;    //缩放比例
	public boolean GAME_RUNNING_STATE = false;  //游戏运行状态
	
	public int tick_count = 0;  //统计已经运行过的总帧数  
	private BufferedImage buf_img = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); //游戏界面的缓冲区? 
	private int[] pixels = ( (DataBufferInt)buf_img.getRaster().getDataBuffer() ).getData(); //游戏界面的所有像素?
	
	public Game()
	{
		jframe = new JFrame();
		setMaximumSize(new Dimension( WIDTH*SCALE, HEIGHT*SCALE ));
		setMinimumSize(new Dimension( WIDTH,HEIGHT) );
		setPreferredSize(new Dimension(WIDTH, HEIGHT));
		
		jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jframe.setResizable(false);
		jframe.setVisible(true);
		jframe.setLocationRelativeTo(null);
		
		//布局管理器
		jframe.setLayout( new BorderLayout() );
		jframe.add(this,BorderLayout.CENTER);  //把游戏界面放进这个jrame里面的borderLayout里面
		jframe.pack();
		
			
	}
	
	private synchronized void start()
	{
		//启动游戏线程
		new Thread(this).start();   //即调用run()函数
		GAME_RUNNING_STATE = true;
	}
	
	private synchronized void stop()
	{
		GAME_RUNNING_STATE = false;
	}
	
	
	public void run() 
	{
		long old_time_ns = System.nanoTime();  //运行进入到本函数的时间(纳秒级别) 1秒 = 1000 000 000 纳秒(ns)
		long old_time_ms = System.currentTimeMillis(); //毫秒级别
		double nsPerTick = 1000000000D/60D;  //我们希望游戏   每秒60帧,那么每帧为    1000000000/60 纳秒
		int ticks = 0;   //记录理论上的帧数
		int frames = 0;  //记录实际渲染的帧数
		double ticks_has_gone = 0;   //记录当前已经走了多少帧
		
		//开始循环
		while( GAME_RUNNING_STATE )
		{
			long now_time_ns = System.nanoTime();  //得出当前时间
			ticks_has_gone += (now_time_ns - old_time_ns) / nsPerTick;  // 时间差/每帧所需时间  = 走过的帧数,
			old_time_ns = now_time_ns;  //现在的时间在下一次循环就是旧时间
			boolean shouldRender = false;  //是否进行渲染
			
			//用走过的帧数是否>=1来判断 当前时间是否够一帧
			if( ticks_has_gone >=1 )   //如果 刚好走够一帧
			{
				ticks++;  //加上一帧
				tick();   //每一帧所对应的操作,例如图形渲染等
				ticks_has_gone -= 1;  //清零,继续用ticks_has_gone来记录是否走满一帧
				shouldRender = true;
			}
			
			if(shouldRender)
			{
				render();//渲染
				frames++;
			}
			
			if( System.currentTimeMillis() - old_time_ms >= 1000 )
			{
				//每过一秒 就对运行的帧数 做一次统计
				old_time_ms += 1000;  //更新循环里面的old_timer 供下一次循环使用
				System.out.println( frames + "  " + ticks);
				frames = 0;  //清零
				ticks = 0;  //清零
			}
			
		}
	}
	
	public void tick()
	{
		tick_count++;
		
		for(int i=0; i< pixels.length; i++)
		{
			//更改每一个像素
			//pixels[i] = i + tick_count; //没有特别的颜色意义,只是看看渲染有变化效果
			pixels[i] = i * tick_count; //不懂图形学 不过好象可以在这里做出很多很炫的渲染效果
			//pixels[i] = i * new Random().nextInt();
			
		}
	}
	
	public void render()
	{
		BufferStrategy buf_str = getBufferStrategy();
		if( buf_str == null)
		{
			createBufferStrategy(3);  //三层缓冲
			return;
		}
		
		//渲染
		Graphics g = buf_str.getDrawGraphics();
		g.setColor( Color.blue );
		//g.fillRect(0, 0, getWidth(), getHeight() );
		g.drawImage(buf_img, 0, 0, getWidth(), getHeight(), null );
		g.drawRect(0, 0, getWidth(), getHeight());
		g.dispose();
		buf_str.show();
		
	}
	
	
	public static void main(String[] args) {
		new Game().start();
	}
	
}




java小型web框架

# ankang-report report 是一个开源的访问层框架,基于java平台,依赖于spring,以Mozilla Public License 2.0 协议发布。可用于接口的调试及性能的展...
  • u011534095
  • u011534095
  • 2017年01月05日 10:16
  • 315

小型GCC 编译器

以前只用编译器编译程序,现在学完编译原理这门课以后,通过编译大作业,我对编译器的工作原理有了比较清晰的认识 编译器的工作原理 编译器 (Compiler) 是一种将由一种语言编写的程序转换为另一种...
  • u013445530
  • u013445530
  • 2015年06月28日 15:38
  • 2511

JAVA小型三国杀的制作_1

利用JAVA方面的知识制作
  • tiankong_liang
  • tiankong_liang
  • 2017年02月26日 11:28
  • 94

几个小型数据库的比较

Access,MSDE 2000,Embedded Firebird,SQLite等都是可以免费再分发(free redistributable)的数据库。 相比而言,MSDE 2000 显著缺点是...
  • meimeieee
  • meimeieee
  • 2014年05月08日 00:36
  • 1682

自己写的小型嵌入式操作系统

小型嵌入式操作系统的实现 写一个自己的操作系统是我一直以来的愿望,一来,学习,二来吗,装装X了。。哈哈 进过一段时间的学习,今天我写的代码终于实现了任务切换,也就是多任务环境了,虽然任务本身只是很简单...
  • shixiongtao
  • shixiongtao
  • 2016年11月02日 11:33
  • 628

开发记录_小型自选商场综合管理系统

前言 这是《数据挖掘》课程的作业,虽然叫做数据挖掘,前半学期还是在学数据库的知识。这次大作业算是一次检验吧。其实我觉得,数据库的部分并不多,难到我的都是呈现部分…可能是资历还太浅,总觉得数据库保存数...
  • matrix1437
  • matrix1437
  • 2013年11月17日 00:22
  • 2308

实现一个小型数据库--记一次中级软件设计实作浮沉历程

事件起因:大三狗一枚,专业是软件应用。这学期的中级软件设计实作题目是实现一个小型的数据库,具体的题目要求如下: 建立一个类似Oracle\SQL Server的小型数据库系统: 可建立表,表有字...
  • love_u_u12138
  • love_u_u12138
  • 2015年12月15日 22:13
  • 1707

小型互联网公司的一般架构

好记忆不如烂笔头,再简单的知识,都可能被遗忘,所以能记录下点东西,就记录下来、、、 来说说一般小型的互联网公司的一般架构,欢迎拍砖指正。 1.一般互联网公司的特征: Client ...
  • supingemail
  • supingemail
  • 2016年10月26日 19:54
  • 734

如何构建一个小型的Zoomeye—-从技术细节探讨到实现

0、概述 Zoomeye是个网络空间的搜索引擎,它不同于传统意义上的搜索引擎,而是一种可以搜索网络组件和网络设备的搜索引擎。 这种以各大组件指纹作为识别基础的数据平台,更多的是为了使得安全...
  • fuck51cto
  • fuck51cto
  • 2015年11月10日 09:17
  • 845

第四章(小型对象分配技术:smart-object allocation)

分配原理 block:最小单位,外部指定,一般每个block从4~64byte不等。我们称为blocksize chunk:包含多个block。个数我们称为blocknum。每个chunk大小为blo...
  • hjing1988
  • hjing1988
  • 2015年06月22日 21:46
  • 324
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[学习笔记]小型java游戏引擎_1
举报原因:
原因补充:

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