当前位置: 代码迷 >> J2SE >> 关于小球运动路径有关问题
  详细解决方案

关于小球运动路径有关问题

热度:79   发布时间:2016-04-24 00:56:49.0
关于小球运动路径问题
Java code
package view;import java.awt.Color;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.ArrayList;import java.util.List;public class MainView extends Frame{    private static final long serialVersionUID = 4090565292134499038L;    public static final int ROWS = 3;    public static final int COLS = 3;    public static final int BLOCK_SIZE = 100;    public static int N = 100;    public static int M = 50;    public String str1 = "111221......";  //此处,我准备储存把小球的路径的坐标写成字符串的形式赋给str    public String str2 = "111221......";    Ball ball = null;    Image offScreenImage = null;    List<Point> points = null;    MainView(List<Point> points){        this.points = points;    }    public void launch(){        ball = new Ball(this.points.get(0));        this.setLocation(100,100);        this.setSize(800,600);        this.addWindowListener(new WindowAdapter() {            public void windowClosing(WindowEvent e) {                System.exit(0);            }        });        this.setVisible(true);        new Thread(new WatcherThread(ball,points,this)).start();    }    public static void main(String[] args) {        List<Point> points = new ArrayList<Point>();        points.add(new Point(150,150));//此处的Point 值我想通过读取str中的数据来赋值        points.add(new Point(150,250));//另外就是str中的坐标长度可能不一样,所需的point也就不一样,看看怎么改        points.add(new Point(250,250));        points.add(new Point(250,350));        points.add(new Point(150,350));        points.add(new Point(150,450));                       new MainView(points).launch();    }     public void paint(Graphics g) {        super.paint(g);        g.drawLine(1*N+M,1*N+M,1*N+M,4*N+M);        g.drawLine(2*N+M,1*N+M,2*N+M,4*N+M);        g.drawLine(3*N+M,1*N+M,3*N+M,4*N+M);        g.drawLine(4*N+M,1*N+M,4*N+M,4*N+M);        g.drawLine(1*N+M,1*N+M,4*N+M,1*N+M);        g.drawLine(1*N+M,2*N+M,4*N+M,2*N+M);        g.drawLine(1*N+M,3*N+M,4*N+M,3*N+M);        g.drawLine(1*N+M,4*N+M,4*N+M,4*N+M);        ball.draw(g);    }    @Override    public void update(Graphics g) {// 双缓冲        if (offScreenImage == null) {            offScreenImage = this.createImage(500,500);        }        Graphics gOff = offScreenImage.getGraphics();        paint(gOff);        g.drawImage(offScreenImage, 0, 0, null);    }    private class WatcherThread implements Runnable {        boolean flag = true;        private Ball ball;        private List<Point> points;        private MainView main;        WatcherThread(Ball ball,List<Point> points,MainView main) {            this.ball = ball;            this.points = points;            this.main = main;            this.flag = true;        }                public void run(){            while (flag) {                if (points.size()>=1){                    if (ball.x == points.get(0).x                            && ball.y == points.get(0).y                            && points.size()==1){                        flag = false;                    }else{                        if (ball.x == points.get(0).x&& ball.y == points.get(0).y){// 拿Point.get(0)那个Point.get(1)出来比较,就可以确定方向。                            Direction dir = getDir(points.get(0), points.get(1));                            ball.dir = dir;                            points.remove(0);                        }                    }                }else {                    flag = false;                }                try {                    Thread.sleep(100);                    ball.move();                    main.repaint();                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }        private Direction getDir(Point point, Point point1) {// 线程监听临界状况,在判断方向。            if (point1.x > point.x){                return Direction.RIGHT;            }            else if (point1.y > point.y) {                return Direction.DOWN;            }            else if (point1.y < point.y) {                return Direction.UP;            }            else if (point1.x < point.x){                return Direction.LEFT;            }            return Direction.RIGHT;        }    }}enum Direction {//支持上下左右,你可以扩展的。    UP, LEFT, RIGHT, DOWN;}class Point{    public Point(int x, int y) {        this.x = x;        this.y = y;    }    int x;    int y;}class Ball {    static final int SPEED = 5;    Direction dir;    int x;    int y;    Ball(){        x = 0;        y = 0;        dir = Direction.RIGHT;    }    public Ball(Point point) {        this.x = point.x;        this.y = point.y;    }    public int getX() {        return x;    }    void draw(Graphics g){        Color c = g.getColor();        g.setColor(Color.red);        g.fillOval(x-5, y-5, 10, 10);        g.setColor(c);    }        void move(){        switch(this.dir){        case UP:             this.y = y - SPEED;            break;        case DOWN:            this.y = y + SPEED;            break;        case LEFT:            this.x = x - SPEED;            break;        case RIGHT:            this.x = x + SPEED;            break;        }    }}
  相关解决方案