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);
}
}
}