准备学习java2游戏编程。(其实这是一本书啦)
然后作为基础的基础的基础,必须学习如何让键盘与界面进行交互。下面就是对一个基础得不能再基础的applet程序。
虽然这是个小程序,但其中关于双缓冲概念的介绍是很重要的,要深入理解。(高级噢)
首先先看代码:
package bear.game.keyevent; import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class Game extends Applet implements KeyListener{ private Image bufImage = null; Graphics bufG = null; @Override public void paint(Graphics g) { setBackground(backColor); g.fillRect(r.x, r.y, r.width, r.height); } @Override public void update(Graphics g) { bufImage = createImage(getSize().width, getSize().height); bufG = bufImage.getGraphics(); paint(bufG); g.drawImage(bufImage, 0, 0, null); } private static final long serialVersionUID = 1L; private Rectangle r; private Color backColor; public void init() { r = new Rectangle(0, 0, 20, 10); backColor = Color.WHITE; addKeyListener(this); } @Override public void keyPressed(KeyEvent e) { int kc = e.getKeyCode(); if(kc == KeyEvent.VK_LEFT) { r.x -= 5; if(r.x < 0) r.x = 0; repaint(); } else if(kc == KeyEvent.VK_RIGHT) { r.x += 5; if(r.x > getSize().width - r.width) r.x = getSize().width - r.width; repaint(); } else if(kc == KeyEvent.VK_UP) { r.y -= 5; if(r.y < 0) r.y = 0; repaint(); } else if(kc == KeyEvent.VK_DOWN) { r.y += 5; if(r.y > getSize().height - r.height) r.y = getSize().height - r.height; repaint(); } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub char kc = e.getKeyChar(); switch(kc) { case 'r': { backColor = Color.RED; repaint(); break; } case 'g': { backColor = Color.GREEN; repaint(); break; } case 'b': { backColor = Color.BLUE; repaint(); break; } case 'w': { backColor = Color.WHITE; repaint(); break; } } } }
程序比较简单明了,该类继承于Applet并且实现了KeyListener接口。
其成员变量主要包括:一个由我们控制的Rectangle,一个Image和一个Graphics用来实现双缓冲。
我们在init()中将Rectangle初始化,在keyPressed中处理键盘移动事件,在keyTyped中处理键盘修改颜色的事件。
下面重点看的是双缓冲的实现(位于update重载函数中),代码如下:
@Override public void update(Graphics g) { bufImage = createImage(getSize().width, getSize().height); bufG = bufImage.getGraphics(); paint(bufG); g.drawImage(bufImage, 0, 0, null); }
比方说看动漫的时候,一般一个星期才出一次。所以感觉不是很给力。所以我们可以等它出了很多集之后再一次看完。(好拙的比方)
所以说,双缓冲就是在内存空间中先画好图像,再一次性显示到屏幕上,这与之前先用背景色覆盖,然后再重绘是不同的。
那么为什么之前不重载update会闪烁呢?回答这个问题之前要对awt的重绘的过程有一定的了解。
在awt中对于窗体画布的重绘其条用顺序是repaint() --> update() --> paint()。
所以我们在调用repaint()的时候要进行update,然后呢,我们来看一看update()的源码。(这里指的是super.update)
/** * Updates the container. This forwards the update to any lightweight * components that are children of this container. If this method is * reimplemented, super.update(g) should be called so that lightweight * components are properly rendered. If a child component is entirely * clipped by the current clipping setting in g, update() will not be * forwarded to that child. * * @param g the specified Graphics window * @see Component#update(Graphics) */ public void update(Graphics g){ if(isShowing()) { if(!(peer instanceof LightweightPeer)){ g.clearRect(0, 0, width, height); } paint(g); } }
可以看出super.update()有一个清屏的作用:g.clearRect方法。之后重绘,然后就会出现闪烁。
所以我们利用双缓冲技术可以减缓闪烁的效果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
好心协助。我正在准备Java7Programmer1考试,在一次enthuware测试中遇到了这个问题。 考虑以下方法: 和下面的代码片段: 它会印什么? 结尾问题 根据运算符优先级的规则,我首先计算++s,得到s的值6,然后在mx方法中使用6得到值8。接下来我加了6+8+6=20。最后以s=6+20=26进行赋值操作。
本文向大家介绍Android采用双缓冲技术实现画板,包括了Android采用双缓冲技术实现画板的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现画板的具体代码,采用的技术是双缓冲技术,供大家参考,具体内容如下 1.双缓冲技术的概念 所谓的双缓冲技术其实很简单,当程序需要在指定的View上进行绘制时,程序并不需要直接绘制到该View组件,而是先绘制到一个内存中的Bitm
本文向大家介绍双缓冲技术实现Android 画板应用,包括了双缓冲技术实现Android 画板应用的使用技巧和注意事项,需要的朋友参考一下 什么是双缓冲技术?双缓冲技术就是当用户操作界面完成后,会有一个缓冲区保存用户操作的结果。 为什么要使用双缓冲技术?拿Android 游戏开发来说,界面贞每次都是全部重画的,也就说画了新的,旧的就没了,所以需要使用双缓冲技术保存之前的内容。 如何实现双缓冲?使用
错误:Einstein类中找不到Main方法,请将Main方法定义为:public static void Main(string[]args)或JavaFX应用程序类必须扩展JavaFX.application.application 我怎么才能修好这个?
问题内容: 我有一个applet,可以从特定的文件夹上载一些文件并删除它们,但是当我从javascript代码中调用applet函数时,出现了问题,当我从它调用该函数时,它工作正常。 我的小程序代码: 这是我的JavaScript代码: 当我从javascript调用时,仅打印日志: 请注意,当我从applet方法调用时,它可以正常工作。 我将代码包装到中,但仅前进了一步,然后继续 问题答案: J
问题内容: 我正在研究一个项目,并且在使用Java的双重缓冲方面已经读了尽可能多的内容。我想做的是向我的JFrame添加一个组件或面板或包含要绘制到其上的双缓冲表面的东西。如果可能,我想使用硬件加速,否则请使用常规软件渲染器。到目前为止,我的代码如下所示: 我创建了一个抽象的游戏类和一个调用Update和Draw的游戏循环。现在,如果您看到我的评论,那就是我主要关注的领域。有没有一种方法可以获取图