前二篇记录了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 = createImage(this.getSize().width, this.getSize().height);

gBuffer = iBuffer.getGraphics();

}

gBuffer.setColor(getBackground());

gBuffer.fillRect(0, 0, this.getSize().width, this.getSize().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.com

*/

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.com

*/

public class GameTest03 extends MyGameJpane {

int x = 50;

int y = 50;

int width = 100;

int height = 100;

//动画变化转折点

boolean isW = true;

boolean isH = true;

/**

* 重写这个绘图的方法来绘制场景中的元素

*

* @param g

*/

@Override

public void draw(Graphics g) {

g.setColor(Color.BLACK);

g.fillRect(0, 0, this.getWidth(), this.getHeight());//绘制游戏窗口背景

g.setColor(Color.red);

g.fillOval(x, y, width, height);

move();

}

/**

* 圆形的移动逻辑

*/

private void move() {

//圆形一直下落,知道屏幕底部,就回到顶部重新下落。

if (y

y++;

} else {

y = 0;

}

//缩小方形

if (width > 1 && isW) {

width--;

} else {

isW = false;

}

if (height > 1 && isW) {

height--;

} else {

isH = false;

}

//放大方形

if (width

width++;

} else {

isW = true;

}

if (height

height++;

} else {

isH = true;

}

}

public static void main(String[] args) {

JFrame frame = new JFrame("游戏窗口!");

frame.setVisible(true);

frame.setDefaultCloseOperation(3);

GameTest03 gc = new GameTest03();

gc.setPreferredSize(new Dimension(400, 300));

frame.add(gc);

frame.pack();

}

}

大家可以跑起来看看,至此,我们的Java2D小游戏框架搭建完毕!以后我们要做的就是考虑游戏的逻辑,用面向对象编程的思想来做游戏。我已经搞定一个小游戏,下篇笔记重点推出。

java2d游戏代码_JAVA游戏编程学习笔记(三)Java 2D游戏底层绘图框架相关推荐

  1. 2021-11-16派森编程学习笔记“上帝视角下的游戏操盘手” 通过类的继承学会了复用代码,减少代码冗余,提高编程效率。

    派森编程学习笔记"上帝视角下的游戏操盘手" [自学笔记] 继承 在Python中继承是指:在类的基础上,它可以实现现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩 ...

  2. Java基础学习笔记三 Java基础语法

    Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...

  3. Cocos2d-x学习笔记三之飞机游戏详解之GameOver类的讲解

    游戏下载链接:http://download.csdn.net/detail/a402813378/6275427 这个Demo的最后一篇,是制作GameOver窗口,这个窗口是游戏结束的窗口,讲完这 ...

  4. cocos2dx掼蛋_cocos2dx游戏开发——微信打飞机学习笔记(二)——游戏框架

    一.游戏的基本框架: WelcomeScene    -->    GameScene   -->   GameOverScene ||                           ...

  5. python中的pygame弹球游戏代码_【pygame系列 第三课 弹球游戏-上 】

    python我们可以做文字版的游戏,比如猜数字游戏,21点游戏.那python可以做图形界面的游戏吗?偷偷告诉你,用pygame库就可以实现了.pygame是python中专门用来编写游戏的一个引擎库 ...

  6. python socket服务器_python网络编程学习笔记(三):socket网络服务器

    1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较.步骤 TCP客户端 TCP服务器 第一步 建立socket对象 建立socket对象 ...

  7. Python计算机视觉编程学习笔记 三 图像到图像的映射

    图像到图像的映射 (一)单应性变换 1.2 仿射变换 (二)图像扭曲 2.1 图像中的图像 2.2 图像配准 (三)创建全景图 3.1 RANSAC 3.2 拼接图像 (一)单应性变换 单应性变换是将 ...

  8. Linux 网络编程学习笔记——三、TCP 协议详解

    目录 一.TCP 服务的特点 传输层协议主要有 TCP 协议和 UDP 协议,前者相对于后者的特点是:面向连接.字节流和可靠传输. 使用 TCP 协议通信的双方必须先建立连接,然后才能开始数据的读写. ...

  9. java日期类型_Java 学习笔记 (三) Java 日期类型

    以下内容摘自:  https://www.cnblogs.com/crazylqy/p/4172324.html import java.sql.Timestamp; import java.text ...

  10. ibatis学习笔记(三)java实体跟表映射.xml文件详解

    在项目中使用Ibatis难免会使用到java实体跟表映射.xml. <?xml version="1.0" encoding="UTF-8" ?> ...

最新文章

  1. ICCV 2021| GRF: 用于三维表征和渲染的通用神经辐射场(已开源)
  2. JAVA框架之Hibernate【配置文件详解】
  3. 并发编程-11线程安全策略之线程封闭
  4. 软件调试学习笔记(二)—— 调试事件的采集
  5. VTK:可视化之DisplayQuadricSurfaces
  6. SonarQube6.2源码解析(三)
  7. [转载] Java中的命名参数
  8. Java实现一个简单的加密解密方法
  9. 应用HTK搭建语音拨号系统2:创建单音素HMM模型
  10. angular页面打印局部功能实现方法思考
  11. 关于file_get_contents(php://input)
  12. [luogu3505][bzoj2088][POI2010]TEL-Teleportation【分层图】
  13. 如何拍出来好看的Vlog,必备小技能(六)?
  14. System.out.println()的使用
  15. 【C++】RAll,裸指针,弃用auto_ptr原因
  16. 简单聊一聊中国的房地产
  17. 自定义Drawable:实现文字生成图片
  18. 58到家,或将到不了家
  19. 转这个作为第一篇,换种模式记录即将开始的新生活
  20. 西门子服务器接地维修,西门子系统电源维修方法和解决方案

热门文章

  1. x730服务器发布网站,仙居X730公路:山水仙居 美丽仙径
  2. 安徽计算机水平模拟考试系统准考证号--2019
  3. 编程题-贿赂囚犯(Bribe the prisoners)-动态规划|剪枝
  4. 我本将心向明月,奈何明月照沟渠_百度百科
  5. 哈工大:ChatGPT调研报告
  6. 平摊分析(Amortized Analysis)-- Potential Method
  7. 小明走格子 (10 分)(Java)
  8. Python数据可视化 Matplotlib详解(一) —— 折线图与时序数据绘制
  9. C语言二值图的腐蚀膨胀及开闭运算
  10. 校园网搭建设计与规划