前言
一个简单的单机小游戏:flypybird ,用来巩固java基础。
涉及主要知识点:JFrame 、 JPanel 、 继承、 键盘/鼠标监听 、 多线程 、 工具类设计
提示:这是大致的实现过程,实际实现过程有一定的修改,具体以源码为准。
一、大体思路
1、首先要有一个框架,作为主程序入口,这里使用 JFrame 类。
2、然后需要有一个画布,用来把游戏场景画上去,然后在上面添加键盘/鼠标监听来控制,这里使用的是 JPenal 类。
3、需要创建几个类:小鸟、地面、障碍物柱子、一个获取图片的工具类
4、然后逐步添加到画布中,实现对应的功能
二、具体步骤
2.1 创建窗体类
相当于窗户的框架,有了框架才能装玻璃。然后也是主程序执行的入口
2.1.1 具体代码
public class MainFrame extends JFrame { /* 图标 */ BufferedImage Icon; /* * 构造器用来初始化框架*/ public MainFrame() throws IOException { /* 设置图标 */ Icon = ImageUtil.getImage("bird1_1.png"); setIconImage(Icon); /* 设置关闭 */ setDefaultCloseOperation(EXIT_ON_CLOSE); /* 设置标题 */ setTitle("飞翔的小鸟"); /* 设置尺寸*/ setSize(298, 550); /* 设置大小不可变 */ setResizable(false); /* 设置窗体居中 */ setLocationRelativeTo(null); } /* * 主程序 * */ public static void main(String[] args) throws IOException { MainFrame mainFrame = new MainFrame(); mainFrame.setVisible(true); } }
2.1.2 效果展示
2.1.3 小结
大体框架做好,考虑到后面还需要使用比较多的图片,因此接下来先建一个工具类,用来获取图片资源。
三、创建一个获取图片的工具类
3.1 具体代码
/* * 工具类,用来获取图片 * */ public class ImageUtil { public static BufferedImage getImage(String name) throws IOException { return ImageIO.read(new BufferedInputStream(new FileInputStream("birdGame/flyBird/" + name))); } }
3.2 小结
图片获取方式改为用工具类获取,只需要输入图片名+格式。后期方便减少重复代码的书写。
四、创建画布
使用 Jpanel 类,创建画布(相当于玻璃) ,就能在上面画游戏的画面了。后期还需要在上面添加鼠标/键盘监听。
4.1 具体代码
public class GameJPenal extends JPanel { /* * 各种参数应该设置在这 * */ BufferedImage bg; /* * 构造方法用来完成数据的初始化 * */ public GameJPenal() throws IOException { bg = ImageUtil.getImage("bg_day.png"); } /* * 开始游戏的方法 * */ public void start() { gameStart = true; Thread myThread = new Thread(new MyThread()); myThread.start(); } //绘制的方法 @Override public void paint(Graphics g) { g.drawImage(bg, 0, 0, 288, 512, null); //背景 } }
4.2 效果展示
先在main方法中创建对象,把画布添加到框架里面,注意要重新在最后设置可见,否者看不到背景
/* * 主程序 * */ public static void main(String[] args) throws IOException { MainFrame mainFrame = new MainFrame(); GameJPenal gameJPenal = new GameJPenal(); mainFrame.add(gameJPenal); /* 画布添加到框<strong>本文来源gaodai#ma#com搞@@代~&码*网2</strong>架上 */ mainFrame.setVisible(true); gameJPenal.requestFocus(); /* 请求屏幕焦点 ,否则无法实现键盘监听 */ }