没意思先生 2015-07-19 10:51 采纳率: 40%
浏览 1582
已结题

明明只建立了一个线程类,为何进行时这么卡,而且没有转头效果

这是GameUtil里的

 public static void addFishes(ArrayList<Fish> Fishes){
        int count=rand.nextInt(6)+5;
        for(int i=0;i<count;i++){
            Fish f=new Fish();
            f.setState(State_Swin);
            f.setLevel(rand.nextInt(11)+1);
            f.setDrawCount(15);
            BufferedImage image=null;
            BufferedImage[] img=new BufferedImage[f.getDrawCount()];
            for(int j=1;j<f.getDrawCount();j++){
                String path="image/"+f.getLevel()+"/"
            +f.getState()+"/"+f.getState()+"_cycle."+j+".png";
                try {
                    image=ImageIO.read(new FileInputStream(path));
                    img[j-1]=image;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            f.setImage(img);
            f.setDrawIndex(0);
            int x=rand.nextInt(800)-f.getWidth();
            int y=rand.nextInt(480)-f.getHeight();
            f.setPoint(new Point(x,y));
            x=rand.nextInt(800)-f.getWidth();
            y=rand.nextInt(480)-f.getHeight();
            f.setTarget(new Point(x,y));
            f.setDirection(GameUtil.getDirectionByPoint(f.getPoint(), f.getTarget()));
            Fishes.add(f);
        }
    }

这是GameJPanel的DrawThread类

 class DrawThread extends Thread{
        public void run(){
            while(true){
                 for(Fish f :fishes){
                     int nowDrawIndex=f.getDrawIndex()+1;
                     if(nowDrawIndex==f.getDrawCount()){
                         if(f.getState().equals(GameUtil.State_Eat))
                             f.setState(GameUtil.State_Swin);
                         if(f.getState().equals(GameUtil.State_Turn))
                             f.setState(GameUtil.State_Swin);
                         nowDrawIndex=0;
                     }
                     f.setDrawIndex(nowDrawIndex);
                    //还需改变每条鱼的point
                        //f.setPoint(new Point(f.getPoint().x,f.getPoint().y-10));
                        //游动到目的地,x,y分别需要移动的距离
                        int dx = f.getTarget().x-f.getPoint().x;
                        int dy = f.getTarget().y-f.getPoint().y;
                        //真实距离
                        double d = Math.sqrt(Math.pow(dx,2)+Math.pow(dy,2));
                        //x,y 相对d 的比率
                        double rateX = dx/d;
                        double rateY = dy/d;
                        //每0.1秒在x,与y轴移动的距离=比率*速度
                        int sx = (int)(rateX * GameUtil.FISH_SPEED);
                        int sy = (int)(rateY * GameUtil.FISH_SPEED);
                        //获取移动后鱼的坐标
                        int newX = f.getPoint().x+sx;
                        int newY = f.getPoint().y+sy;
                        if(Math.abs(f.getTarget().x-newX)<=8){
                            //已经到达了目的地
                            //产生新目的地
                            int x = rand.nextInt(800+f.getWidth())-f.getWidth();
                            int y = rand.nextInt(480+f.getHeight())-f.getHeight();
                            f.setTarget(new Point(x,y));

                            //产生了新目标,又有可能需要转变方向
                            f.setDirection(GameUtil.getDirectionByPoint(new Point(newX,newY),f.getTarget()));
                        }
                        //移动之后,将鱼设置到新位置
                        f.setPoint(new Point(newX,newY));
                 }
                 try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    //重画界面
                    GameJPanel.this.repaint();

            }
        }
    }

这是Fish类

 package eatfish;

import java.awt.Point;
import java.awt.image.BufferedImage;
import java.awt.Rectangle;

public class Fish {
    private String state;
    private int level;
    private Point point;
    private Point target;
    public BufferedImage[] img;
    private int direction=GameUtil.Direction_Left;
    private boolean dead;
    private Rectangle area; 
    private  int width;
    private int height;
    private int drawCount;
    private int drawIndex;

    public void setPoint(Point point){
        this.point=point;
    }

    public Point getPoint(){
        return point;
    }

    public int getWidth(){
        return width;
    }

    public int getHeight(){
        return height;
    }

    public Rectangle getArea(){
        Rectangle rect=new Rectangle();
        Point p=new Point();
        p.x=this.getPoint().x;
        p.y=this.getPoint().y+this.getHeight()/3;
        rect.setLocation(p);
        rect.setSize((int)(this.getWidth()/3),(int)(this.getHeight()/3));
        this.area=rect;
        return area;
    }

    public boolean isDead(){
        return dead;
    }

    public void setDead(boolean dead){
        this.dead=dead;
    }

    public void setLevel(int level){
        this.level=level;
    }

    public int getLevel(){
        return level;
    }

    public int getDirection(){
        return direction;
    }

    public void setDirection(int direction){
        if(this.direction!=direction){
            this.setState(GameUtil.State_Turn);
        }
        this.direction=direction;
    }

    public Point getTarget(){
        return target;
    }

    public void setTarget(Point target){
        this.target=target;
    }

    public String getState(){
        return state;
    }

    public void setDrawCount(int drawCount){
        this.drawCount=drawCount;
    }

    public int getDrawCount(){
        return drawCount;
    }

    public void setDrawIndex(int drawIndex){
        this.drawIndex=drawIndex;
    }

    public int getDrawIndex(){
        return drawIndex;
    }

    public void setState(String state){
        if(this.state!=state){
            switch(state){
                case GameUtil.State_Swin:{this.setDrawCount(15);this.setDrawIndex(0);}
                case GameUtil.State_Turn:{this.setDrawCount(5);this.setDrawIndex(0);}
                case GameUtil.State_Eat:{this.setDrawCount(5);this.setDrawIndex(0);}
            }
            }
        this.state=state;
        }

    public BufferedImage getImage(){
        return img[drawIndex];
    }

    public void setImage(BufferedImage[] img){
        this.img=img;
    }

    }





    /*BufferedImage image;
    GameJPanel panel;
    int DrawIndex=1;
    String path;
    public Fish(GameJPanel panel){

    }
    public void swim(BufferedImage img){
        for(int i=1;i<15;i++){
        path="image/1/swim/swim_cycle."+i+".png";
         try {
                image=ImageIO.read(new File(path));
                this.image=img;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public BufferedImage getImage() {
        return this.image;
    }*/

  • 写回答

1条回答

  • 91program 博客专家认证 2015-07-19 13:23
    关注

    说明你的线程类可能占用了大量 CPU 的使用,从而导致卡的现象出现。
    分析一下你的线程吧,必要的时候增加一些延时,或者使用同步机制阻塞一下线程,给 UI 足够的处理时间这样就不会出现你所说的现象。

    评论

报告相同问题?

悬赏问题

  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)