⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainframe.java

📁 BravePiglet.rar 勇敢的猪Java游戏 由本人原创
💻 JAVA
字号:
package com.lovo.pig.view;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import com.lovo.pig.control.SettingCtrl;
import com.lovo.pig.model.Balloon;
import com.lovo.pig.model.Bullet;
import com.lovo.pig.model.Crow;
import com.lovo.pig.model.Gear;
import com.lovo.pig.model.Pig;
import com.lovo.pig.model.Player;
import com.lovo.pig.model.Umbrella;
import com.lovo.pig.model.Wolf;
import com.lovo.pig.util.Images;
import com.lovo.pig.util.Musics;
import com.lovo.pig.util.SavePlayer;


/**
 * @author gonggang
 */
public class MainFrame extends JFrame 
implements MouseMotionListener, Runnable ,KeyListener{
	private static final long serialVersionUID = -1936792706472393772L;
	//窗口大小
	public static final int FRAME_WIDTH = 800,FRAME_HEIGHT = 627;
	
	//后台图像
	private Image imgOffScreen;
	//后台图像画笔
	private Graphics drawOffScreen;
	
	//随机数产生器,用于控制狼和奖品出现的概率
	private Random rand = new Random();
	
	//游戏结束与否
	public boolean gameOver = false;
	//玩家积分
	public   int score = 0;
	
	//音乐工具类实例
	public Musics musics;
	//图像工具类实例
    public Images images;
    //保存用户信息工具类实例
    private SavePlayer save;
    //设置控制类实例
    private SettingCtrl setting;
    //当前猪实例
    public Pig currentPig;
    //轮子对象
    private Gear gear;
    
    //狼集合
    public List<Wolf> wolves = new ArrayList<Wolf>();
	//气球集合
    public List<Balloon> balloons = new ArrayList<Balloon>();
	//子弹集合
    public List<Bullet> bullets = new ArrayList<Bullet>();
	//伞集合(等效于奖品集合)
    public List<Umbrella> umbrellas = new ArrayList<Umbrella>();
    //乌鸦集合
    public List<Crow> crows  = new ArrayList<Crow>();
	
	public MainFrame() {
		this.setLayout(null);
		this.setSize(800,627);
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		//窗口关闭时返回菜单窗口
		this.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e) {
				MainFrame.this.dispose();
				new MenuFrame();
			}
		});

		images = Images.getImages();
		musics = Musics.getMusic();
		save = SavePlayer.getSavePlayer();
		setting = SettingCtrl.getSettingCtrl();
		currentPig = new Pig(this);
		gear = new Gear(this);
		
        //播放游戏进行中背景音乐
//		musics.playBgGamingMusic();

		this.setVisible(true);
        
		//创建后台图片
		imgOffScreen = this.createImage(FRAME_WIDTH, FRAME_HEIGHT);
		drawOffScreen = imgOffScreen.getGraphics();
		drawOffScreen.setFont(new Font("Dialog",4,20));
		drawOffScreen.setColor(Color.ORANGE );
        
		//鼠标移动事件
		this.addMouseMotionListener(this);
		//鼠标按键事件
		this.addMouseListener(new MouseLis());
		this.addKeyListener(this);
		
		//重绘线程
		new Thread(this).start();
	}
	
	public void paint(Graphics g) {
		if(drawOffScreen != null){//若不进行判断,可能报异常
			//后台绘制
			draw(drawOffScreen);
			//前台绘制
			g.drawImage(imgOffScreen, 0, 0, 800, 627, null);
		}
    }
	
	/**
	 *在后台绘制所有界面元素
	 * @param g
	 */
	public void draw(Graphics g) {
		//背景
		g.drawImage(images.getImgBackground(), 0, 27, null);
		
		//轮子,CPU消耗过高
        gear.draw(g);
		
		//猪(和绳子)
		currentPig.draw(g);
        
		//狼
		for (int i = 0; i < wolves.size(); i++) {
			wolves.get(i).draw(g);
		}
		//气球
		for (int i = 0; i < balloons.size(); i++) {
				balloons.get(i).draw(g);
		}
		//子弹
		for (int i = 0; i < bullets.size(); i++) {
				bullets.get(i).draw(g);
		}
		//伞(奖品)
		for (int i = 0; i < umbrellas.size(); i++) {
			umbrellas.get(i).draw(g);
		}
		//乌鸦
        for(int i = 0;i < crows.size();i++){
        	crows.get(i).draw(g);
        }
		//分数
		g.drawString("" + score, 140, 60);
	}

	

	public void run() {
		while (!gameOver) {
			//随机添加狼,奖品和乌鸦,控制难度
			int addEnemy = rand.nextInt(30);//增加狼和奖品的概率
			if (addEnemy >= 28 && wolves.size() < setting.getWolfNum()) {//限制狼的总数
				Wolf wolf = new Wolf(this);
				wolves.add(wolf);
				Balloon b = new Balloon(this, wolf);
				balloons.add(b);
				if(addEnemy >= 29 &&  umbrellas.size() == 0){//增加奖品
					Umbrella umbrella = new Umbrella(this);
					umbrellas.add(umbrella);
				}
				if(addEnemy >= 29 && crows.size() == 0){//增加乌鸦
					Crow crow = new Crow(this);
					crows.add(crow);
				}
			}
			/**
			 * 此处增加碰撞检测代码
			 */
			
		    int  i,j;
			//狼与子弹的碰撞
			for(i = 0;i < wolves.size();i++){
				Wolf wolf = wolves.get(i);
				for(j = 0;j < bullets.size();j++){
					Bullet bullet = bullets.get(j);
					if(wolf.hp > 0&&bullet.visible&&wolf.x>wolf.flyX &&//狼HP大于零,子弹可见时,并且狼上升时才检测碰撞
							//此处若用wolf.live == false来判断似乎无效,没有节约计算的作用
							wolf.getRect().intersects(bullet.getRect())){
						wolf.hitted = true;//记录碰撞
						wolf.bulletX = bullet.x;//记录碰撞的位置
						wolf.bulletY = bullet.y;
						//立即清除子弹对象,节省下面的计算量
						bullets.remove(j);
						wolf.hp--;
						score++;//打中狼一次,分数加一
						//播放狼被击中的音乐
						musics.wolfHitted();
						if(wolf.hp == 0){
							//播放狼往下掉的音乐
					    	musics.wolfDown();
						}
						break;
					}
				}
			}
			/**
			 * 气球与子弹的碰撞
			 */
			for(i = 0;i < balloons.size();i++){
				Balloon balloon = balloons.get(i);
				for(j = 0;j < bullets.size();j++){
					Bullet bullet = bullets.get(j);
					if(!balloon.hitted &&balloon.visible&& bullet.visible&&//气球未被击中且可见,子弹可见时,进行检测(气球可见时既气球上升时)
							balloon.getRect().intersects(bullet.getRect())){
						//立即清除子弹对象
						bullets.remove(j);
						balloon.hitted = true;
						score += 3;//打中气球一次,分数加3
						//狼马上挂
						balloon.wolf.hp = 0;
						//播放气球被击中的音乐
						musics.balloonHitted();
						break;
					}
				}
			}
			//奖品与子弹的碰撞
			for(i = 0;i < umbrellas.size();i++){
				Umbrella umbrella = umbrellas.get(i);
				for(j = 0;j < bullets.size();j++){
					Bullet bullet = bullets.get(j);
					if(!umbrella.awardHitted && bullet.visible&&//奖品未被击中,子弹可见时检测
					     umbrella.getRect().intersects(bullet.getRect())		
					){
						//奖品被击中
						umbrella.awardHitted = true;
						//击中一次,分数加5
						score += 5;
						//清除子弹
						bullets.remove(j);
						//播放奖品被击中音乐
						musics.playAwardHitted();
					}
				}
			}
			//乌鸦与子弹的碰撞
			for(i = 0;i < crows.size();i++){
				Crow crow = crows.get(i);
				for(j = 0;j < bullets.size();j++){
					Bullet bullet = bullets.get(j);
					if(crow.hp > 0 && bullet.visible&&
					   crow.getRect().intersects(bullet.getRect())		
					){
						bullets.remove(j);
						crow.hp--;
						musics.playCrowHitted();//播放乌鸦被击中音乐
						score += 5;
						break;
					}
				}
			}
			//乌鸦撞上猪
			for(i = 0;i < crows.size();i++){
				Crow crow = crows.get(i);
				if(crow.x == 680 &&crow.y >= this.currentPig.pigY - 20 
						&& crow.y <= this.currentPig.pigY + 20){//乌鸦撞上猪,猪挂
					this.currentPig.live = false;
				}
			}
			
			repaint();
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		repaint();//这里必须repaint一次,否则猪不会彻底完蛋(最后一幅画不出来)
		//停止播放游戏背景音乐
		musics.stopBgGamingMusic();
		//播放猪死亡音乐
		musics.playPigDie();
		
		//保存用户记录
		String userName;
		userName = JOptionPane.showInputDialog(this,"Game Over!Please input your name :","anonymous");
		if(userName != null){
			Player currentPlayer = new Player(userName ,score);
			try {
				save.plays = save.loadPlayer();
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			} catch (IOException e1) {
				e1.printStackTrace();
			} catch (ClassNotFoundException e1) {
				e1.printStackTrace();
			}
			save.plays.put(currentPlayer.getCoin(), currentPlayer);
			try {
				save.savePlayer(save.plays);
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			this.dispose();
			new TopScoreFrame();
		}	else{
			System.exit(0);
		}
	}

	public static void main(String[] args) {
		new MainFrame();
	}
	
	public void mouseDragged(MouseEvent e) {}
	public void mouseMoved(MouseEvent e) {
		currentPig.mouseMoved(e);//鼠标移动同时调整猪的位置
		gear.move(e);//调整轮子图像,可惜的是,无效
	}
	
	private class  MouseLis extends MouseAdapter{
		public void mousePressed(MouseEvent e) {
			currentPig.getReady();//鼠标按下,准备发弹
		}
		public void mouseReleased(MouseEvent e) {
	        currentPig.fire();//鼠标松开,发弹
		}
	}

	@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyChar() == setting.getFireKey().charAt(0)){
			currentPig.getReady();
		}else if(e.getKeyChar() == setting.getUpKey().charAt(0)){
			currentPig.dir = "UP";	
		}else if(e.getKeyChar() == setting.getDownKey().charAt(0)){
			currentPig.dir = "DOWN";
		}
	}
	@Override
	public void keyReleased(KeyEvent e) {
		if(e.getKeyChar() == setting.getUpKey().charAt(0) ||
				e.getKeyChar() == setting.getDownKey().charAt(0)){
			currentPig.dir = "STOP";
		}else if(e.getKeyChar() == setting.getFireKey().charAt(0)){
			currentPig.fire();
		}		
	}
	@Override
	public void keyTyped(KeyEvent e) {
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -