Java绘制方法调用却未重绘?
天蓬老师
天蓬老师 2017-04-18 10:31:07
0
0
400

*
# 这里是控制蛇移动的代码

public void move_on()
{        
    paint p1=new paint();
    Fruit fruit=new Fruit();
    Snake snake=new Snake();
    Move read=new Move();
    /*
     * 对第一个元素即蛇头进行判断,根据所指方向对x,y坐标进行操作
     * 完毕后重绘界面,达到动态移动效果
     */
    new Thread(new Runnable() {
        
        @Override
        public void run() {
            // TODO 自动生成的方法存根
            while(Snake.life){
                switch (Model.snake.get(0).direction) {
                case 8:
                    Model.snake.get(0).point.y+=General.y_height;
                    p1.repaint();
                    break;
                case 2:
                    Model.snake.get(0).point.y-=General.y_height;
                    break;
                case 4:
                    Model.snake.get(0).point.x-=General.x_width;
                    break;
                case 6:
                    Model.snake.get(0).point.x+=General.x_width;
                    break;
                default:
                    break;
                }
                System.err.println(Model.snake.get(0).point.x+" "+Model.snake.get(0).point.y);
                //调用绘制方法进行重绘
                
                SwingUtilities.invokeLater(new Runnable() {
                
                    @Override
                    public    void run() {
                        // TODO 自动生成的方法存根
                        p1.repaint();
                        
                        //对蛇体进行移动操作,即每一个节点都到了前一个节点的位置上
                        for(int i=1;i<Model.snake.size();i++)
                        {
                            Model.snake.get(i).direction=Model.snake.get(i-1).direction;
                            Model.snake.get(i).point=Model.snake.get(i-1).point;
                        }
                        
                        /*    进行完移动操作之后判断一下是否吃到果子
                         * 如果被吃掉,则把果子的位置和赋值给read,将原头结点的方向赋值给read
                         * 最后将read插入snake头结点
                         */
                        if(fruit.isEaten())
                        {
                            read.point=fruit.location;
                            read.direction=Model.snake.get(0).direction;
                            Model.snake.offerFirst(read);    
                            p1.repaint();
                        }
                        
                    }//end swing_run
                });
                /*
                 * 判断是否撞墙或吃到身体(结束游戏)
                 */
                snake.isAlive();
                try {
                    Thread.sleep(1500);
                } catch (InterruptedException e) {
                    // TODO: handle exception
                }
                move_on();
            }
        }
    }).start();
}//end move_on`

# 这里是绘制蛇和果子的方法

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    System.err.println("调用绘制方法");
    snake_paint.drawSnake(g);
    /*
     * 当蛇长为1(即刚初始化游戏)的时候
     * 或判断果子被吃掉后
     * 才能绘制果子
     */
    if(Snake.Long==1||fruit_paint.isEaten())
    {
        fruit_paint.drawFruit(g);
    }
public void drawSnake(Graphics g)**
{
    super.paintComponent(g);
    Model model=new Model();
    g.setColor(Color.BLACK);
    System.err.println("调用绘制蛇体方法");
    for(Move r:model.snake)
    g.fillRect(r.point.x,r.point.y, General.x_width, General.y_height);
}`
public void drawFruit(Graphics g)
{
    g.setColor(Color.RED);
    g.fillRect(location.x, location.y, General.x_width,General.y_height);
    
}

小弟现在面临的问题是:1.绘制方法调用了,但是面板毫无动静,依然是第一次值的位置。看了一下断点和输出,值是传给了绘制方法的。
是不是界面刷新问题?在move_on方法里面新建了一个线程,不知道用对没。

2.有时候值会大于定下的边界(y=700),而继续增加一点,比如到了750才停下,是不是线程冲突的问题?

3.,除了第一次调用绘制方法的时间正确以外,其他的时间都不对,不是每一个switch判定之后马上就调用。而是在判定游戏结束(蛇头位置大于容器边界)之后一直调用。

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

모든 응답(0)
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿