实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.plane.game; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.LayoutManager; import java.awt.Rectangle; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * * 这是游戏的主体类 继承JFrame类 * * 游戏运行环境JDK1.8.0_191 * * @author 高一桐 * */ public class MainGame extends JFrame { /** * 定义一些变量 画布 飞机 子弹 * */ Image bg = GameUtil.getImage("images/bg.jpg"); Plane plane = new Plane("images/plane02.jpg", 108, 173); List bulletList = new ArrayList(); // 计时功能 Date starTime; Date endTime; Date countTime; // 子弹数 int bulletNum = 10; // 1秒=1000毫秒,40毫秒表示一秒钟重画25次 int gameSpeed = 400; public int getGameSpeed() { return gameSpeed; } public void setGameSpeed(int gameSpeed) { this.gameSpeed = gameSpeed; } // 游戏状态,游戏结束时 改为false; boolean gameState = true; /** * 加载游戏,画出窗口界面 */ public void loadGame() { // 设置标题 String titileString = "飞机 vs 子弹"; setTitle(titileString); // 设置窗口尺寸 setSize(700, 700); // 设置窗口出现横纵坐标 setLocation(200, 20); // 设置背景色 setBackground(new Color(1, 1, 1)); // 禁止拉边框拉长拉断 setResizable(false); // 添加菜单功能 setJMenuBar(new GameMenuBar(this)); //添加 Button 组合 //setLocationRelativeTo(new ButtonComBox(this)); // 启动重画线程 new PaintThread().start(); // 设置窗口可以关闭 addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); // 设置窗口可见 setVisible(true); } /** * 加载游戏,监听按键,创建子弹数量 */ public void launchFrame() { loadGame(); addKeyListener(new KeyMoniter()); // 启动重画线程 new PaintThread().start(); // 集合里 放进去个子弹 for (int i = 0; i < bulletNum; i ) { Bullet bullet = new Bullet(); bulletList.add(bullet); } starTime = new Date(); } /** * 往画布 上画 图像 */ @Override public void paint(Graphics g) { // 调用super.paint(g)去清除运动的痕迹 super.paint(g); // 画 背景图 g.drawImage(bg, 0, 0, null); // 发现 这个图像 一直在闪怎么解决使用缓冲技术就可以下边的方法就是 // 画出来飞机,飞机画在背景上飞机的位置就确定了。 plane.draw(g); // 更新飞机每次出现的时间 countTime = new Date(); // 然后把子弹放进去基本就可以了 if (gameState) { for (int i = 0; i < bulletList.size(); i ) { Bullet b = (Bullet) bulletList.get(i); b.draw(g); // 循环判断 每一个子弹 是否 和 飞机 发生 重叠 // 获取子弹的 范围 Rectangle bulletRectangle = new Rectangle((int) b.x, (int) b.y, b.width, b.height); // 获取飞机的范围 Rectangle planeRectangle = new Rectangle((int) plane.x, (int) plane.y, plane.width, plane.height); // 检测是否碰撞 boolean collide = bulletRectangle.intersects(planeRectangle); // 如果中弹 就牺牲了。。。 if (collide) { plane.setLive(false); endTime = new Date(); gameState = false; } } } /** * 游戏中计时效果 */ if (plane.isLive()) { int count_time = (int) (countTime.getTime() - starTime.getTime()) / 1000; printInfo(g, "游戏时间" count_time "秒", 20, 510, 50); } /** * 结束游戏 */ if (!plane.isLive()) { printInfo(g, "游戏结束", 30, 160, 200); int survivalTime = (int) (endTime.getTime() - starTime.getTime()) / 1000; printInfo(g, "生存时间:" survivalTime "秒", 20, 220, 300); switch (survivalTime / 10) { case 0: printInfo(g, "你的游戏天赋 是 - ∞嘛", 30, 310, 400); break; case 1: printInfo(g, "你可以做的更好,加油!", 30, 310, 400); break; case 2: printInfo(g, "还不赖嘛!", 30, 310, 400); break; case 3: printInfo(g, "高手在哈工大啊!!!", 30, 310, 400); break; default: printInfo(g, "你已经超神了!!!", 30, 310, 400); } } } /** * 双缓冲技术,消除图像的闪烁 */ Image ImageBuffer = null; Graphics GraImage = null; // 覆盖update方法,截取默认的调用过程 public void update(Graphics g) { // 创建图形缓冲区 ImageBuffer = createImage(this.getWidth(), this.getHeight()); // 获取图形缓冲区的图形上下文 GraImage = ImageBuffer.getGraphics(); // 用paint方法中编写的绘图过程对图形缓冲区绘图 paint(GraImage); // 释放图形上下文资源 GraImage.dispose(); // 将图形缓冲区绘制到屏幕上 g.drawImage(ImageBuffer, 0, 0, this); } /** * 内部类,监听 飞机的按键 * * @author 高一桐 * */ class KeyMoniter extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { plane.KeyPressedControlDirection(e); } @Override public void keyReleased(KeyEvent e) { plane.KeyRelasedControlDirection(e); } } /** * 在屏幕上打印输出内容 * * @param g * @param message * @param size */ public void printInfo(Graphics g, String message, int size, int x, int y) { g.setColor(Color.blue); Font f = new Font("楷书", Font.BOLD, size); g.setFont(f); g.drawString(message, x, y); } /** * 重画窗口的线程类,是一个内部类。 * * @author 高一桐 * */ class PaintThread extends Thread { @Override public void run() { while (true) { repaint(); try { // 1秒=1000毫秒,40毫秒表示一秒钟重画25次 Thread.sleep(gameSpeed); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void newGame() { // 定义变量 便于重新开始 MainGame game = new MainGame(); // 加载游戏游戏开始 game.launchFrame(); } /** * 程序入口点 开始游戏 * * @param args */ public static void main(String[] args) { // 开始 游戏 newGame(); } }
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论