愤怒的小鸟开发过程

1.核心代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;

public class BirdPanel extends JPanel implements MouseMotionListener, MouseListener {
    JFrame jf;   //将开始界面传入面板,来操作开始界面

    //背景
    Image image = new ImageIcon("Image/bg.jpg").getImage();
    //发射架
    Image image1 = new ImageIcon("Image/shoot.png").getImage();
    //墙体
    Image image2 = new ImageIcon("Image/wall.PNG").getImage();
    //小猪
    Image image3 = new ImageIcon("Image/bird2.png").getImage();

    //单个小鸟
    Image image4 = new ImageIcon("Image/bird3.png").getImage();


    List<Cloud> ListCloud = new ArrayList<Cloud>();       //创建对象数组列表用来保存云朵对象
    //绳子的长度,发射鸟的位置
    int shootx;
    int shooty;
    int beginx;  //小鸟子弹初始的坐标
    int beginy;

    boolean flag1 = false;  //是否发射小鸟
    boolean flag2 = false;  //发射的小鸟是否飞行

    //创建小鸟子弹
    BirdBullet bullet = new BirdBullet();
    //创建萌萌的小鸟
    CuteBird cuteBird = new CuteBird();

    public void BirdPanel(){

    }
    @Override
    public void mouseDragged(MouseEvent e) {
        //当拖动鼠标时,改变绳子和小鸟的位置,并画出子弹的轨迹
        int x = e.getX();
        int y = e.getY();
        //120 480
//        95,449);
//        g2.drawLine(shootx,shooty,122,449);
        if(x > 45 && x < 170 && y > 360 && y < 530){
            flag1 = true;   //发射小鸟
            flag2 = false;  //当拖动鼠标时,未释放鼠标
            shootx = x;      //如果鼠标拖动的位置在发射位置内,赋值给发射位置
            shooty = y;
//            System.out.println("x的坐标"+x+"y的坐标"+y);
        }

    }

    @Override
    public void mouseMoved(MouseEvent e) {

    }







    //重写paint方法,在里面画图
    public void paint(Graphics g){
        super.paint(g);
        //绘制背景图片
        g.drawImage(image, 0, 0, 800, 800, null);

        //绘制墙体
        g.drawImage(image2, 650, 500, 150,300, null);




        //绘制小鸟发射台
        g.drawImage(image1, 0, 420, 150, 120, null);

        //判断是否发射
        if(flag1){
//            System.out.println("shootx的值"+shootx+"shooty的值"+shooty);

            //画粗线,弹弓上的绳子
            Graphics2D g2 = (Graphics2D)g;  //g是Graphics对象
            g2.setStroke(new BasicStroke(8));
            g2.drawLine(shootx,shooty,95,449);
            g2.drawLine(shootx,shooty,117,445);
//            g.drawImage(image1, 0, 420, 150, 120, null);

            //绘制绳子上的小鸟
            if(flag2 != true) {   //当鼠标未释放时可以画绳子上的小鸟子弹,当鼠标释放时//消去初始的小鸟,画飞行的小鸟子弹
                g.drawImage(image4, shootx - 25, shooty - 50, 70, 70, null);
            }
        }

        //绘制萌萌的小鸟
        cuteBird.move();
        cuteBird.drawbird(g);

        //绘制小鸟子弹
        //每隔10ms移动一次小鸟子弹,重绘一次
        if(flag2) {            //当释放鼠标时,每隔10ms,小鸟子弹移动一次位置,并画出来
            bullet.drawbullet(g); //绘制小鸟,绘制一次,改变小鸟的位置,再次绘制
            bullet.move();
            //做出碰撞效果,捕捉此时小鸟子弹的坐标,如果和萌萌的小鸟坐标碰撞,则改变两只小鸟的方向
            collision(bullet,cuteBird);
        }

        //当萌萌的小鸟和愤怒的小鸟碰撞后,萌萌的小鸟开始运动当x坐标>800时,重新设置坐标,并未静止状态
//        if(cuteBird.getx()>800){
//            cuteBird.setx(660);
//            cuteBird.sety(445);
//            cuteBird.setvx(0);
//            cuteBird.setvy(0);
//        }
        //当萌萌的小鸟和愤怒的小鸟碰撞后判断游戏是否结束了
        if(cuteBird.getx()>800 && collflag) {
            ScoreUI ui = new ScoreUI();
            ui.setBirdUI(jf);
            ui.InitUI();
        }




        //绘制碰撞效果

        //画云朵
        for (int i = 0; i < ListCloud.size(); i++) {   //每刷新一次画n个云朵,判断此时云朵位置是否会碰撞
            //取出所有云朵对象,取出坐标判断是否相等,相等改变速度
            ListCloud.get(i);
            Cloud cloud = ListCloud.get(i);    //创建对象在循环里,对象创建了n次,用对象引用赋值本质还是一个
            cloud.move();
            if (cloud.x > 750) {
                ListCloud.remove(cloud);
            }
            //改变了创建的当前云朵对象的x,y,画出云朵
            cloud.darwcloud(g);
        }

    }



    //游戏开始函数
    public void begin() throws InterruptedException {
        //当启动界面开始游戏时生产云朵
        CloudProduction Cloudproduction = new CloudProduction(ListCloud);
        Cloudproduction.start();

        //当弹弓释放时创建一个小鸟子弹

        //当启动界面设置萌萌小鸟的初始坐标,只需要设置一次
        cuteBird.setx(660);
        cuteBird.sety(445);


        while (true) {  //死循环,一直执行,全局变量改变可以收到
            Thread.sleep(10);

            //在paint函数中移动子弹
            //每隔10ms移动一次小鸟子弹,重绘一次
//            if(flag2) {            //当释放鼠标时,每隔10ms,小鸟子弹移动一次位置,并画出来
//                bullet.move();
//            }


            repaint();
        }

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        int x = e.getX();
        int y = e.getY();
//        System.out.println("点击的x坐标"+x+"点击的y坐标"+y);
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        //当鼠标释放时,发射小球
        int x = e.getX();
        int y = e.getY();
        if(x > 45 && x < 170 && y > 360 && y < 530){
            flag2 = true;   //如果鼠标释放的位置在发射位置内,发射的小鸟开始飞行
            //绘制小鸟子弹,当鼠标拖动结束时,全局变量shootx,shooty已经改变,鼠标释放时接受到了改变的shootx,shooty
            beginx = shootx - 25;  //小鸟子弹初始的坐标
            beginy = shooty - 50;
            bullet.setx(beginx);  //设置小鸟子弹的初始坐标
            bullet.sety(beginy);
            //根据小鸟子弹的初始坐标设置小鸟子弹的速度大小方向
            System.out.println("beginx"+beginx);
            System.out.println("beginY"+beginy);
            if(beginx < 95 && beginx > 75){
                bullet.setvx(5);
            }
            else if(beginx < 75 && beginx > 55){
                bullet.setvx(10);
            }
            else if(beginx < 55){
                bullet.setvx(15);
            }
            else if(beginx > 95 && beginx < 115){
                bullet.setvx(-5);
            }
            else if(beginx > 115 && beginx < 135){
                bullet.setvx(-10);
            }
            else
                bullet.setvx(-15);



            if(beginy < 410 && beginy > 400){
                bullet.setvy(10);
            }
            else if(beginy < 420 && beginy > 410){
                bullet.setvy(15);
            }
            else if(beginy < 430){
                bullet.setvy(20);
            }
            else if(beginy > 430 && beginy < 449){
                bullet.setvy(-10);
                System.out.println("1速度");
            }
            else if(beginy > 440 && beginy < 450){
                bullet.setvy(-15);
                System.out.println("2速度");
            }
            else {
                System.out.println("3速度");
                bullet.setvy(-20);
            }




            //为了能画出小鸟运动为曲线的效果,vx可以不变,初始vy最大,慢慢变小,变为负数
//            bullet.setvx(15);
//            bullet.setvy(-20);
        }


    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    boolean collflag = false;    //判断小球是否碰撞
    //判断小鸟是否碰撞的函数
    public void collision(BirdBullet birdBullet, CuteBird cuteBird){
//        System.out.println("小鸟子弹x坐标"+birdBullet.getx());
//        System.out.println("小鸟子弹y坐标"+birdBullet.gety());
//        System.out.println("萌萌的小鸟x坐标"+cuteBird.getx());
//        System.out.println("萌萌的小鸟y坐标"+cuteBird.gety());
//        System.out.println("距离大小"+Math.sqrt(Math.pow(birdBullet.getx() - cuteBird.getx(),2) + Math.pow(birdBullet.gety() - cuteBird.gety(),2)));

                //如果两只小鸟之间的距离小于两只小鸟半径和,则改变两只小鸟的速度方向
                //Math.sqrt(Math.pow(ball.x - ball_j.x,2) + Math.pow(ball.y - ball_j.y,2))
                if(Math.sqrt(Math.pow(birdBullet.getx() - cuteBird.getx(),2) + Math.pow(birdBullet.gety() - cuteBird.gety(),2)) < 30){  //如果两球之间距离小于两球半径和,则互换两小球速度
                    System.out.println("已经碰撞");
                    collflag = true;
                    //改变两只小鸟的速度方向
                    cuteBird.setvx(5);
                    cuteBird.setvy(-2);
                    birdBullet.setvx(-5);
                    birdBullet.setvy(-5);
                }
            }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值