JAVA游戏编程学习笔记(二)

接上篇笔记,前一节我们在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()方法,这样窗口显示的时候才会开始动画,我们来运行试试:

JAVA游戏编程学习笔记(二)


这个动画截屏有些帧速过大了,所以大家自己跑一下试试。


附源码:

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();
    }
}


你可能感兴趣的:(java,game)