怎么用双缓冲解决java中关于Applet程序让图片动起来后如何解决屏闪

 我来答
yb498869020
2012-12-27
知道答主
回答量:5
采纳率:0%
帮助的人:8.4万
展开全部
package yb_8_115;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class JSG extends Frame {
// 定义游戏关数0代表开始1代表第一关。。。
int state = 0;
// 定义全局变量用于拿到图片系统路径
// 得到默认工具包
Toolkit tk = Toolkit.getDefaultToolkit();
// 通过工具包拿到图片
Image start = tk.getImage(
// 拿路径
JSG.class.getResource("/image/start.png"));
Image bj2 = tk.getImage(JSG.class.getResource("/image/bj_2.png"));
Image dyg = tk.getImage(JSG.class.getResource("/image/lesson_1.png"));
Image heart = tk.getImage(JSG.class.getResource("/image/heart.png"));
Image songshu = tk.getImage(JSG.class.getResource("/image/songshu.png"));

public void init() {
new MusicFor("/music/tsg.mp3").musicplay();
new myThread().start();// 启动线程

this.setSize(800, 600);
// 窗口大小
this.setVisible(true);
// 可见性
this.setLocationRelativeTo(null);
// 居中
this.setResizable(false);
// 禁用最大化
this.setTitle("松鼠快跑");
// 标题设置
this.addWindowListener(new WindowAdapter() {

@Override public void windowClosing(WindowEvent e) {
System.exit(0);
// 退出系统
}

});

this.addKeyListener(new KeyAdapter() {

@Override
public void keyPressed(KeyEvent e) {
// e.getKeyCode获得键盘的按键 KeyEvent.VK_ENTER java定义的回车标识符
if (state == 0 && e.getKeyCode() == KeyEvent.VK_ENTER) {
state = 1;

}
}
});
}
@Override public void paint(Graphics g) {
if (state == 0) {
System.out.println("开始");// 打印开始界面
g.drawImage(start, 0, 0, getWidth(), getHeight(), this);

} else if (state == 1) {
System.out.println("第一关");// 打印第一关背景
g.drawImage(bj2, 0, 0, getWidth(), getHeight(), this);
g.drawImage(dyg, 328, 20, 145,51 , this);
g.drawImage(heart, 50, 520, 40,40 , this);
g.drawImage(heart, 90, 520, 40,40 , this);
g.drawImage(heart, 130, 520, 40,40 , this);
g.drawImage(songshu, 400, 450, 98,119 , this);
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_S);{
g.

}
}
});
}
}

/**
* @param args
*/
public static void main(String[] args) {
// 实例化一个对象mainframe对象
JSG jsg = new JSG();
jsg.init();

}
class myThread extends Thread {
public void run() {
while (true) {
repaint();// 重绘方法 ,这个方法会自动调用paint方法

}
}
}
// 双缓冲技术
@Override
public void update(Graphics g) {
//创建和窗体一样大小的图片
Image temp=createImage(getWidth(),getHeight());
//拿到缓冲图片的画笔
Graphics gh=temp.getGraphics();
//将图片加入窗体
print(gh);
//吧缓冲区的图片画到窗体上
g.drawImage(temp, 0, 0, this);
}
}

//其实很简单就是把缓冲区的图片画到窗体的最上面
rainysky251
2009-05-07 · 超过11用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:0
展开全部
提问的有点绕吖。。呵呵。。

我没有用JAVA做过。。
给你点建议希望对你有帮助。

仅仅是动起来以后的屏闪,可能不是双缓冲的问题。。试着对窗体默认的刷新背景的消息进行响应,当中什么都不用做,让窗体默认的绘图前刷一遍背景的机制失效。

如果是因为贴图的次数太多了的话就用双缓存,双缓存的思路是在每一帧的图片绘制当中,把要贴的图片一张一张的先贴到内存CD上(不是设备DC)然后一次性的把内存DC的内容复制到设备DC里。。不会在设备DC里头反复的贴图就可以避免闪屏

还有会不会是帧数太高了。。一般游戏的话60帧是适合的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式