接上篇笔记,前一节我们在Java窗口中画出了图形,这次我们让它动起来。
在场景里的元素有几个属性:比如坐标x y,大小width height。
g.fillRect(150, 150, 100, 100); 当我们画图形的时候,改变他的参数属性值,这个图形的大小及位置就会发生改变,动画包括:元素本身的变化,及位置的变化。若我们把方法里的参数改成变量,然后在不停的重新绘图,就会产生动画了。
我们逐一来实现:
1.重新绘制游戏窗口
这个Java提供重绘窗口的方法:
public void repaint()
重绘此组件。
如果此组件是轻量级组件,则此方法会尽快调用此组件的 paint
方法。否则此方法会尽快调用此组件的 update
方法。
使用后会重新使用paint方法来重新绘制窗口。
2.动画是一个连续的动作,而且很快,所以我们需要一个循环的操作,比如:
while(true){ /** 代码 */ }
我们在循环中改变动画的元素的尺寸坐标,就会产生动画了!
当然要加入一个动画的时差,每个动画片子之间需要有一个时间间隔,不然的话......
Thread.sleep(30);整好满足我们的需求,sleep是一个线程休眠,短短的休眠时间正好满足动画的需求。
我们来试试吧:
继续使用上节的代码,不过我们在class里加入了动画元素的属性:x,y,width,height;
添加一个做动画的方法,在这个方法里,我们初始化了元素的属性,while中进行动画的演变,及条件判断,代码如下:
/** * 动画绘制方法。 */ public void draw() { x = 50; y = 50; width = 100; height = 100; //动画变化转折点 boolean isW = true; boolean isH = true; //不停的循环动画 while (true) { //方形一直下落,知道屏幕底部,就回到顶部重新下落。 if (y < this.getHeight()) { y++; } else { y = 0; } //缩小方形 if (width > 1 && isW) { width--; } else { isW = false; } if (height > 1 && isW) { height--; } else { isH = false; } //放大方形 if (width < 100 && !isW) { width++; } else { isW = true; } if (height < 100 && !isW) { height++; } else { isH = true; } try { Thread.sleep(30); } catch (InterruptedException ex) { System.out.println(ex); } repaint();//重绘窗口 } }
paint()里的绘制图形的方法参数也要修改一下:
@Override public void paint(Graphics g) { g.setColor(Color.BLACK); g.fillRect(0, 0, this.getWidth(), this.getHeight());//设置背景色。 g.setColor(Color.red);//设置画笔的颜色。 g.fillRect(x, y, width, height);//画方形,使用属性变量 }
最后记得在窗口初始化的init()里加上draw()方法,这样窗口显示的时候才会开始动画,我们来运行试试:
这个动画截屏有些帧速过大了,所以大家自己跑一下试试。
附源码:
import java.awt.Color; import java.awt.Graphics; import javax.swing.JFrame; /** * JAVA中的游戏窗口 * * 让图形动起来。 * * @author J_sky */ public class GameTest02 extends JFrame { int x, y, width, height; /** * 空构造器 */ GameTest02() { } /** * 游戏窗口的初始化。 */ void init() { setBounds(100, 100, 400, 300);//设置窗口的大小及位置。 setTitle("GameTest 窗口!");//设置窗口标题 setVisible(true);//显示窗口 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗口退出! draw(); } @Override public void paint(Graphics g) { g.setColor(Color.BLACK); g.fillRect(0, 0, this.getWidth(), this.getHeight());//设置背景色。 g.setColor(Color.red);//设置画笔的颜色。 g.fillRect(x, y, width, height);//画方形//画方形,使用属性变量 } /** * 动画绘制方法。 */ public void draw() { x = 50; y = 50; width = 100; height = 100; //动画变化转折点 boolean isW = true; boolean isH = true; //不停的循环动画 while (true) { //方形一直下落,知道屏幕底部,就回到顶部重新下落。 if (y < this.getHeight()) { y++; } else { y = 0; } //缩小方形 if (width > 1 && isW) { width--; } else { isW = false; } if (height > 1 && isW) { height--; } else { isH = false; } //放大方形 if (width < 100 && !isW) { width++; } else { isW = true; } if (height < 100 && !isW) { height++; } else { isH = true; } try { Thread.sleep(30); } catch (InterruptedException ex) { System.out.println(ex); } repaint();//重绘窗口 } } public static void main(String[] args) { new GameTest02().init(); } }