java swing 方格地图界面

qsuron 发布于 2014-02-21 Java 22 次阅读 无~ 311 字 预计阅读时间: 1 分钟


使用java swing来模拟游戏中方格地图的效果

----------------------------------------------------------------
MainJFrame类
----------------------------------------------------------------
package com.qsuron.map;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

import com.qsuron.Ribbon;

public class MainJFrame extends JFrame implements Runnable{


	private static final long serialVersionUID = 5753479529328043063L;
	private static final int FPS = 1000;					//FPS
	private static final int FRAME_X = 860;				//窗口宽度
	private static final int FRAME_Y = 370;				//窗口高度
	private static final int PIC_SIZE = 71;				//地图格子大小
	private long t1, t2, dt, sleepTime;					//画面刷新FPS计时用
	private long period = 1000 / FPS;					//画面刷新FPS计时用

	public Ribbon ribbon = null;
	private Container contentPanel;
	private BufferedImage[] bim = {null,null,null,null,null,null,null,null,null,null};
	public Image offScreenImage = null;					//缓冲图像
	private int[][] arr = {
			{0,0,7,8,8,9,0,0,0,0,0,0},
			{0,0,1,2,2,3,0,0,0,0,0,0},
			{0,0,0,0,0,0,0,0,0,0,0,0},
			{9,0,0,0,0,0,0,0,7,8,8,9},
			{5,8,9,0,0,7,8,8,5,5,5,6},
	};
	private static final int PIC_X = 12;
	private static final int PIC_Y = 5;


	//界面初始化
	private void jframeInit(){
		this.setTitle("Swing 游戏学习1");
		this.setSize(FRAME_X,FRAME_Y);
		this.setLocation(200,100);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		contentPanel = this.getContentPane();
		contentPanel.setLayout(null);
		this.setVisible(true);
		this.gameInit();
		Thread gameThread = new Thread(this);
		gameThread.start();
	}

	//游戏初始化
	private void gameInit() {
		try {
			for(int i=1;i<10;i++){
				bim[i] = new BufferedImage(PIC_SIZE,PIC_SIZE,BufferedImage.TYPE_INT_BGR);
				bim[i] = ImageIO.read(getClass().getResource(i+".png"));
			}
		} catch (IOException e) {e.printStackTrace();}

	}

	//游戏进程更新
	private void gameUpdate() {
	}

	//游戏界面刷新
	@Override
	public void run() {
		t1 = System.nanoTime();
		while(true){
			gameUpdate();
			repaint();
			t2 = System.nanoTime();
			dt = (t2 - t1) / 1000000L;
			sleepTime = period - dt;
			if(sleepTime <= 0){
				sleepTime = 2;
			}
			try {
				Thread.sleep(sleepTime);
			} catch (InterruptedException e) {e.printStackTrace();}
			t1 = System.nanoTime();
		}
	}

	public static void main(String[] args){
		MainJFrame mjf = new MainJFrame();
		mjf.jframeInit();
	}

	@Override
	public void paint(Graphics g) {
		Color c = g.getColor();
		for(int i=0;i<_PIC_Y;i++){
			for(int j=0;j<_PIC_X;j++){
				int num = arr[i][j];
				//System.out.print(num+"|");
				if(num==0 || bim[num]==null){
					continue;
				}
				g.drawImage(bim[num], j*PIC_SIZE, i*PIC_SIZE, (j+1)*PIC_SIZE, (i+1)*PIC_SIZE, 0, 0, PIC_SIZE, PIC_SIZE, null);
			}
			//System.out.println("");
		}
		g.setColor(c);
	}

	@Override
	public void update(Graphics g) {
		if(offScreenImage==null){
			offScreenImage = this.createImage(FRAME_X,FRAME_Y);
		}
		Graphics goff = offScreenImage.getGraphics();
		paint(goff);
		g.drawImage(offScreenImage,0,0,null);
	}


}