怎么改动画都是闪 是不是我的写的代码有问题啊import java.awt.*;
import java.lang.Math;
import java.applet.*; public class e3 extends Applet implements Runnable
{
int []x=new int[10];
int []y=new int[10];
double []degree=new double[10]; //计算圆形运动轨迹要用到的变量
Thread []planet=new Thread[10];
Graphics []plantcolor=new Graphics[10];
Image offScreenImg; //存放备用屏幕的内容
Graphics offScreenG; //备用屏幕的绘图上下文环境
/***********************************/
public void init()
{
for(int i=0;i<9;i++)
{
x[i]=-1000;
y[i]=-1000;
planet[i]= new Thread(this);
plantcolor[i]=getGraphics();
}
this.setSize(600, 600);
offScreenImg=createImage(600,600);//创建备用屏幕
offScreenG = offScreenImg.getGraphics (); //获取备用屏幕的绘图上下文环境
}
/***************start()2个线程管理2个球的运动********************/
public void start()
{
planet[0].start();
planet[1].start();
}
/****************stop()*******************/
public void stop()
{
// planet[0] = null;
}
/****************paint(Graphics g) *******************/
public void paint(Graphics g)
{
plantcolor[0].drawImage(offScreenImg,0,0,this);
plantcolor[1].drawImage(offScreenImg,0,0,this);
plantcolor[0].fillOval(x[0],y[0], 30, 30);
plantcolor[1].fillOval(x[1],y[1], 30, 30);
}
/****************update(Graphics g) *******************/public void update(Graphics g)
{
if(offScreenImg==null ||offScreenImg.getWidth(null)!=getSize().width ||offScreenImg.getHeight(null)!=getSize().height)
{
offScreenImg=createImage(600,600);
}
// System.out.print(" "); // 如果不注释掉这句. 动画就稍微不会那么闪,为什么呀?paint(plantcolor[0]);
paint(plantcolor[1]);
} /***************run() 圆周运动********************/
public void run()
{
while(true)
{
if(Thread.currentThread()==planet[0]) //第 1 个圆形
{
x[0]=(int)(100*Math.cos(degree[0])+200); //计算轨迹横坐标
y[0]=(int)(60*Math.sin(degree[0])+200); //计算轨迹纵坐标
degree[0]=degree[0]+(Math.PI/100); //计算圆形运动轨迹要用到的变量
try{planet[0].sleep(10);}
catch(InterruptedException E){}
repaint();
}
else if(Thread.currentThread()==planet[1]) //第 2 个圆形
{
x[1]=(int)(70*Math.cos(degree[1])+200);
y[1]=(int)(50*Math.sin(degree[1])+200);
degree[1]=degree[1]+(Math.PI/200);
try{planet[1].sleep(10);}
catch(InterruptedException E){}
repaint();
} } }
}
import java.lang.Math;
import java.applet.*; public class e3 extends Applet implements Runnable
{
int []x=new int[10];
int []y=new int[10];
double []degree=new double[10]; //计算圆形运动轨迹要用到的变量
Thread []planet=new Thread[10];
Graphics []plantcolor=new Graphics[10];
Image offScreenImg; //存放备用屏幕的内容
Graphics offScreenG; //备用屏幕的绘图上下文环境
/***********************************/
public void init()
{
for(int i=0;i<9;i++)
{
x[i]=-1000;
y[i]=-1000;
planet[i]= new Thread(this);
plantcolor[i]=getGraphics();
}
this.setSize(600, 600);
offScreenImg=createImage(600,600);//创建备用屏幕
offScreenG = offScreenImg.getGraphics (); //获取备用屏幕的绘图上下文环境
}
/***************start()2个线程管理2个球的运动********************/
public void start()
{
planet[0].start();
planet[1].start();
}
/****************stop()*******************/
public void stop()
{
// planet[0] = null;
}
/****************paint(Graphics g) *******************/
public void paint(Graphics g)
{
plantcolor[0].drawImage(offScreenImg,0,0,this);
plantcolor[1].drawImage(offScreenImg,0,0,this);
plantcolor[0].fillOval(x[0],y[0], 30, 30);
plantcolor[1].fillOval(x[1],y[1], 30, 30);
}
/****************update(Graphics g) *******************/public void update(Graphics g)
{
if(offScreenImg==null ||offScreenImg.getWidth(null)!=getSize().width ||offScreenImg.getHeight(null)!=getSize().height)
{
offScreenImg=createImage(600,600);
}
// System.out.print(" "); // 如果不注释掉这句. 动画就稍微不会那么闪,为什么呀?paint(plantcolor[0]);
paint(plantcolor[1]);
} /***************run() 圆周运动********************/
public void run()
{
while(true)
{
if(Thread.currentThread()==planet[0]) //第 1 个圆形
{
x[0]=(int)(100*Math.cos(degree[0])+200); //计算轨迹横坐标
y[0]=(int)(60*Math.sin(degree[0])+200); //计算轨迹纵坐标
degree[0]=degree[0]+(Math.PI/100); //计算圆形运动轨迹要用到的变量
try{planet[0].sleep(10);}
catch(InterruptedException E){}
repaint();
}
else if(Thread.currentThread()==planet[1]) //第 2 个圆形
{
x[1]=(int)(70*Math.cos(degree[1])+200);
y[1]=(int)(50*Math.sin(degree[1])+200);
degree[1]=degree[1]+(Math.PI/200);
try{planet[1].sleep(10);}
catch(InterruptedException E){}
repaint();
} } }
}
还是研究点别的吧
打个比方,想想以前那种老式的屏幕电影,前面有块白布,后面有放映机的那种,
您的做法是想起来挺逗的那种:-)
哥们您不是将影片从放映机上投在白布上,
而是......
您准备了N多个画好内容的大白布。在观众的面前不停换您那N多张有内容大白布。
不是一般的累呀!!您说他能不闪吗?
以上只是个人看法。
以你的例子来说,你现在要画二个球的运动,
你的做法是不停的重画整个Applet。
下面是我随便改了改的东西。
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/package javabean;import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
class Area extends javax.swing.JComponent{
java.awt.Image offScreenImg=createImage(600,600);; //存放备用屏幕的内容
int []x=new int[10];
int []y=new int[10];
double []degree=new double[10];
public Area() {
for(int i=0;i <9;i++)
{
x[i]=-1000;
y[i]=-1000;
}
//setOpaque(true);
}public void paint(Graphics g) {
//if (isOpaque()) {
//g.setColor(getBackground());
//g.fillRect(getX(), getY(), getWidth(), getHeight());
//}
x[0]=(int)(100*Math.cos(degree[0])+200); //计算轨迹横坐标
y[0]=(int)(60*Math.sin(degree[0])+200); //计算轨迹纵坐标
degree[0]=degree[0]+(Math.PI/100); //计算圆形运动轨迹要用到的变量
//try{planet[0].sleep(10);}
//catch(InterruptedException E){}
//repaint();
x[1]=(int)(70*Math.cos(degree[1])+200);
y[1]=(int)(50*Math.sin(degree[1])+200);
degree[1]=degree[1]+(Math.PI/200);
g.drawImage(offScreenImg,0,0,this);
g.drawImage(offScreenImg,0,0,this);
g.fillOval(x[0],y[0], 30, 30);
g.fillOval(x[1],y[1], 30, 30);
}
public void doTask(){
new Thread(){
public void run(){
while (true){
try{
this.sleep(50);
Area.this.repaint();
}catch(Exception e){ }
}
}
}.start();
}
}
public class Test { Area area = new Area();
private void buildUI(Container container) {
container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
container.add(area);
area.setAlignmentX(Component.LEFT_ALIGNMENT);
area.doTask();
} public static void main(String[] args) {
JFrame frame = new JFrame("Test");
frame.setPreferredSize(new Dimension(300,500));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Test controller = new Test();
controller.buildUI(frame.getContentPane());
frame.pack();
frame.setVisible(true);
}}