网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 888|回复: 0
打印 上一主题 下一主题

Java项目实战之天天酷跑(五)

[复制链接]

271

主题

284

帖子

1243

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1243

最佳新人活跃会员热心会员突出贡献优秀版主

跳转到指定楼层
楼主
发表于 2021-2-24 19:34:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
四、游戏主界面接上文,接下来将实现游戏主界面,功能如下:
移动的背景图片、动态的玩家、玩家的移动功能、
五种障碍物持续出现、玩家和障碍物的碰撞、
暂停、继续功能。
首先,看一下整体效果:
动图实在太大,几秒钟的 Gif 就十几兆了。无奈,图片展示效果。
跳跃、得分、下落、障碍物:
碰到障碍物后,玩家被推着走。
下面,分别解释一下每个功能的逻辑:
1、创建一个显示窗体,承载游戏的主面板类。
GameFrame.java
  1. package cn.sqc.runday.view;

  2. import javax.swing.ImageIcon;
  3. import javax.swing.JFrame;

  4. import cn.sqc.runday.controller.GamePanel;

  5. /**
  6. * @author Huey
  7. *2020-11-27  下午12:40:22
  8. * 游戏主界面:显示窗体,承载游戏的主面板类
  9. */

  10. public class GameFrame extends JFrame {
  11.         //设置窗体宽高属性
  12.         public static final int WIDTH=1500;
  13.         public static final int HEIGHT=900;
  14.         public GameFrame() {
  15.                 //2.4创建游戏面板对象,并添加到窗体上去
  16.                 GamePanel panel = new GamePanel();
  17.                 panel.action();//程序启动的方法
  18.                 this.addKeyListener(panel);//谁实现就监听谁
  19.                 this.add(panel);
  20.                
  21.                 /**1.设置窗体基本属性*/
  22.                 this.setSize(WIDTH,HEIGHT);
  23.                 this.setLocationRelativeTo(null);
  24.                 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  25.                 this.setIconImage(new ImageIcon("Image/115.png").getImage());
  26.                 this.setUndecorated(true);
  27.                 this.setVisible(true);        
  28.         }
  29.         
  30.         public static void main(String[] args) {
  31.                 new GameFrame();
  32.         }
  33. }
复制代码

2、游戏主面板类(核心逻辑类):
背景图片滚动效果
使用两张背景图片,实现背景图片滚动效果的逻辑如下:
下面用动图演示一下:
玩家动态效果
我国早期很有名的一部动画片《大闹天宫》,由于当时没有电脑,所以需要一帧一帧的画,随后快速播放图片,形成动态的画面(我愿称之:真·动画),并为之配音,短短10分钟的动画却要画7000到10000张原画!
而此处,我们的玩家的奔跑姿态,同理是由九张图片构成。
下面动图演示:
下面是实现玩家的(生成、移动、绘制)的基本代码,后面的障碍物的实现,也都遵循这一编写逻辑。
为更方便读懂代码,已尽力注释,若仍有不清楚的地方,欢迎留言交流。
Person.java
  1. package cn.sqc.runday.model;

  2. import java.awt.Graphics;
  3. import java.awt.Image;
  4. import java.io.File;
  5. import java.io.IOException;

  6. import javax.imageio.ImageIO;

  7. import cn.sqc.runday.view.GameFrame;

  8. /**
  9. * @author Huey
  10. * @date 2020-11-23
  11. * 玩家的实体类
  12. */
  13. public class Person {//1.声明属性
  14.         private Image image;//1.1 玩家当前显示图片
  15.         private Image[] images;//1.2 玩家所有图片
  16.         
  17.         public static final int WIDTH = 120;//1.3玩家宽高
  18.         public static final int HEIGHT = 120;
  19.         
  20.         //1.4玩家初始位置坐标
  21.         private int x,y;
  22.         int index;//下面用作切换图片
  23.         //玩家得分
  24.         private int score;
  25.         //玩家跑酷距离
  26.         private int distance;
  27.         
  28.         public Person() {//2.赋值
  29.                 //给图片数组images赋值
  30.                 init();//2.1        先写,会提示要不要实现!自动生成方法
  31.                 //默认当前显示图片位第一张图片 2.6
  32.                 image = images[0];
  33.                
  34.                 x = 90;//2.7
  35.                 y = 580;//脚踩地板
  36.                 index = 0;
  37.                 score = 0;
  38.                 distance = 0;
  39.         }
  40.         //玩家自由下落方法5.1
  41.         public void drop() {
  42.                 y += 5;
  43.                 if(y>=580){// 下落归下落,也得温柔点,不能让小人儿踩破了地板
  44.                         y = 580;
  45.                 }
  46.         }
  47.         //玩家移动的方法
  48.         public void step(){
  49.                 //玩家图片的切换
  50.                 image = images[index ++ /3%images.length];
  51.                 //玩家坐标改变(玩家坐标通过键盘控制,此次不做处理)
  52.         }
  53.         //绘制玩家的方法
  54.         public void paintPerson(Graphics g){
  55.                 g.drawImage(image, x, y, WIDTH, HEIGHT, null);
  56.         }

  57.         //判断玩家是否越界的方法
  58.         public boolean outOfBounds(){
  59.                 return this.x >= GameFrame.WIDTH || this.x <= -WIDTH;
  60.         }
  61.         private void init() {//2.2
  62.                 images = new Image[9];
  63.                 for(int i = 0; i<images.length; i++){//2.3
  64.                         try {//2.5
  65.                                 images[i] = ImageIO.read(new File("Image/"+(i+1) + ".png"));//2.4
  66.                         } catch (IOException e) {//2.5
  67.                                 // TODO Auto-generated catch block
  68.                                 e.printStackTrace();
  69.                         }
  70.                 }
  71.         }
  72. //2.8  右键,Source,GGAS
  73.         public Image getImage() {
  74.                 return image;
  75.         }

  76.         public void setImage(Image image) {
  77.                 this.image = image;
  78.         }

  79.         public Image[] getImages() {
  80.                 return images;
  81.         }

  82.         public void setImages(Image[] images) {
  83.                 this.images = images;
  84.         }

  85.         public int getX() {
  86.                 return x;
  87.         }

  88.         public void setX(int x) {
  89.                 this.x = x;
  90.         }

  91.         public int getY() {
  92.                 return y;
  93.         }

  94.         public void setY(int y) {
  95.                 this.y = y;
  96.         }

  97.         public static int getWidth() {
  98.                 return WIDTH;
  99.         }

  100.         public static int getHeight() {
  101.                 return HEIGHT;
  102.         }
  103.         public int getIndex() {
  104.                 return index;
  105.         }
  106.         public void setIndex(int index) {
  107.                 this.index = index;
  108.         }
  109.         public int getScore() {
  110.                 return score;
  111.         }
  112.         public void setScore(int score) {
  113.                 this.score = score;
  114.         }
  115.         public int getDistance() {
  116.                 return distance;
  117.         }
  118.         public void setDistance(int distance) {
  119.                 this.distance = distance;
  120.         }
  121.         
  122. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-4-23 15:42 , Processed in 0.084523 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表