• java游戏制作-飞翔的鸟游戏


    一.准备工作

    首先创建一个新的Java项目命名为“飞翔的鸟”,并在src中创建一个包命名为“com.qiku.bird",在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”,并向需要的图片素材导入到包内。

    二.代码呈现

    1. package com.qiku.bird;
    2. import javax.imageio.ImageIO;
    3. import java.awt.image.BufferedImage;
    4. import java.io.IOException;
    5. /*
    6. * 小鸟类
    7. * */
    8. public class Bird {
    9. int x;// 坐标
    10. int y;
    11. int width; // 宽高
    12. int height;
    13. BufferedImage image; // 图片
    14. BufferedImage[] images; // 小鸟所有图片
    15. public Bird() {
    16. // 初始化数组 保存八张图片
    17. images = new BufferedImage[8];
    18. // 使用循环结构 将小鸟所有图片 存入数组
    19. for (int i = 0; i < images.length; i++) {
    20. try {
    21. images[i] = ImageIO.read(Bird.class.getResourceAsStream(i + ".png"));
    22. } catch (IOException e) {
    23. e.printStackTrace();
    24. }
    25. }
    26. image = BirdGame.bird_image;
    27. width = image.getWidth();
    28. height = image.getHeight();
    29. x = 120;
    30. y = 240;
    31. }
    32. // 小鸟飞翔的方法
    33. int index = 0;
    34. public void fly() {
    35. image = images[index % images.length];
    36. index++;
    37. }
    38. // h = v * t + g * t * t / 2
    39. int g = 6; //重力加速度
    40. double t = 0.15; // 下落时间
    41. double v = 0; // 初速度
    42. double h = 0; // 下落距离
    43. //小鸟下落一次
    44. public void down() {
    45. h = v * t + g * t * t / 2; // 具体下落的距离
    46. v = v + g * t; // 末速度 = 当前速度 + 重力加速度 * 时间
    47. y += (int) h;
    48. }
    49. // 小鸟向上飞
    50. public void up() {
    51. // 给一个 负方向的初速度
    52. v = -30;
    53. }
    54. /*
    55. * 小鸟撞地面
    56. * */
    57. public boolean hitGround(Ground ground) {
    58. boolean isHit = this.y + this.height >= ground.y;
    59. return isHit;
    60. }
    61. // 小鸟撞天花板
    62. public boolean hitCeiling() {
    63. boolean isHit = this.y <= 0;
    64. return isHit;
    65. }
    66. // 小鸟撞柱子
    67. public boolean hitColumn(Column c) {
    68. boolean b1 = this.x + this.width >= c.x;
    69. boolean b2 = this.x <= c.x + c.width;
    70. boolean b3 = this.y <= c.y + c.height / 2 - c.gap / 2;
    71. boolean b4 = this.y + this.height >= c.y + c.height / 2 + c.gap / 2;
    72. // 满足b1 b2表示水平方向 相撞 b1 b2 b3 同时满足 撞上柱子 b1 b2 b4 同时满足撞下柱子
    73. return b1 && b2 && (b3 || b4);
    74. }
    75. }

    1. package com.qiku.bird;
    2. import javax.imageio.ImageIO;
    3. import javax.swing.*;
    4. import java.awt.*;
    5. import java.awt.event.KeyAdapter;
    6. import java.awt.event.KeyEvent;
    7. import java.awt.event.MouseAdapter;
    8. import java.awt.event.MouseEvent;
    9. import java.awt.image.BufferedImage;
    10. import java.io.IOException;
    11. /**
    12. * 游戏启动类
    13. * 使用extends 关键字 继承JPanel 画板类 ==> 于是BirdGame 就具备了画板类的功能
    14. */
    15. public class BirdGame extends JPanel {
    16. // 定义游戏状态
    17. public static final int START = 0; // 开始
    18. public static final int RUNNING = 1; // 运行
    19. public static final int GAME_OVER = 2; // 结束
    20. // 游戏当前状态 默认0 开始状态
    21. int state = START;
    22. int score = 0; //玩家得分
    23. static BufferedImage bg = null; // 背景图片
    24. static BufferedImage start = null; //开始图片
    25. static BufferedImage ground_image = null; // 地面
    26. static BufferedImage bird_image = null; // 小鸟
    27. static BufferedImage column_image = null; // 柱子
    28. static BufferedImage gameOver_image = null; // game游戏
    29. // 静态代码块 一般用于加载静态资源(视频,音频,图片等)
    30. static {
    31. // 将本地的图片bg.png读取到程序中的bg
    32. try {
    33. bg = ImageIO.read(BirdGame.class.getResourceAsStream("bg.png"));
    34. start = ImageIO.read(BirdGame.class.getResourceAsStream("start.png"));
    35. ground_image = ImageIO.read(BirdGame.class.getResourceAsStream("ground.png"));
    36. column_image = ImageIO.read(BirdGame.class.getResourceAsStream("column.png"));
    37. bird_image = ImageIO.read(BirdGame.class.getResourceAsStream("0.png"));
    38. gameOver_image = ImageIO.read(BirdGame.class.getResourceAsStream("gameover.png"));
    39. } catch (IOException e) {
    40. e.printStackTrace();
    41. }
    42. }
    43. Ground ground;//声明地面
    44. Bird bird;
    45. Column column1;
    46. Column column2;
    47. // BirdGame 的构造方法
    48. public BirdGame() {
    49. bird = new Bird();
    50. ground = new Ground();
    51. column1 = new Column();
    52. column2 = new Column();
    53. // 柱子2的x坐标 = 柱子1的坐标基础上+244保持水平间距
    54. column2.x = column1.x + column1.distance;
    55. }
    56. /*
    57. * 用于在画板上绘制内容的方法
    58. * 想在画板上显示什么 在这个方法写就行了
    59. * @param g 画笔
    60. * */
    61. @Override
    62. public void paint(Graphics g) {
    63. // g.fillRect(0,0,100,200); // 设置颜色落笔点 宽高
    64. g.drawImage(bg, 0, 0, null); // 画背景
    65. if (state == START) {
    66. g.drawImage(start, 0, 0, null); // 开始图片
    67. }
    68. g.drawImage(column1.image, column1.x, column1.y, null); // 画柱子
    69. g.drawImage(column2.image, column2.x, column2.y, null); // 画柱子2
    70. g.drawImage(bird.image, bird.x, bird.y, null); //小鸟图片
    71. g.drawImage(ground.image, ground.x, ground.y, null); // 地面图片
    72. if (state == GAME_OVER) {
    73. g.drawImage(gameOver_image, 0, 0, null); // 结束图片
    74. }
    75. // 画分数
    76. Font font = new Font("微软雅黑", Font.BOLD, 25); // 创建字体
    77. g.setFont(font); // 给画笔设置字体
    78. g.setColor(Color.BLACK); // 设置字体黑色颜色
    79. g.drawString("分数: " + score, 30, 50);
    80. g.setColor(Color.WHITE); // 设置字体白色颜色
    81. g.drawString("分数: " + score, 28, 48);
    82. }
    83. // 判断小鸟与柱子是否相撞 游戏结束
    84. public boolean isGameOver() {
    85. boolean isHit = bird.hitGround(ground) || bird.hitCeiling() || bird.hitColumn(column1) || bird.hitColumn(column2);
    86. return isHit;
    87. }
    88. // 游戏流程控制的方法
    89. public void action() throws Exception {
    90. frame.addKeyListener(new KeyAdapter() {
    91. @Override
    92. public void keyPressed(KeyEvent e) {
    93. System.out.println(e.getKeyCode());
    94. if(e.getKeyCode() == 32){
    95. if (state == START) { // 如果是开始状态 单击转换运行
    96. state = RUNNING;
    97. }
    98. if (state == RUNNING) {
    99. bird.up(); //小鸟上升
    100. }
    101. if (state == GAME_OVER) {
    102. bird = new Bird();
    103. column1 = new Column();
    104. column2 = new Column();
    105. column2.x = column1.x + column1.distance;
    106. score = 0;
    107. state = START;
    108. }
    109. }
    110. }
    111. });
    112. // 给当前对象()添加鼠标单击事件
    113. this.addMouseListener(new MouseAdapter() {
    114. @Override
    115. public void mouseClicked(MouseEvent e) { // 鼠标单击执行代码
    116. if (state == START) { // 如果是开始状态 单击转换运行
    117. state = RUNNING;
    118. }
    119. if (state == RUNNING) {
    120. bird.up(); //小鸟上升
    121. }
    122. if (state == GAME_OVER) {
    123. bird = new Bird();
    124. column1 = new Column();
    125. column2 = new Column();
    126. column2.x = column1.x + column1.distance;
    127. score = 0;
    128. state = START;
    129. }
    130. }
    131. });
    132. // 死循环 {}的代码会一直反复执行
    133. while (true) {
    134. if (state == START) {
    135. ground.step(); // 地面移动
    136. bird.fly(); // 小鸟飞翔
    137. } else if (state == RUNNING) {
    138. ground.step(); // 地面移动
    139. column1.step(); // 柱子1移动
    140. column2.step(); // 柱子2移动
    141. bird.fly(); // 小鸟飞翔
    142. bird.down(); // 小鸟下落
    143. if (isGameOver() == true) {
    144. state = GAME_OVER;
    145. }
    146. // 设置增加分数
    147. if (bird.x == column1.x + column1.width + 1 || bird.x == column2.x + column2.width + 1) {
    148. score +=5;
    149. }
    150. }
    151. repaint(); //重画 即重新执行paint 方法
    152. Thread.sleep(10); //每隔10毫秒,让程序休眠一次
    153. }
    154. }
    155. static JFrame frame = new JFrame();
    156. // main方法 - 程序的入口(即:有main方法 程序才能运行)
    157. public static void main(String[] args) throws Exception {
    158. BirdGame game = new BirdGame(); // 创建画板对象
    159. frame.setSize(432, 644);//设置宽高
    160. frame.setLocationRelativeTo(null); // 居中显示
    161. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口,同时使程序结束
    162. frame.setVisible(true); //设置可见性
    163. frame.add(game); // 将画板放到画框上
    164. frame.setTitle("飞翔的小鸟");// 设置标题
    165. frame.setResizable(false);// 设置不允许玩家拖动界面
    166. // 调用action
    167. game.action();
    168. }
    169. }

    1. package com.qiku.bird;
    2. import java.awt.image.BufferedImage;
    3. /*
    4. * 柱子类
    5. * */
    6. public class Column {
    7. int x;// 坐标
    8. int y;
    9. int width; // 宽高
    10. int height;
    11. BufferedImage image; // 图片
    12. int gap; //上下柱子之间的间隙
    13. int distance; //水平方向柱子之间的距离
    14. int min = -(1200 / 2 - 144 / 2);
    15. int max = 644 - 146 - 144 / 2 - 1200 / 2;
    16. public Column() {
    17. gap = 144;
    18. distance = 244;
    19. image = BirdGame.column_image;
    20. width = image.getWidth();
    21. height = image.getHeight();
    22. x = BirdGame.bg.getWidth();
    23. y = (int) (Math.random() * (max - min) + min);
    24. }
    25. public void step() {
    26. x--;
    27. if (x <= -width) {
    28. x = BirdGame.bg.getWidth();
    29. y = (int) (Math.random() * (max - min) + min);
    30. }
    31. }
    32. }

    1. package com.qiku.bird;
    2. import java.awt.image.BufferedImage;
    3. /*
    4. * 地面类
    5. * */
    6. public class Ground {
    7. int x ;// 地面坐标
    8. int y ;
    9. int width ; // 地面的宽高
    10. int height;
    11. BufferedImage image; // 地面图片
    12. public Ground(){
    13. image = BirdGame.ground_image;
    14. x = 0;
    15. y = BirdGame.bg.getHeight() - image.getHeight();
    16. width = image.getWidth();
    17. height = image.getHeight();
    18. }
    19. /*
    20. * 地面走一步的方法
    21. * */
    22. public void step(){
    23. x--;
    24. if(x <= 432 - width){
    25. x=0;
    26. }
    27. }
    28. }

    三.结果呈现

             

  • 相关阅读:
    【MySQL】一文学会所有MySQL基础知识以及基本面试题
    1.1小程序内置tabbar和自定义tabbar区别
    AI在材料科学中的应用
    CentOS7开机启动 jar包
    python简单制作whl安装包
    stl算法的使用(函数及谓词)
    大学生没有项目经验该怎么拿测开岗位的office?
    VirtualBox配置Centos7双网卡固定IP
    [《南国雪下》闲笔记事集]2010年12月15日 记雪
    数据分析实际案例之:pandas在餐厅评分数据中的使用
  • 原文地址:https://blog.csdn.net/OYFYO/article/details/134560305