项目二 黄金矿工 2

13 拉取速度

先在 Object类 中添加变量m 记录属性,分别让石块和金块赋值

Gold(){
    this.m = 80;
}
Rock(){  
    this.m = 150;
}

绳子共有三种状态 0:摇摆 1:抓取 2:收回 3:抓取返回
只有状态三时,拉到石块和金块的返回速度不一样

只修改Line类中 case3部分代码

case 3:
     int m=1;
     if (length>100){
          length=length-10;
          lines(g);
//减去偏移量  金块长度的一半
          for (Object obj: frame.objectList){
              if (obj.flag==true){
//抓到物体之后,将物体的质量付给m
                   m=obj.m;
                   obj.x=endx-obj.getWidth()/2;
                   obj.y=endy;
                       if (length<=100){
               //抓取成功,直接将金块移除  -150就是放在屏幕外面
                          obj.x= -150;
                          obj.y= -150;
                          obj.flag=false;
                          state = 0;
                            }
                        }
                    }
                }

在后面添加延时代码,时间就是质量,质量越大,延时效果越长

try {
      Thread.sleep(m);
} catch (InterruptedException e) {
      e.printStackTrace();
}

14 多种金块和物体堆叠情况

Gold类 中,加入两个类GoldMini ,GoldPlus, 分别表示大金块小金块

class GoldMini extends Gold{
    GoldMini(){
        this.width = 36;
        this.height = 36;
        this.m = 15;
        this.img = Toolkit.getDefaultToolkit().getImage("imgs/gold0.gif");
    }
}

class GoldPlus extends Gold{
    GoldPlus(){
        this.x=(int) (Math.random()*650);
        this.width = 105;
        this.height = 105;
        this.m = 60;
        this.img = Toolkit.getDefaultToolkit().getImage("imgs/gold2.gig");
    }

在GimeWin中的创建金块石块的方法体中

//创建金块,石块
    {
//        定义变量,表示是否可以放置
        boolean isPlace = true;
        for (int i=0;i<11;i++){
//            生成随机数,为后面大金块小金块的出现概率做准备,当生成的随机数小于0.3,生成小金块
//            添加石块、金块时,需要判断是否和已存在物体堆叠,需要先进行判断
            double random = Math.random();
            Gold gold;   //存放当前生成金块
            if (random<0.3){
                objectList.add(gold=new GoldMini());
            }else if (random<0.7){
                objectList.add(gold=new Gold());
            }else {
                objectList.add(gold=new GoldPlus());
            }
            for (Object object:objectList){
                if (gold.getRec().intersects(object.getRec())){
//                    不可重复放置,需要重新生成
                    isPlace=false;
                    i--;
                }
                if (isPlace){
                    objectList.add(gold);
                }else {
                    isPlace=true;
                    i--;
                }
            }
        }
        
//生成石块
        for (int i=0;i<5;i++){
            Rock rock = new Rock();
           for (Object obj:objectList){
//               如果说出现重合现象,不可放置
               if (rock.getRec().intersects(obj.getRec())){
                   isPlace = false;
               }
           }
//           如果可以放置
           if (isPlace){
               objectList.add(rock);
           }else {
               isPlace=true;
               i--;
           }
        }
    }

15 红线完善

Line类中
在红线末端加入钩子
在绘制红线方法中,对红线加粗并且把钩子放上去

//    添加钩爪图片
Image hook = Toolkit.getDefaultToolkit().getImage("imgs/hook.png");


void lines(Graphics g){
        endx = (int) (x + length*Math.cos(n*Math.PI));
        endy = (int) (y+ length*Math.sin(n*Math.PI));
        g.setColor(Color.RED);
//        红线实现加粗功能
        g.drawLine(x,y,endx,endy);
        g.drawLine(x-1,y,endx-1,endy);
        g.drawLine(x+1,y,endx+1,endy);
//        钩爪在红线的下面,红线放置在钩爪中心位置
        g.drawImage(hook,endx-36,endy+2,null);
    }

16 积分设置

在Object类中定义积分,金块:小金块2, 大金块8, 普通金块4 ,石块1
Object类

//    添加积分
int count;

金块类石块类中重写

Gold(){
	this.count = 4;
}
GoldMini(){
	this.count = 2;
}
GoldPlus(){
	this.count = 2;
}
Rock(){
	this.count = 1;
}

Line类中,在case3(抓取成功)情况下判定,每次加多少积分

if (obj.flag==true){
//抓到物体之后,将物体的质量付给m
   m=obj.m;
   obj.x=endx-obj.getWidth()/2;
   obj.y=endy;
   if (length<=MIN_length){
//抓取成功,直接将金块移除  -150就是放在屏幕外面
       obj.x= -150;
       obj.y= -150;
       obj.flag=false;
//计算总分,等于当前分数加上被抓物体的分数
       Bg.count = obj.count;
       state = 0;
    }
}

在背景类( Gg.java )中写入积分,创建文字框方法,在绘制背景中调用

public class Bg {
//        总分
    static int count = 0;
  
//    绘制背景
    void paintSelf(Graphics g){
    drawWord(g,30,Color.black,"积分:"+count,30,150);
}
//    绘制字符串
	public static void drawWord(Graphics graphics, int size,Color color,String str,int x,int y){
        graphics.setColor(color.BLACK);
//        宋体加粗大小30
        graphics.setFont(new Font("微软雅黑",Font.BOLD,size));
//        打印字符串,当前积分,在(30,150)坐标位置上
        graphics.drawString(str+count,x,y);
    }
}

17 力量与爆破

添加爆破,抓到石块,鼠标点右键石块消失
添加力量,抓金块时右键快速拉回
所以我们添加药水功能,在抓到石块或金块后完成相应功能

现在 Bg.java 中添加药水总量,药水状态以及绘制药水

//    定义存放药水数量的参数
    static  int waterNum = 3;
//    药水状态,true表示正在使用
    static boolean waterFlag = false;

//    添加药水图片
    Image water  = Toolkit.getDefaultToolkit().getImage("imgs/water.png");

//    绘制背景
void paintSelf(Graphics g){
    drawWord(g,30,Color.black,"*"+waterNum,550,70);
}

GameWin.java类 上添加鼠标单击事件

void launch(){
addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent e) {
         super.mouseClicked(e);
// 点击鼠标左键(e.getButton()==1),线当前状态为0(摇摆),点击后线的状态为抓取
         if (e.getButton()==1&&line.state==0){
             line.state=1;
         }else if (e.getButton()==3 && line.state==3){
// 在线抓取并且 点击鼠标右键(e.getButton()==3)后,药水状态为正在使用,药水减1
              Bg.waterFlag=true;
              Bg.waterNum--;
              line.state=2;
          }
     }
  });
}

在Line.java的case3 判断中

     case 3:
                int m=1;
                if (length>MIN_length){
                    length=length-10;
                    lines(g);
//                    减去偏移量  金块长度的一半
                    for (Object obj: frame.objectList){
                        if (obj.flag==true){
//                            抓到物体之后,将物体的质量付给m
                            m=obj.m;
                            obj.x=endx-obj.getWidth()/2;
                            obj.y=endy;
                            if (length<=MIN_length){
                                //抓取成功,直接将金块移除  -150就是放在屏幕外面
                                obj.x= -150;
                                obj.y= -150;
                                obj.flag=false;
//                                计算总分,等于当前分数加上被抓物体的分数
                                Bg.count = obj.count;
                                state = 0;
                            }
//*************************************************************************************
                            if (Bg.waterFlag){
                                if (obj.type==1){
                                    m=1;
                                    //将刷新频率变小,视觉上就显示拉的快了
                                }
                                if (obj.type==2){
                                    obj.x= -150;
                                    obj.y= -150;
                                    obj.flag=false;
                                    //拉到石块直接移除
                                }
                            }
//*************************************************************************************
                        }
                    }
                }
//                把m作为刷新频率
                try {
                    Thread.sleep(m);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;

如果waterFlag变为真,表示药水使用,但是还要判断是否抓到金块或者石块,金块快速拉回,石块爆破

所以在Object类中添加变量,让石块金块重写

//类型1 石块  类型2  石块
int type;
Gold(){
	this.type=1;
}
Rock(){
	this.type=2;
}

18 设置关卡

在背景类 Bg.java 中添加关卡、关卡分数,在绘制方法中将其绘制出来

//    定义关卡
    static int level = 1;
//    定义每一关的目标得分
    int goal = level*5;

//    绘制背景
void paintSelf(Graphics g){
        g.drawImage(bg,0,200,null);
        g.drawImage(bg1,0,0,null);
        g.drawImage(peo,310,50,null);
        g.drawImage(water,490,40,null);=
        drawWord(g,30,Color.black,"积分:"+count,30,150);
        drawWord(g,30,Color.black,"*"+waterNum,550,70);
//        绘制关卡数和目标积分
        drawWord(g,20,Color.black,"第"+level+"关",30,60);
        drawWord(g,30,Color.black,"目标"+goal,30,110);
}

在主类中 GameWin.java 创建函数,并且在绘制窗口方法中,有一个循环,循环中调用下一关函数

//    窗口绘制方法
    void launch(){
        while (true){
            repaint();
            nextLevel();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

//    进入下一关
    public void nextLevel(){
    //如果此时积分大于目标积分
        if (Bg.count>bg.goal){
            System.out.println("过关");
            //关闭之前窗口
            dispose();
            //关卡加1
            Bg.level++;
            //绘制新窗口
            GameWin gameWin = new GameWin();
            gameWin.launch();
        }
    }

19 游戏状态

游戏状态有5种,
0:准备 1:运行中 2:商店 3:失败 4:胜利
GameWin.java 中添加静态变量记录状态

//    表示整个游戏的状态  0:准备   1:运行中  2:商店  3:失败  4:胜利
    static int state;

void launch(){     
        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);

                switch (state){
                    case 0:
//                        点击右键,游戏开始
                        if (e.getButton()==3){state=1;}
                        break;
                    case 1:
//                点击鼠标左键(e.getButton()==1),线当前状态为0(摇摆),点击后线的状态为抓取
                        if (e.getButton()==1&&line.state==0){
                            line.state=1;
                        }else if (e.getButton()==3 && line.state==3){
//               在线抓取并且 点击鼠标右键(e.getButton()==3)后,药水状态为正在使用,药水减1
                            Bg.waterFlag=true;
                            Bg.waterNum--;
                            line.state=2;
                        }
                        break;
                    case 2:
                        break;
                    case 3:
                        break;
                    case 4:
                        break;
                    default:
                }
            }
        });

在鼠标事件中,添加游戏状态

同时,在Bg.java中对绘制背景也进行判断

//    绘制背景
    void paintSelf(Graphics g){

        g.drawImage(bg,0,200,null);
        g.drawImage(bg1,0,0,null);

        switch (GameWin.state){
            case 0:
                drawWord(g,80,Color.blue,"准备开始",200,400);
                break;
            case 1:
//                游戏运行状态才化人物等
                g.drawImage(peo,310,50,null);
                g.drawImage(water,490,40,null);

                drawWord(g,30,Color.black,"积分:"+count,30,150);
                drawWord(g,30,Color.black,"*"+waterNum,550,70);

//        绘制关卡数和目标积分
                drawWord(g,20,Color.black,"第"+level+"关",30,60);
                drawWord(g,30,Color.black,"目标"+goal,30,110);
                break;
            case 2: break;
            case 3: break;
            case 4: break;
            default:
        }

计时效果

Bg.java 中添加起始时间和结束时间

public class Bg {
//    开始时间
    long startTime;
//    结束时间
    long endTime;
    
//    绘制背景
    void paintSelf(Graphics g){

        g.drawImage(bg,0,200,null);
        g.drawImage(bg1,0,0,null);

        switch (GameWin.state){
            case 0:
                drawWord(g,80,Color.blue,"准备开始",200,400);

                break;
            case 1:
//                游戏运行状态才化人物等
                g.drawImage(peo,310,50,null);
                g.drawImage(water,490,40,null);

                drawWord(g,30,Color.black,"积分:"+count,30,150);
                drawWord(g,30,Color.black,"*"+waterNum,550,70);

//        绘制关卡数和目标积分
                drawWord(g,20,Color.black,"第"+level+"关",30,60);
                drawWord(g,30,Color.black,"目标"+goal,30,110);
//*************************************************************************************
//                状态为1 实时赋值
                endTime=System.currentTimeMillis();
//                /1000 将毫秒换算成秒   20-(endTime-startTime)/1000   从20开始倒计时
                long time = 20-(endTime-startTime)/1000;
                drawWord(g,30,Color.black,"时间"+(time>0?time:0),520,110);
//*************************************************************************************
                break;
            case 2: break;
            case 3: break;
            case 4: break;
            default:
}

失败、成功状态

Bg.java 中paintSelf方法的case判断中进行添加
0:准备 1:运行中 2:商店 3:失败 4:胜利
这里我们先在 GameWin.java 的 nextLevel方法中加判断:

//    进入下一关  游戏倒计时结束,并且处于运行中,进入状态1,否则进行状态失败
    public void nextLevel(){
//        游戏开始阶段才能判断下一关
        if (bg.gameTime() && state==1){
//           如果本次取得的分数大于规定分数
            if (Bg.count>bg.goal){
//                如果打到最后一关,
                if (Bg.level==5){
                    state=4;
                }else {
                    Bg.level++;
                }
                System.out.println("过关");
                dispose();
                Bg.level++;
                GameWin gameWin = new GameWin();
                gameWin.launch();
            }
        }else {
            state=3;
        }
    }

这里写state3 在 Bg.java 中paintSelf方法的case判断中写,打印两句话就行

//失败
case 3:
     drawWord(g,80,Color.black,"失败",250,350);
     drawWord(g,80,Color.black,"积分"+count,200,450);
     break;
//打通五关,胜利
            case 4:
                drawWord(g,80,Color.black,"成功",250,350);
                drawWord(g,80,Color.black,"积分"+count,200,450);
                break;
            default:
        }

总结

Game.java

  • 变量: 状态、列表(放金块石块,所以用Object接收)、背景类对象、绳子类对象、创建第二个背景(解决闪动问题)
public class GameWin extends JFrame {

//    表示整个游戏的状态  0:准备   1:运行中  2:商店  3:失败  4:胜利
    static int state;
//    可以用来放金块,石块
    List<Object> objectList = new ArrayList<>();
    
    Bg bg = new Bg();
    Line line = new Line(this);

    Image offScreenImage;
}
  • 创建方法体 {} ,来写石块金块,变量 isPlace 的作用是为了判断是否冲突(不能重复放置)
//创建金块,石块
    {
//        定义变量,表示是否可以放置
        boolean isPlace = true;

//        放置金块
        for (int i=0;i<11;i++){
//            生成随机数,为后面大金块小金块的出现概率做准备,当生成的随机数小于0.3,生成小金块
//            添加石块、金块时,需要判断是否和已存在物体堆叠,需要先进行判断
            double random = Math.random();
            Gold gold;   //存放当前生成金块
            if (random<0.3){
                gold=new GoldMini();
            }else if (random<0.7){
                gold=new Gold();
            }else {
                gold=new GoldPlus();
            }
            for (Object obj:objectList){
                if (gold.getRec().intersects(obj.getRec())){
//                    gold的位置与现有的物体位置重合,则不可重复放置,需要重新生成
                    isPlace=false;
                    i--;
                }
            }

            if (isPlace){
                objectList.add(gold);
            }else {
                isPlace=true;
                i--;
            }
        }

        //        放置石块
        for (int i=0;i<5;i++){
            Rock rock = new Rock();
           for (Object obj:objectList){
//               如果说出现重合现象,不可放置
               if (rock.getRec().intersects(obj.getRec())){
                   isPlace = false;
               }
           }
//           如果可以放置
           if (isPlace){
               objectList.add(rock);
           }else {
               isPlace=true;
               i--;
           }
        }
    }
  • 画窗体
    绘制窗体需要添加鼠标单击事件,这里就用到变量状态— 0:准备 1:运行中 2:商店 3:失败 4:胜利
//    窗口绘制方法
    void launch(){
        this.setVisible(true);
        this.setSize(768,1000);
//        设置窗口位置,居中
        this.setLocationRelativeTo(null);
        this.setTitle("黄金矿工");
//        关闭窗口
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                super.mouseClicked(e);

                switch (state){

                    case 0:
//                        点击右键,游戏开始,给出初始时间
                        if (e.getButton()==3){
                            state=1;
//                            状态为1   游戏开始时间为系统时间
                            bg.startTime=System.currentTimeMillis();
                        }
                        break;

                    case 1:
//              点击鼠标左键(e.getButton()==1),线当前状态为0(摇摆),点击后线的状态为抓取
                        if (e.getButton()==1&&line.state==0){
                            line.state=1;
                        }else if (e.getButton()==3 && line.state==3){
//              在线抓取并且 点击鼠标右键(e.getButton()==3)后,药水状态为正在使用,药水减1
                            Bg.waterFlag=true;
                            Bg.waterNum--;
                            line.state=2;
                        }
                        break;

                    case 2:
                        break;

                    case 3:
                        break;

                    case 4:
//                        胜利后重置游戏
                        if (e.getButton()==1){
                            state=0;
                            //reGame是重启游戏的方法,后面会写
                            bg.reGame();
                            line.reGame();
                        }
                        break;

                    default:
                }
            }
        });

        while (true){
            repaint();
            nextLevel();
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

case1中涉及到绳子的状态,后续在Line.java中会写

  • paint方法
    就是画图片
//    绘制图片
//    Graphics 代表画笔
    public void paint(Graphics g){
//创建一个一摸一样的画布,放在最下层,每次重新绘制时,就不会出现闪动现象
//        创建两个画布,一个放在最下面,第一步先把金块背景放进去
        offScreenImage = this.createImage(768,1000);
        Graphics gImage = offScreenImage.getGraphics();
        bg.paintSelf(gImage);

        if (state==1){
            //绘制金块,采用增强for循环
            for (Object obj:objectList){
                obj.paintSelf(gImage);
            }

            line.paintSelf(gImage);
        }

//        第二步把画布画到背景中
        g.drawImage(offScreenImage,0,0,null);
    }

  • nextLevel
    进入下一关 游戏倒计时结束,并且处于运行中,进入状态1,否则进行状态失败
public void nextLevel(){
//        游戏开始阶段才能判断下一关
        if (bg.gameTime() && state==1){
//           如果本次取得的分数大于规定分数
            if (Bg.count>bg.goal){
//                如果打到最后一关,
                if (Bg.level==5){
                    state=4;
                }else {
                    Bg.level++;
                }
                System.out.println("过关");
                dispose();
                Bg.level++;
                GameWin gameWin = new GameWin();
                gameWin.launch();
            }
        }else {
            state=3;
        }
    }

Bg.java

  • 定义变量 背景需要积分,药水,关卡,开始时间,结束时间,需要添加背景图片(人物,背景),药水图片
//        总分
    static int count = 0;
//    定义存放药水数量的参数
    static  int waterNum = 3;
//    药水状态,true表示正在使用
    static boolean waterFlag = false;
//    定义关卡
    static int level = 1;
//    定义每一关的目标得分
    int goal = level*5;

//    开始时间
    long startTime;
//    结束时间
    long endTime;
    
	Image bg = Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");
    Image bg1 = Toolkit.getDefaultToolkit().getImage("imgs/bg1.jpg");
    Image peo = Toolkit.getDefaultToolkit().getImage("imgs/peo.png");
//    添加药水图片
    Image water  = Toolkit.getDefaultToolkit().getImage("imgs/water.png");
  • 绘制背景
    case1 表示游戏运行中,需要绘制人物,加时间
//    绘制背景
    void paintSelf(Graphics g){

        g.drawImage(bg,0,200,null);
        g.drawImage(bg1,0,0,null);

        switch (GameWin.state){
//    表示整个游戏的状态  0:准备   1:运行中  2:商店  3:失败  4:胜利
            case 0:
                drawWord(g,80,Color.blue,"准备开始",200,400);
                break;

            case 1:
//                游戏运行状态才画人物等
                g.drawImage(peo,310,50,null);
                g.drawImage(water,490,40,null);

                drawWord(g,30,Color.black,"积分:"+count,30,150);
                drawWord(g,30,Color.black,"*"+waterNum,550,70);

//        绘制关卡数和目标积分
                drawWord(g,20,Color.black,"第"+level+"关",30,60);
                drawWord(g,30,Color.black,"目标"+goal,30,110);

//                状态为1 实时赋值
                endTime=System.currentTimeMillis();
//                /1000 将毫秒换算成秒   20-(endTime-startTime)/1000   从20开始倒计时
                long time = 20-(endTime-startTime)/1000;
                drawWord(g,30,Color.black,"时间"+(time>0?time:0),520,110);
                break;

            case 2:
                break;
                
//            失败状态下,打印失败+积分
            case 3:
                drawWord(g,80,Color.cyan,"失败+",250,350);
                drawWord(g,80,Color.cyan,"积分+"+count,200,450);
                break;
                
//            打通五关,胜利
            case 4:
                drawWord(g,80,Color.black,"成功",250,350);
                drawWord(g,80,Color.black,"积分"+count,200,450);
                break;
            default:
        }
    }
  • reGame
    定义重新开始游戏方法,重新定义里面的参数GameWin.java中鼠标单击事件,case4用到了 [因为case4写的是游戏胜利]
void reGame(){
//        总分
      count = 0;
//    定义存放药水数量的参数
      waterNum = 3;
//    药水状态,true表示正在使用
      waterFlag = false;
//    定义关卡
      level = 1;
//    定义每一关的目标得分
      goal = level*5;
    }
  • drawWord方法
    背景中需要添加很多字符串,所以把绘制字符串方法单独写出来
//    绘制字符串
    public static void drawWord(Graphics graphics, int size,Color color,String str,int x,int y){
        graphics.setColor(color);
//        宋体加粗大小30
        graphics.setFont(new Font("微软雅黑",Font.BOLD,size));
//        打印字符串,当前积分,在(30,150)坐标位置上
        graphics.drawString(str+count,x,y);
    }
}

Line.java

//    起点坐标
    int x=380;
    int y=180;

//    终点坐标
    int endx=500;
    int endy=500;

//    线长
    double length = 100;

//   设置线长的最大最小值,在抓取和返回时用
    double MIN_length=100;
    double MAX_length=750;
    double n = 0;

//    添加方向参数
    int dir = 1;

//    红线状态  0:摇摆  1:抓取  2:收回  3:抓取返回
    int state;

//    添加钩爪图片
    Image hook = Toolkit.getDefaultToolkit().getImage("imgs/hook.png");

    GameWin frame;
    Line(GameWin frame){
        this.frame = frame;
    }
  • logic方法
    红线碰到方块后需要抓上来,添加一个碰撞检测方法
//    碰撞检测
    void logic(){
//        从主窗口中拿objectList集合来遍历
        for (Object obj: frame.objectList){
            if (endx>obj.x && endx<obj.x+obj.width &&
                    endy>obj.y && endy<obj.y+obj.height){
                state=3;
//                当抓取到了,金块的值变为真
                obj.flag = true;
            }
        }
    }
  • lines
    绘制红线方法
void lines(Graphics g){
        endx = (int) (x + length*Math.cos(n*Math.PI));
        endy = (int) (y+ length*Math.sin(n*Math.PI));
        g.setColor(Color.RED);
//        红线实现加粗功能
        g.drawLine(x,y,endx,endy);
        g.drawLine(x-1,y,endx-1,endy);
        g.drawLine(x+1,y,endx+1,endy);
//        钩爪在红线的下面,红线放置在钩爪中心位置
        g.drawImage(hook,endx-36,endy+2,null);
    }
  • paintSelf
    绘制红线,需要判断红线的状态 [0:摇摆 1:抓取 2:收回 3:抓取返回]
    当状态为0 时处于摇摆状态,dir=-1时((n>0.9)),代表到2pi了,红线反向
    try catch里意思就是,用质量来刷新,质量越小,刷新越快,视觉上就是物体拉得更快了
//    Graphics对象代表画笔
    void paintSelf(Graphics g){
//      调用判断,当绳子碰到金块时,绳子的状态时3,此时在switch中写状态3情况
        logic();
        switch (state){
            //case0 线摇摆
            case 0:
                if (n<0.1){
                    dir=1;
                }else if (n>0.9){
                    dir=-1;
                }
                n=n+0.005*dir;
                lines(g);
                break;

//                case1 抓取
            case 1:
                if (length<MIN_length){
                    length = length+5;
                    lines(g);
                }else {state=0;}
                break;
//                case2 收回
            case 2:
                if (length>MAX_length){
                    length=length-5;
                    lines(g);
                }else {state=0;}

            case 3:
                int m=1;
                if (length>MIN_length){
                    length=length-10;
                    lines(g);
//                    减去偏移量  金块长度的一半
                    for (Object obj: frame.objectList){
                        if (obj.flag==true){
//                            抓到物体之后,将物体的质量付给m
                            m=obj.m;
                            obj.x=endx-obj.getWidth()/2;
                            obj.y=endy;
                            if (length<=MIN_length){
                                //抓取成功,直接将金块移除  -150就是放在屏幕外面
                                obj.x= -150;
                                obj.y= -150;
                                obj.flag=false;
//                                计算总分,等于当前分数加上被抓物体的分数
                                Bg.count = obj.count;
                                state = 0;
                            }
                            if (Bg.waterFlag){
                                if (obj.type==1){
                                    m=1;
                                }
                                if (obj.type==2){
                                    obj.x= -150;
                                    obj.y= -150;
                                    obj.flag=false;
                                }
                            }
                        }
                    }
                }
//                把m作为刷新频率
                try {
                    Thread.sleep(m);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                break;
        }
    }

Object.java

石头类和金块类的父类,他们有公共属性熟悉写起来方便

public class Object {

// 标记,是否能移动
    boolean flag;

    //坐标
    int x;
    int y;
    //宽高
    int width;
    int height;
//    图片
    Image img;
//    质量,抓取不同的物体,返回的速度不一样
    int m;
//    绘制方法

//    添加积分
    int count;

//    类型1 石块  类型2  石块
    int type;

    void paintSelf(Graphics g){
        g.drawImage(img,x,y,null);
    }

//    Line方法中,需要获取金块石块的宽度的一般,来计算偏移量,这里定义getWidth就能在Line类的paintSelf方法中得到了
    public int getWidth() {
        return width;
    }

//判断边界方法
    public Rectangle getRec(){
        return new Rectangle(x,y,width,height);
    }

}

Gold.java

金块有三种

public class Gold extends Object{

    Gold(){
        this.x=(int) (Math.random()*700);
        this.y=(int) (Math.random()*550+300);
        this.width=52;
        this.height=52;
        this.img= Toolkit.getDefaultToolkit().getImage("imgs/gold1.gif");
//        flag 的初始值为false,代表没被抓到,不移动
        this.flag = false;
        this.m=80;
        this.count = 4;
        this.type=1;
    }

}

class GoldMini extends Gold{
    GoldMini(){
        this.width = 36;
        this.height = 36;
        this.m = 15;
        this.img = Toolkit.getDefaultToolkit().getImage("imgs/gold0.gif");
        this.count = 2;
    }
}

class GoldPlus extends Gold{
    GoldPlus(){
        this.x=(int) (Math.random()*650);
        this.width = 105;
        this.height = 105;
        this.m = 60;
        this.img = Toolkit.getDefaultToolkit().getImage("imgs/gold2.gig");
        this.count = 8;
    }
}

Rock.java

石块有一种

public class Rock extends Object{

    Rock(){
        this.x=(int) (Math.random()*700);
        this.y=(int) (Math.random()*550+300);
        this.width=71;
        this.height=71;
        this.img= Toolkit.getDefaultToolkit().getImage("imgs/rock1.png");
//        flag 的初始值为false,代表没被抓到,不移动
        this.flag = false;
        this.m = 150;
        this.count = 1;
        this.type=2;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值