画动画的小问题

java15875726506 2009-03-02 11:06:22
我是刚学java不久的,有个问题一直搞不懂,怎样去画动画,我知道用线程定时去调用那个绘画方法进行重绘,但怎样搞才能使每次重画出来的图象都不同,而形成动画呢?我用repaint方法进行重绘,但每次重绘出来的都是没变的,一直很郁闷,不知怎样搞啊,谁能教教我啊,最好给个例子详细的介绍下,谢谢
...全文
99 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
幸运小嘎嘎 2009-03-03
  • 打赏
  • 举报
回复
太複雜了,不懂
kukufly 2009-03-03
  • 打赏
  • 举报
回复
帮顶啊 呵呵……
weizhaozhe 2009-03-03
  • 打赏
  • 举报
回复
这是Tank的draw方法:(没有双缓冲,有点闪)

public void draw(Graphics g) {
Color oldC = g.getColor();
if (this.isGood()) {
blood.draw(g);
g.setColor(Color.BLUE);
} else {
g.setColor(Color.GRAY);
}
g.fillOval(x, y, TANK_WIDTH, TANK_HEIGHT);
g.setColor(oldC);
// 画炮筒
switch (gunDir) {
case U:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH
/ 2, y);
break;
case LU:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x, y);
break;
case RU:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH,
y);
break;
case D:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH
/ 2, y + TANK_HEIGHT);
break;
case LD:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x, y
+ TANK_HEIGHT);
break;
case RD:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH,
y + TANK_HEIGHT);
break;
case L:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x, y
+ TANK_HEIGHT / 2);
break;
case R:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH,
y + TANK_HEIGHT / 2);
break;
case STOP:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH
/ 2, y + TANK_HEIGHT);
break;
default:
break;
}
for (int i = 0; i < missiles.size(); i++) {
Missile m = missiles.get(i);
if (m != null && m.getLive()) {
m.draw(g);
} else {
missiles.remove(i);
}

for (int j = 0; j < explodes.size(); j++) {
Explode e = explodes.get(j);
if (e != null && e.isLive()) {
e.draw(g);
} else {
explodes.remove(j);
}
}
}
move();
}

tiantianzzz 2009-03-03
  • 打赏
  • 举报
回复

package test;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;

import javax.swing.JFrame;
import javax.swing.JPanel;

class TestPanel extends JPanel{

private int x = 100;

public TestPanel() {
new Thread(){
public void run() {
try {
//循环改变x的值
while (true) {
Thread.sleep(100);
x++;
repaint();
}
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}.start();
}

//重写此方法,第一次生成该JPanel以及每次调用repaint()的时候会调用此方法
public void paintComponent(Graphics g) {
super.paintComponent(g);

Stroke stroke = new BasicStroke(2.0f);
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(stroke);

// 绘制(x,100)到(x,200)的线段
g2.drawLine(x, 100, x,200);
}
}

public class Test extends JFrame {
public static void main(String[] args) {
JFrame main = new Test();

JPanel panel = new TestPanel();

main.setContentPane(panel);
main.setSize(400,300);
main.setVisible(true);
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}



weizhaozhe 2009-03-03
  • 打赏
  • 举报
回复
我的资源下面有一个java编游戏,源码的每个类都有draw方法,一看就知道了。

原理就是:
repaint ---> update ---->paint
我重写了paint()方法就可以了
uastation 2009-03-02
  • 打赏
  • 举报
回复
1楼朋友正解啊..是用坐标一个一个点的描出来的.坐标用一个两维数组来表示.楼主想要例子的话,建议楼主做下坦克大战..
下面有视频下载地址:
http://www.verycd.com/topics/93279/
java15875726506 2009-03-02
  • 打赏
  • 举报
回复
调整坐标?怎样调,不会是写几十个坐标出来,然后一个一个调用吧?能详细点吗?我刚学没多久,很多都不是很了解呢
tiantianzzz 2009-03-02
  • 打赏
  • 举报
回复
很少用java2D画东西...

不过你要想让东西动起来,得不停的改变他的坐标才行嘛...

只是repaint有啥用呢?

最好是写一个循环来调整坐标~ 注意 跑出边界就看不到了 - -

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧