a2370889_com 2016-12-26 08:55 采纳率: 33.3%
浏览 1632
已结题

Java贪吃蛇图形绘制问题

*

这里是控制蛇移动的代码

``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判定之后马上就调用。而是在判定游戏结束(蛇头位置大于容器边界)之后一直调用。

  • 写回答

1条回答

  • zqbnqsdsmd 2016-12-31 02:29
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大