java2d游戏代码_JAVA游戏编程学习笔记(三)Java2D游戏
底层绘图框架
前⼆篇记录了java如何绘制图形与动画,今天打算总结复习⼀下,把这些知识点集合起来,制作⼀个Java2D⼩游戏框架(暂且这么叫,好像挺⽜逼似的!)。
Java AWT 下边提供⼀个 class
Canvas
这是⼀个现成的画布,我们可以继承它来实现底层的绘制框架,为什么不直接继承JFrame?之前只是⼀些绘图测试,⽅便建⽴场景绘制图形,以后我们的游戏画布需要放到GUI容器⾥,所以继承⼀个类似panel的组件⽐较好些。
好了,底层的绘制框架实现起来很简单,代码如下:
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.Image;
/**
* 基于Java AWT Canvas 创建的游戏画布框架 ⽤来绘制整个游戏的画布。
*
* @author J_sky
* @version 1.0.0 2015-11-04
*/
public class MyGameCanvas extends Canvas {
/**
* 双缓冲的画布
*/
Image iBuffer;
/**
* 双缓冲的画笔
*/
Graphics gBuffer;
/**
* 构造器 初始化画板
*
*/
public MyGameCanvas() {
new PaintThread().start();
}
* 定义⼀个重绘窗⼝的线程类,是⼀个内部类。 通过线程中的循环来控制动画的间隔时间。
*/
class PaintThread extends Thread {
@Override
public void run() {
while (true) {
try {
repaint();//重绘画布
Thread.sleep(30);//间隔时间
} catch (InterruptedException ex) {
System.out.println(ex);
}
}
}
}
/**
* 绘图⽅法,继承后可以重写这个⽅法来绘制场景及游戏元素,就可以不⽤。 我们制作游戏动画绘制场景主要是利⽤这个⽅法来实现。* 可以避免过于重写继承来的⽅法。也为后继加⼊双缓冲做准备。
*
* @param src
*/
public void draw(Graphics g) {
}
/**
* 重写这个⽅法并加⼊了双缓冲!
*
* @param g
*/
@Override
public void paint(Graphics g) {
if (iBuffer == null) {
iBuffer = Size().width, Size().height);
gBuffer = Graphics();
gBuffer.setColor(getBackground());
gBuffer.fillRect(0, 0, Size().width, Size().height);
draw(gBuffer);
g.drawImage(iBuffer, 0, 0, this);
}
/**
* 双缓冲重写
*
* @param g
*/
@Override
public void update(Graphics g) {
paint(g);
}
}
这段代码我已经实现了双缓冲,关于JAVA 双缓冲不明⽩的,可以百度了解⼀下,这⾥不再重复。我们只要记得draw()这⽅法,以后绘图都是在这⾥啦!
其实双缓冲JPane组件已经实现,那么我们继承JPane这个组件来实现框架试试,代码如下:
package mygameframe;
import java.awt.Graphics;
import javax.swing.JPanel;
/**
* 基于swing.JPanel创建的游戏画布框架 ⽤来绘制整个游戏的画布。
*
* @author J_sky
* @version 1.0.0 2015-11-06 bosichong@qq
*/
public class MyGameJpane extends JPanel {
/**
* 构造器 初始化画板
*
*/
public MyGameJpane() {
new PaintThread().start();//启动线程刷新。
}
/**
* 定义⼀个重绘窗⼝的线程类,是⼀个内部类。 通过线程中的循环来控制动画的间隔时间。
*/
class PaintThread extends Thread {
@Override
public void run() {
while (true) {
try {
repaint();//重绘画布
Thread.sleep(30);//间隔时间
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
}
/**
* 绘图⽅法,继承后可以重写这个⽅法来绘制场景及游戏元素,就可以不⽤。 我们制作游戏动画绘制场景主要是利⽤这个⽅法来实现。* 可以避免过于重写继承来的⽅法。也为后继加⼊双缓冲做准备。
*
* @param src
*/
public void draw(Graphics g) {
}
/**
* JPanel 双缓冲绘图的⽅法是paintComponent() 我们重写实现绘图。
*
* @param g
*/
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.\
draw(g);
}
/**
* 重写update()也是双缓冲的必须。
*
* @param g
*/
@Override
public void update(Graphics g) {
super.update(g); //To change body of generated methods, choose Tools | Templates. paintComponent(g);//双缓冲绘制
}
}
相对之前的框架代码量要少些,我们来测试⼀下:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import mygameframe.MyGameJpane;
/**
* Java2D游戏框架测试
*
* @author J_sky
* @version 1.0.0 2015-11-06 bosichong@qq
*/
public class GameTest03 extends MyGameJpane {
int x = 50;
canvas动画int y = 50;
int width = 100;
int height = 100;
//动画变化转折点
boolean isW = true;
boolean isH = true;
/**
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论