📄 mainframe.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 + -