坦克大战
基本介绍
1.程序概述
本程序是一个简单的坦克游戏程序,使用java语言编写,在jdk环境下运行。游戏开始时,用户通过键盘操纵坦克移动,转弯和射击,与敌人坦克进行交战,知道消灭所有敌人就可以过关。本程序包括23个类,2800多行代码,和三个gif图片。
2.功能介绍
2.1开始游戏
本程序运行的主函数
3.涉及技术
- java面向对象编程
- 多线程
- 文件i/o操作
- 数据库
思考----编程-----思考----编程
java绘图坐标体系
-
绘图还必须该清楚一个非常重要的概念-像素
一个像素等于多少厘米
-
计算机屏幕上显示的内容都是由屏幕上的每一个像素组成的。例如,计算机显示器分辨率是800x600,表示计算机屏幕上每一行都由900个点组成,共有600行,整个计算机屏幕共有480000个像素。像素是一个密度单位,而厘米是一个长度单位,两者无法比较
绘图
- Component类提供了两个和绘图相关的重要方法
- paint(Graphics g)绘图组件的外观
- repaint()刷新组件的外观
- 当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件。
- 在以下情况paint()将会被调用:
- 窗口最小化,再最大化
- 窗口的大小发生变化
- repaint函数被调用
Graphics类
Graphics 类你可以理解为画笔,为我们提供了各种绘制图形的方法:
-
画直线drawLine(int x1,int y1,int x2,int y2)
-
画矩形变矿 drawRect(int x,int y,int width,int height)
-
画椭圆边框 drawOval(int x,int y,int width,int height)
-
填充矩形 fillRect(int x,int y,int width,int height)
-
填充椭圆 fillOval(int x,int y,int width,int height)
-
画图片 drawImage(Image img,int x,int y,…)
//画图片 //1.获取图片资源 // Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.jpg")); // g.drawImage(image,10,10,200,200,this);
-
画字符串 drawString(String str,int x,int y)
//画字符串 //设置画笔字体 g.setColor(Color.red); g.setFont(new Font("微软雅黑",Font.BOLD,50)); //这里设置的坐标,原点在左下角 g.drawString("北京你好",10,10);
-
设置画笔的字体 setFont(Font font)
-
设置画笔的颜色 setColor(Color c)
Java事件处理机制
-
事件处理机制-看一个问题
BallMove.java–让小球收到键盘的控制,上下左右移动
package com.event; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; /* * @author 远空_ * @version 1.0 * 演示小球通过键盘控制上下左右的移动->讲解Java的事件控制 * */ public class BallMove extends JFrame{ MyPanel mp = null; public static void main(String[] args) { new BallMove(); } public BallMove(){ mp = new MyPanel(); this.add(mp); this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.addKeyListener(mp); this.setVisible(true); } } class MyPanel extends JPanel implements KeyListener { private int x=10,y=10; //为了让小球可以移动,把它的坐标设置成变量 public void paint(Graphics g){ super.paint(g); g.fillOval(x,y,20,20);//默认黑色 } //有字符输出时,该方法就会触发 @Override public void keyTyped(KeyEvent e) { } //当某个键按下,该方法触发 @Override public void keyPressed(KeyEvent e) { //根据用户按下的不同键,来处理小球移动 //在java中,会给每个键分配一个值 switch (e.getKeyCode()){ case KeyEvent.VK_W: y--; break; case KeyEvent.VK_S: y++; break; case KeyEvent.VK_A: x--; break; case KeyEvent.VK_D: x++; break; } //让面板重绘 /*在以下情况paint()将会被调用: 1. 窗口最小化,再最大化 2. 窗口的大小发生变化 3. repaint函数被调用*/ this.repaint(); } //当某个键松开,该方法触发 @Override public void keyReleased(KeyEvent e) { System.out.println(e.getKeyCode()); } }
-
介绍
-
KeyLinstener接口(需要实现)
//有字符输出时,该方法就会触发 @Override public void keyTyped(KeyEvent e) { } //当某个键按下,该方法触发 @Override public void keyPressed(KeyEvent e) { } //当某个键松开,该方法触发 @Override public void keyReleased(KeyEvent e) { System.out.println(e.getKeyCode());//输出松开的按键 }
-
JFrame的方法
this.addKeyListener(mp);//窗口JFrame对象可以监听键盘事件,即可以监听到面板发生的键盘事件。
-
基本说明
java事件处理是采取“委派事件模型”。当事件发生时,产生事件的对象就会把此“信息”传递给“事件的监听者”处理,这里说的“信息”实际上就是java.awt.event事件类库里某个类所创建的对象,把它称为“事件的对象”。
-
前面我们提到几个重要的概念事件源,事件,事件监听器我们下面来全面的介绍它们
-
事件源:事件源是一个产生事件的对象,比如按钮,窗口等。
-
事件:事件就是承载事件源状态改变时的对象,比如当键盘事件、鼠标事件、窗口事件等等,会生成一个事件对象,该对象保存着当前事件很多信息,比如KeyEvent对象有含义被按下键的Code值。java.awt.event包和javax.swing.event包中定义了各种事件类型
-
事件类型:查阅jjdk文档
坦克大战0.3
添加功能:当玩家按下j键,发射一颗子弹。
- 思路:
- 当发射一颗子弹后,就相当于启动了一个线程√
- Hero有子弹的对象,当按下J时,我们就启动一个发射行为(线程),让子弹不停移动,形成一个射击的效果√
- 我们My Panel 需要不停重绘才能出现该效果√
- 当子弹移动到面板的边界时,就应该销毁。(把启动的子弹的线程销毁)√
坦克大战0.4
- 添加功能
- 让敌人的坦克也能够发射子弹(可以有多颗子弹)√
- 当我方坦克击中敌人坦克时,敌人的坦克就消失,如果能做出爆炸效果更好。√
- 让敌人的坦克也可以自由随机的上下左右移动√
- 控制我方的坦克和敌人的坦克在规定的范围移动√
- 多个子弹的绘制√
- 防止坦克重叠√
- 思路Myself
- 在子弹类使用Vector集合保存所有发射的子弹对象
- 子弹对象线程中,当移动后判断是否碰撞敌方坦克,碰撞后敌人坦克从集合中移除
- 创建一个爆炸类,以及建立其集合,保存爆炸位置的数据,以及实现动画效果
- 随机移动用Random实现
- 每次坦克移动均检测是否碰撞实体
- 遍历子弹类Vector集合
坦克大战0.5
-
添加功能
-
防止敌人坦克重叠运动
-
记录玩家的成绩,存盘退出
-
记录当时敌人的坦克坐标,存盘退出
-
玩游戏时,可选择是开新游戏还是继续上局游戏
-