Java 您所在的位置:网站首页 drew小恐龙正品细节图 Java

Java

2024-06-18 03:27| 来源: 网络整理| 查看: 265

奔跑的小恐龙游戏是一款非常简单的跑酷游戏,玩家通过控制小恐龙向前狂奔,通过空格键进行跳跃躲避沿途出现的牛仔、木桶和飞行的老鹰,使用上下箭头控制奔跑的速度,跑的越远,得分越高。游戏内添加有背景音乐、跳跃音效和撞击音效。代码虽然较长,但结构简单,易于理解,适合初学者进行学习。

文章目录

详细代码:

一、启动包

1.开始类 Start

二、模型包

1.恐龙类 Dinosaur

2.障碍物类 Obstacle

三、服务包

1.刷新帧线程类 FreshThread

2.音乐播放器类 MusicPlayer

3.分数记录器类 ScoreRecorder

4.音效类 Sound

四、视图包

1.背景图像类 BackgroundImage

2.游戏面板类 GamePanel

3.主窗体类 MainFrame

4.成绩对话框类 ScoreDialog

五、其它

1、data文件夹数据:

2、music文件音效:

3、image文件图像:

总体代码架构:

详细代码: 一、启动包

       游戏开始类调用游戏主窗体类。而游戏面板类对开始界面进行了窗体,窗口设计并调用了游戏主体窗口类启动游戏。

1.开始类 Start

Start.java

package pers.wu.main; //启动包 import pers.wu.view.MainFrame; //启动类 public class Start { public static void main(String[] args) { MainFrame m1 = new MainFrame();//创建主窗体 m1.setVisible(true);//显示主窗体 } } 二、模型包

       模型包类中对恐龙类和障碍物类进行了基本定义,恐龙类中包含对象恐龙的图片,坐标,恐龙跳跃的变量与状态与刷新时间。之后设置了如踏步,跳跃,加减速,移动和边界获取的方法。而在障碍物类中包含对对象牛仔、对象木桶和对象老鹰的图片,坐标和图片移动的速度,也设置了与之对应的方法,有移动,移除和边界获取的基本定义。

1.恐龙类 Dinosaur

Dinosaur.java 

package pers.wu.modles;//模型包 import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; //import javax.xml.crypto.dsig.keyinfo.RetrievalMethod; import pers.wu.service.FreshThread; import pers.wu.service.Sound; //恐龙类 public class Dinosaur { public BufferedImage image; //主图片 private BufferedImage image1,image2,image3; //跑步图片 public int x,y; //坐标 private int jumpValue = 0; //跳跃的增变量 private boolean jumpState = false; //跳跃状态 private int stepTimer = 0; //踏步计时器 private final int JUMP_HEIGHT = 130; //跳起最大高度 private final int LOWEST_Y = 180; //落地最低坐标 private final int FREASH = FreshThread.FREASH; //刷新时间 public Dinosaur() { this.x = 50;//恐龙的横坐标 固定的横位置50 this.y = LOWEST_Y;//恐龙的纵坐标 try { image1 = ImageIO.read(new File("image/konglong1.png"));//读取恐龙的图片 image2 = ImageIO.read(new File("image/konglong2.png")); image3 = ImageIO.read(new File("image/konglong3.png")); } catch (IOException e) { e.printStackTrace(); } } //实现图片的切换 private void step() { //每过250毫秒,更换一张图片。因为有3张,所以除以3取余,轮流 int temp = (stepTimer / 250) % 3; //取余数 switch (temp) { case 1: image = this.image1; break; case 2: image = this.image2; break; default: image = this.image3; break; } stepTimer += FREASH;//计时器递增 } //实现恐龙的跳跃 public void jump() { if (!jumpState)//!false { Sound.jump(); //播放跳跃的音效 } jumpState = true; //开始跳跃 } //实现恐龙跳起后的落地 public void move() //x=50 y最低 也是向下的最大坐标 { step();//不断踏步 if (jumpState)//如果正在跳跃 最上面为0 越往下坐标越大 { if (y >= LOWEST_Y)//如果纵坐标大于等于最低点---(越往上坐标越小) { jumpValue = -4;//增变量为负值--向上跳 } if (y = LOWEST_Y)//如果再次落地 { jumpState = false; //停止跳跃 } } } //恐龙头和脚部都画一个矩形 已所取矩形的左上角为基础获得恐龙的边界 来用于后面的碰撞检测 public Rectangle getFootBounds()//获取恐龙的脚步边界对象 x,y左上角坐标 { return new Rectangle(x+30,y+59,29,18);//用于后续做碰撞检测 } public Rectangle getHeadBounds()//获取恐龙的头部边界对象 { return new Rectangle(x+66,y+25,32,22);//new Rectangle(x,y,width,height) } } 2.障碍物类 Obstacle

Obstacle.java

package pers.wu.modles;//模型包 import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import pers.wu.view.GamePanel; //障碍类 public class Obstacle { public int x,y; //横纵坐标 public BufferedImage image; //主图片 private BufferedImage cask; //木桶 private BufferedImage cowboy;//牛仔 private BufferedImage eagle;//老鹰 private int speed;//障碍的横坐标移动速度 public Obstacle() { try { cask = ImageIO.read(new File("image/cask.png"));//木桶图片 cowboy = ImageIO.read(new File("image/cowboy.png"));//牛仔图片 eagle = ImageIO.read(new File("image/eagle.png"));//读取老鹰的图片 } catch (IOException e) { e.printStackTrace(); } Random r1 = new Random();//创建随机对象 if (r1.nextInt(3) == 0)//从0、1、2中取一值 [0,3) { image = cowboy; //为0,采用牛仔图片 } else if(r1.nextInt(3) == 1) { image = cask; //为1,采用木桶图片 } else { image = eagle;//采用老鹰图片 } x = 800;//障碍初始横坐标 if(image==cowboy||image==cask) { y = 280 - image.getHeight();//纵坐标--使牛仔和木桶处于地平线上 }else { y = 250 - image.getHeight();//纵坐标--使老鹰飞在空中 } //speed = GamePanel.SPEED1; } //障碍物的横坐标移动 public void move() { speed = GamePanel.SPEED1; x -=speed;//横坐标递减--障碍物的速度与背景的速度一致 } //实现障碍物移出游戏界面的操作 public boolean isLive()//如果移出了游戏界面 { if (x = 0)//如果读出有效数据--auLine=混频器源数据行 { auLine.write(auBuffer, 0, byteCount);//将有效数据写入数据行中 } } }catch (IOException e) { e.printStackTrace(); } catch (UnsupportedAudioFileException e) { e.printStackTrace(); } catch (LineUnavailableException e) { e.printStackTrace(); }finally { auLine.drain();//清空数据行 auLine.close();//关闭数据行 } } while (circulate);//根据循环标志判断是否循环播放 } public void play()//播放 { thread = new Thread(this);//创建线程对象 thread.start();//开启线程 } @SuppressWarnings("deprecation") public void stop()//停止播放 { thread.stop();//强制关闭线程 } } 3.分数记录器类 ScoreRecorder

ScoreRecorder.java

package pers.wu.service;//服务包 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.Arrays; //分数记录器类 public class ScoreRecorder { private static final String SCOREFILE = "data/source"; //成绩记录文件 private static int scroes[] = new int[3]; //当前得分最高前三名 public static void init() { File file1 = new File(SCOREFILE);//创建记录文件 if (!file1.exists())//如果文件不存在 { try { file1.createNewFile();//创建新文件 } catch (IOException e) { e.printStackTrace(); } return;//停止方法 } FileInputStream fileInputStream1 = null;//文件字节 InputStreamReader inputStreamReader1 = null;//字符流 BufferedReader bufferedReader1 = null;//缓冲字符流 try { fileInputStream1 = new FileInputStream(file1); //文件字节输入流 inputStreamReader1 = new InputStreamReader(fileInputStream1); //字节流转字符流 bufferedReader1 = new BufferedReader(inputStreamReader1); //缓冲字节流 String value = bufferedReader1.readLine(); //读取一行 if (!(value ==null || "".equals(value))) //如果不为空 { String vs[] = value.split(","); //分隔字符串 if (vs.length < 3) //如果分割结果小于3 { Arrays.fill(scroes, 0); //数组成绩填充0 } else { for (int i = 0; i < 3; i++) { //将记录文件中的值赋给当前分数数组 scroes[i] = Integer.parseInt(vs[i]); } } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally //依次关闭流 { try { bufferedReader1.close(); } catch (IOException e2) { e2.printStackTrace(); } try { inputStreamReader1.close(); } catch (IOException e2) { e2.printStackTrace(); } try { fileInputStream1.close(); } catch (IOException e2) { e2.printStackTrace(); } } } //保存分数 public static void saveScore() { String value = scroes[0] + "," + scroes[1] + "," + scroes[2]; //拼接得分数组 FileOutputStream fileOutputStream1 = null;//文件字节 OutputStreamWriter outputStreamWriter1 = null;//字符流 BufferedWriter bufferedWriter1 = null;//缓冲字符流 try { fileOutputStream1 = new FileOutputStream(SCOREFILE);//文件字节输出流 outputStreamWriter1 = new OutputStreamWriter(fileOutputStream1);//字符流转字符流 bufferedWriter1 = new BufferedWriter(outputStreamWriter1);//缓冲字符流 bufferedWriter1.write(value);//写入拼接后的字符串 bufferedWriter1.flush();//字符流刷新 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally //依次关闭流 { try { bufferedWriter1.close(); } catch (IOException e2) { e2.printStackTrace(); } try { outputStreamWriter1.close(); } catch (IOException e2) { e2.printStackTrace(); } try { fileOutputStream1.close(); } catch (IOException e2) { e2.printStackTrace(); } } } //新分数 添加分数,如果新添加的分数比排行榜分数高,则会将新分数记入排行榜 static public void addNewScore(int score) { //在得分组数基础上创建一个长度为4的临时数组 int temp[] = Arrays.copyOf(scroes, 4); temp[3] = score;//将新分数赋值给第四个元素 Arrays.sort(temp);//临时数组降序排列 scroes = Arrays.copyOfRange(temp, 1, 4);//将后三个元素赋值给得分数组 } //获取分数 static public int[] getScores() { return scroes; } } 4.音效类 Sound

Sound.java

package pers.wu.service;//服务包 import java.io.FileNotFoundException; //音效类 public class Sound { static final String DIR = "music/";//音乐文件夹 static final String BACKGROUD = "background.wav";//背景音乐 static final String JUMP = "jump.wav";//跳跃音效 static final String HIT = "hit.wav";//撞击音效 //播放声音,参数1(file)音乐文件完整名称,参数2(circulate)是否循环播放 private static void play(String file,boolean circulate) { try { MusicPlayer player = new MusicPlayer(file, circulate);//创建播放器 player.play();//播放器开始播放 } catch (FileNotFoundException e) { e.printStackTrace(); } } //播放跳跃音效 static public void jump() { play(DIR+JUMP, false);//播放一次跳跃音效 } //播放撞击音效 static public void hit() { play(DIR+HIT, false);//播放一次撞击音效 } //播放背景音乐 static public void backgroud() { play(DIR+BACKGROUD, true);//循环播放背景音乐 } } 四、视图包

       视图包包括游戏背景类,游戏面板类,主体窗口类,计分面板类类。游戏背景类中设置了背景图的滚动。游戏面板类中设置了对背景图的载入,调用实体类,背景类和音效类中的音效并对各类赋予了图片绘制方法,初始化恐龙和障碍物以及启动线程方法,遍历障碍方法,计分方法,游戏结束判定方法和恐龙跳跃输入方法。游戏主体窗口类对游戏窗体与窗口进行设计并对重新开始方法进行设计与监听。计分面板类对计分面板窗体与窗口进行设计。

1.背景图像类 BackgroundImage

BackgroundImage.java

package pers.wu.view;//视图包 import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; //滚动背景 public class BackgroundImage { public BufferedImage image;//背景图片 private BufferedImage image1,image2;//滚动的两张图片 private Graphics2D g2d;//背景图片的绘图对象 public int x1,x2;//两个滚动图片的坐标 public BackgroundImage() { try { image1 = ImageIO.read(new File("image/beijing.png"));//读取背景图片 image2 = ImageIO.read(new File("image/beijing.png")); } catch (IOException e) { e.printStackTrace(); } //主图片采用宽2000高500的彩色图片 image = new BufferedImage(2000, 500, BufferedImage.TYPE_INT_RGB); g2d = image.createGraphics(); //获取主图片绘图对象 x1 = 0; //第一幅图片初始横坐标为0 x2 = 800;//第二副图初始横坐标为800 g2d.drawImage(image1, x1, 0, null); } //实现背景的图片滚动 public void roll() { int SPEED = GamePanel.SPEED1; x1 -= SPEED;//第一幅图片左移 x2 -= SPEED;//第二幅图片左移 if (x1 = 500)//每过500毫秒 { score += 10;//加十分 scoreTimer = 0;//重新计时 } g2d.setColor(Color.BLACK);//使用黑色 g2d.setFont(new Font("黑体",Font.BOLD,24));//设置字体 g2d.drawString(String.format("NOW%06d", score), 670, 30);//绘制分数 g2d.drawString(String.format("SPEED/%02d",SPEED1), 420, 30);//绘制最大分数 越小越往左 } //重写绘制组件方法 public void paint(Graphics g) { paintImage();//绘制主图片内容 g.drawImage(image1, 0, 0, this); } //游戏是否结束 public boolean isFinish() { return finish; } //使游戏结束 public void gameOver() { ScoreRecorder.addNewScore(score);//记录当前分数 finish = true; } //键盘事件 public void keyPressed(KeyEvent e) { int code = e.getKeyCode();//获取按下的按键值 if (code == KeyEvent.VK_SPACE)//如果是空格 { golden1.jump();//恐龙跳跃 }else if(code == KeyEvent.VK_UP)//如果是↑ { SPEED1=SPEED1+1;//速度加1 }else if(code == KeyEvent.VK_DOWN)//如果是↓ { if(SPEED1-1


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有