java2d游戏代码_JAVA游戏编程学习笔记(三)Java 2D游戏底层绘图框架
前二篇记录了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游戏底层绘图框架相关推荐
- 2021-11-16派森编程学习笔记“上帝视角下的游戏操盘手” 通过类的继承学会了复用代码,减少代码冗余,提高编程效率。
派森编程学习笔记"上帝视角下的游戏操盘手" [自学笔记] 继承 在Python中继承是指:在类的基础上,它可以实现现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩 ...
- Java基础学习笔记三 Java基础语法
Scanner类 Scanner类属于引用数据类型,先了解下引用数据类型. 引用数据类型的使用 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有一个相对固定的步骤或格式. 数据类型 变量名 ...
- Cocos2d-x学习笔记三之飞机游戏详解之GameOver类的讲解
游戏下载链接:http://download.csdn.net/detail/a402813378/6275427 这个Demo的最后一篇,是制作GameOver窗口,这个窗口是游戏结束的窗口,讲完这 ...
- cocos2dx掼蛋_cocos2dx游戏开发——微信打飞机学习笔记(二)——游戏框架
一.游戏的基本框架: WelcomeScene --> GameScene --> GameOverScene || ...
- python中的pygame弹球游戏代码_【pygame系列 第三课 弹球游戏-上 】
python我们可以做文字版的游戏,比如猜数字游戏,21点游戏.那python可以做图形界面的游戏吗?偷偷告诉你,用pygame库就可以实现了.pygame是python中专门用来编写游戏的一个引擎库 ...
- python socket服务器_python网络编程学习笔记(三):socket网络服务器
1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较.步骤 TCP客户端 TCP服务器 第一步 建立socket对象 建立socket对象 ...
- Python计算机视觉编程学习笔记 三 图像到图像的映射
图像到图像的映射 (一)单应性变换 1.2 仿射变换 (二)图像扭曲 2.1 图像中的图像 2.2 图像配准 (三)创建全景图 3.1 RANSAC 3.2 拼接图像 (一)单应性变换 单应性变换是将 ...
- Linux 网络编程学习笔记——三、TCP 协议详解
目录 一.TCP 服务的特点 传输层协议主要有 TCP 协议和 UDP 协议,前者相对于后者的特点是:面向连接.字节流和可靠传输. 使用 TCP 协议通信的双方必须先建立连接,然后才能开始数据的读写. ...
- java日期类型_Java 学习笔记 (三) Java 日期类型
以下内容摘自: https://www.cnblogs.com/crazylqy/p/4172324.html import java.sql.Timestamp; import java.text ...
- ibatis学习笔记(三)java实体跟表映射.xml文件详解
在项目中使用Ibatis难免会使用到java实体跟表映射.xml. <?xml version="1.0" encoding="UTF-8" ?> ...
最新文章
- ICCV 2021| GRF: 用于三维表征和渲染的通用神经辐射场(已开源)
- JAVA框架之Hibernate【配置文件详解】
- 并发编程-11线程安全策略之线程封闭
- 软件调试学习笔记(二)—— 调试事件的采集
- VTK:可视化之DisplayQuadricSurfaces
- SonarQube6.2源码解析(三)
- [转载] Java中的命名参数
- Java实现一个简单的加密解密方法
- 应用HTK搭建语音拨号系统2:创建单音素HMM模型
- angular页面打印局部功能实现方法思考
- 关于file_get_contents(php://input)
- [luogu3505][bzoj2088][POI2010]TEL-Teleportation【分层图】
- 如何拍出来好看的Vlog,必备小技能(六)?
- System.out.println()的使用
- 【C++】RAll,裸指针,弃用auto_ptr原因
- 简单聊一聊中国的房地产
- 自定义Drawable:实现文字生成图片
- 58到家,或将到不了家
- 转这个作为第一篇,换种模式记录即将开始的新生活
- 西门子服务器接地维修,西门子系统电源维修方法和解决方案
热门文章
- x730服务器发布网站,仙居X730公路:山水仙居 美丽仙径
- 安徽计算机水平模拟考试系统准考证号--2019
- 编程题-贿赂囚犯(Bribe the prisoners)-动态规划|剪枝
- 我本将心向明月,奈何明月照沟渠_百度百科
- 哈工大:ChatGPT调研报告
- 平摊分析(Amortized Analysis)-- Potential Method
- 小明走格子 (10 分)(Java)
- Python数据可视化 Matplotlib详解(一) —— 折线图与时序数据绘制
- C语言二值图的腐蚀膨胀及开闭运算
- 校园网搭建设计与规划