- 1、事件处理机制
- 1.1、问题引出
- 1.2、基本说明
- 1.3、机制分析
- 1.4、事件处理机制深入理解
- 2、坦克大战游戏升级
- 3、内容小结
package event_; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class BallMove extends Jframe { // 窗口 MyPanel mp = null; public static void main(String[] args) { BallMove ballMove = new BallMove(); } public BallMove() { mp = new MyPanel(); this.add(mp); this.setSize(400, 300); // 窗口 Jframe 对象可以监听键盘事件, 即可以监听到面板发生的键盘事件 this.addKeyListener(mp); this.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); this.setVisible(true); } } // 面板, 可以画出小球 // KeyListener 是监听器, 可以监听键盘事件 class MyPanel extends JPanel implements KeyListener { // 为了让小球可以移动, 把他的左上角的坐标(x,y)设置变量 int x = 10; int y = 10; @Override 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) { // System.out.println((char) e.getKeyCode() + "被按下"); // 根据用户按下的不同键, 来处理小球的移动 (上下左右的键) if (e.getKeyCode() == KeyEvent.VK_DOWN) { // KeyEvent.VK_DOWN 就是向下的箭头对应的 code y++; } else if (e.getKeyCode() == KeyEvent.VK_UP) { y--; } else if (e.getKeyCode() == KeyEvent.VK_LEFT) { x--; } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { x++; } // 让面板重绘 this.repaint(); } // 当某个键释放(松开), 该方法会触发 @Override public void keyReleased(KeyEvent e) { } }1.2、基本说明
TankGame02.java
package tankgame2; import javax.swing.*; import java.awt.*; public class TankGame02 extends Jframe { // 定义 MyPanel MyPanel mp = null; public static void main(String[] args) { TankGame02 tankGame02 = new TankGame02(); } public TankGame02() { mp = new MyPanel(); this.add(mp); // 把面板(就是游戏的绘图区域) this.setSize(1000, 750); this.addKeyListener(mp);//让 Jframe 监听 mp 的键盘事件 this.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); this.setVisible(true); } }
MyPanel.java
package tankgame2; import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Vector; // 为了监听 键盘事件, 实现 KeyListener public class MyPanel extends JPanel implements KeyListener { // 定义我的坦克 Hero hero = null; // 定义敌人坦克, 放入到 Vector VectorenemyTanks = new Vector<>(); int enemyTankSize = 3; public MyPanel() { hero = new Hero(100, 100); // 初始化自己坦克 // 初始化敌人坦克 for (int i = 0; i < enemyTankSize; i++) { // 创建一个敌人的坦克 EnemyTank enemyTank = new EnemyTank((100 * (i + 1)), 0); // 设置方向 enemyTank.setDirect(2); // 加入 enemyTanks.add(enemyTank); } } @Override public void paint(Graphics g) { super.paint(g); g.fillRect(0, 0, 1000, 750); // 填充矩形, 默认黑色 // 画出自己坦克-封装方法 drawTank(hero.getX(), hero.getY(), g, hero.getDirect(), 1); // 画出敌人的坦克, 遍历 Vector for (int i = 0; i < enemyTanks.size(); i++) { // 取出坦克 EnemyTank enemyTank = enemyTanks.get(i); drawTank(enemyTank.getX(), enemyTank.getY(), g, enemyTank.getDirect(), 0); } } // 编写方法, 画出坦克 public void drawTank(int x, int y, Graphics g, int direct, int type) { // 根据不同类型坦克, 设置不同颜色 switch (type) { case 0: // 敌人的坦克 g.setColor(Color.cyan); break; case 1: // 我的坦克 g.setColor(Color.yellow); break; } // 根据坦克方向, 来绘制对应形状坦克 // direct 表示方向(0 向上 1 向右 2 向下 3 向左) switch (direct) { case 0: // 表示向上 g.fill3DRect(x, y, 10, 60, false); // 画出坦克左边轮子 g.fill3DRect(x + 30, y, 10, 60, false); // 画出坦克右边轮子 g.fill3DRect(x + 10, y + 10, 20, 40, false); // 画出坦克盖子 g.fillOval(x + 10, y + 20, 20, 20); // 画出圆形盖子 g.drawLine(x + 20, y + 30, x + 20, y); // 画出炮筒 break; case 1: // 表示向右 g.fill3DRect(x, y, 60, 10, false); // 画出坦克上边轮子 g.fill3DRect(x, y + 30, 60, 10, false); // 画出坦克下边轮子 g.fill3DRect(x + 10, y + 10, 40, 20, false); // 画出坦克盖子 g.fillOval(x + 20, y + 10, 20, 20); // 画出圆形盖子 g.drawLine(x + 30, y + 20, x + 60, y + 20); // 画出炮筒 break; case 2: // 表示向下 g.fill3DRect(x, y, 10, 60, false); // 画出坦克左边轮子 g.fill3DRect(x + 30, y, 10, 60, false); // 画出坦克右边轮子 g.fill3DRect(x + 10, y + 10, 20, 40, false); // 画出坦克盖子 g.fillOval(x + 10, y + 20, 20, 20); // 画出圆形盖子 g.drawLine(x + 20, y + 30, x + 20, y + 60); // 画出炮筒 break; case 3: // 表示向左 g.fill3DRect(x, y, 60, 10, false); // 画出坦克上边轮子 g.fill3DRect(x, y + 30, 60, 10, false); // 画出坦克下边轮子 g.fill3DRect(x + 10, y + 10, 40, 20, false); // 画出坦克盖子 g.fillOval(x + 20, y + 10, 20, 20); // 画出圆形盖子 g.drawLine(x + 30, y + 20, x, y + 20); // 画出炮筒 break; default: System.out.println("暂时没有处理"); } } @Override public void keyTyped(KeyEvent e) { } // 处理 wdsa 键按下的情况 @Override public void keyPressed(KeyEvent e) { System.out.println(e.getKeyCode()); if (e.getKeyCode() == KeyEvent.VK_W) { // 按下 W 键 // 改变坦克的方向 hero.setDirect(0);// // 修改坦克的坐标 y -= 1 hero.moveUp(); } else if (e.getKeyCode() == KeyEvent.VK_D) { // D 键, 向右 hero.setDirect(1); hero.moveRight(); } else if (e.getKeyCode() == KeyEvent.VK_S) { // S 键 hero.setDirect(2); hero.moveDown(); } else if (e.getKeyCode() == KeyEvent.VK_A) { // A 键 hero.setDirect(3); hero.moveLeft(); } // 让面板重绘 this.repaint(); } @Override public void keyReleased(KeyEvent e) { } }
Tank.java
package tankgame2; public class Tank { private int x; // 坦克的横坐标 private int y; // 坦克的纵坐标 private int direct = 0; // 坦克方向 0 上 1 右 2 下 3 左 private int speed = 1; public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } // 上右下左移动方法 public void moveUp() { y -= speed; } public void moveRight() { x += speed; } public void moveDown() { y += speed; } public void moveLeft() { x -= speed; } public int getDirect() { return direct; } public void setDirect(int direct) { this.direct = direct; } public Tank(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } }
EnemyTank.java
package tankgame2; public class EnemyTank extends Tank { public EnemyTank(int x, int y) { super(x, y); } }
Hero.java
package tankgame2; public class Hero extends Tank { public Hero(int x, int y) { super(x, y); } }3、内容小结
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)