坦克大战01-认识frame类

github:https://github.com/zwc819konkuk/tank-war

java.awt.Frame

Frame f = new Frame();
f.setSize() 窗口大小
f.setResizabel() 窗口宽高
f.setTitle() 窗口标题
f.setVisible() 窗口可见性
f.addWindowListener(new WindowAdapter() {//匿名内部类,是WindowListener的实现类//窗口关闭,点击左上角×@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}
});

tankFrame类

g是系统给的画笔

在窗口里面画出一个正方形(左上角坐标为x,y)

    public void paint(Graphics g) {g.fillRect(x,y,50,50); //正方形的左上角坐标和宽高}

在tankFrame类中添加键盘监听事件【press&release】

因为只有在tankFrame中调用这个类所以使用内部类

//键盘事件的监听
this.addKeyListener(new MyKeyListener());//处理键盘的监听【内部类】
class MyKeyListener extends KeyAdapter{//键盘按下@Overridepublic void keyPressed(KeyEvent e) {System.out.println("key pressed");}//键盘抬起@Overridepublic void keyReleased(KeyEvent e) {System.out.println("key released");}
}

添加键盘处理,根据上下左右按键状态,判定坦克移动方向

 class MyKeyListener extends KeyAdapter {//坦克的方向,坦克的坐标boolean bL = false;boolean bU = false;boolean bR = false;boolean bD = false;//键盘按下@Overridepublic void keyPressed(KeyEvent e) {//x+=200;//需要重新载入画布//repaint();//识别按下去的键int key = e.getKeyCode();switch (key) {case KeyEvent.VK_LEFT:bL = true;break;case KeyEvent.VK_UP:bU = true;break;case KeyEvent.VK_RIGHT:bR = true;break;case KeyEvent.VK_DOWN:bD = true;break;}}//键盘抬起@Overridepublic void keyReleased(KeyEvent e) {System.out.println("key released");//按下去的键归位int key = e.getKeyCode();switch (key) {case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_DOWN:bD = false;break;}}}

添加枚举类方向

public enum Dir {LEFT,UP,RIGHT,DOWN
}

添加属性方向和速度

    Dir dir = Dir.DOWN;private static final int SPEED = 10;

根据速度和方向以及按键,调整坦克位移

     public void paint(Graphics g) {g.fillRect(x, y, 50, 50); //正方形的左上角坐标和宽高
//        x += 10;//y += 10;switch (dir) {case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;}}public class TankFrame extends Frame {case KeyEvent.VK_DOWN:bD = true;break;default:break;}setMainTankDir();}//键盘抬起@Overridepublic void keyReleased(KeyEvent e) {//按下去的键归位int key = e.getKeyCode();switch (key) {case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_DOWN:bD = false;break;default:break;}setMainTankDir();}private void setMainTankDir() {if (bL) dir = Dir.LEFT;if (bU) dir = Dir.UP;if (bR) dir = Dir.RIGHT;if (bD) dir = Dir.DOWN;}}

tank

抽象出坦克类,封装相应的属性和方法,在tankFrame中直接调用

public class Tank {private int x, y;private Dir dir = Dir.DOWN;public Dir getDir() {return dir;}public void setDir(Dir dir) {this.dir = dir;}private static final int SPEED = 10;public Tank(int x, int y, Dir dir) {this.x = x;this.y = y;this.dir = dir;}public void paint(Graphics g) {g.fillRect(x, y, 50, 50); //正方形的左上角坐标和宽高switch (dir) {case LEFT:x -= SPEED;break;case UP:y -= SPEED;break;case RIGHT:x += SPEED;break;case DOWN:y += SPEED;break;}}
}

tankframe

public class TankFrame extends Frame {Tank myTank = new Tank(200, 400, Dir.DOWN);public TankFrame() {setSize(GAME_WIDTH, GAME_HEIGHT);setResizable(false);setTitle("tank war");setVisible(true);//键盘事件的监听this.addKeyListener(new MyKeyListener());//窗口事件的监听addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}/*窗口需要重新绘制的时候调用Graphics g:系统给的画笔*/@Overridepublic void paint(Graphics g) {Color c = g.getColor();g.setColor(Color.WHITE);g.setColor(c);myTank.paint(g);}//处理键盘的监听【内部类】class MyKeyListener extends KeyAdapter {//坦克的方向,坦克的坐标boolean bL = false;boolean bU = false;boolean bR = false;boolean bD = false;//键盘按下@Overridepublic void keyPressed(KeyEvent e) {//x+=200;//需要重新载入画布//repaint();//识别按下去的键int key = e.getKeyCode();switch (key) {case KeyEvent.VK_LEFT:bL = true;break;case KeyEvent.VK_UP:bU = true;break;case KeyEvent.VK_RIGHT:bR = true;break;case KeyEvent.VK_DOWN:bD = true;break;default:break;}setMainTankDir();new Thread(()->new Audio("audios/tank_move.wav").play()).start();}//键盘抬起@Overridepublic void keyReleased(KeyEvent e) {//按下去的键归位int key = e.getKeyCode();switch (key) {case KeyEvent.VK_LEFT:bL = false;break;case KeyEvent.VK_UP:bU = false;break;case KeyEvent.VK_RIGHT:bR = false;break;case KeyEvent.VK_DOWN:bD = false;break;case KeyEvent.VK_CONTROL:myTank.fire();break;default:break;}setMainTankDir();}private void setMainTankDir() {if (!bL && !bU && !bR && !bD) {myTank.setMoving(false);} else {myTank.setMoving(true);if (bL) myTank.setDir(Dir.LEFT);if (bU) myTank.setDir(Dir.UP);if (bR) myTank.setDir(Dir.RIGHT);if (bD) myTank.setDir(Dir.DOWN);}}}}

坦克大战-基础版01相关推荐

  1. Unity3D_(游戏)2D坦克大战 像素版

    2D坦克大战    像素版 游戏规则: 玩家通过上.下.左.右移动坦克,空格键发射子弹 敌人AI出身时朝向己方大本营(未防止游戏快速结束,心脏上方三个单位障碍物设为刚体) 当玩家被击杀次数>=3 ...

  2. 优秀课程案例:使用Scratch制作坦克大战增强版!

    点击上面微信号关注我关注我哟每天坚持推送文章,争取做到日更,喜欢的可以设置星标,并分享点赞我们的文章,非常感谢大家的支持,您的点击的在看就是我们的动力! 今天我们来分享一个坦克大战增强版.同时大家持续 ...

  3. 坦克大战Java版(文末附下载地址)

    坦克大战Java版(文末附下载地址) 未用框架纯手打Java制作坦克大战游戏,实现基本的玩家对战NPC,积分记录保存,排行榜展示等功能 以下是当初我们组制作的简单坦克大战游戏项目展示(文章最后附上项目 ...

  4. 【180622】VC++ 超经典坦克大战双人版

    超经典坦克大战双人版,VC++完整版,含声音.地图.资源文件,编译后请将Map.Sound.graphics拷贝至可执行文件同级目录内,否则出错.大家看看界面就知这游戏有多经典了吧?小时候没玩过的不多 ...

  5. 【180720】坦克大战电脑版小游戏源码

    本源码是一个坦克大战电脑版小游戏源码,基于C#开发,可进行单人和双人游戏,但是事件有一个控制,可自行修改. 主要功能: 1.单人和双人两种游戏模式,但双人模式控制按键需要自行修改 2.进入游戏后,键盘 ...

  6. 韩顺平老师坦克大战优化版

    一.项目介绍 1.前言 基于韩顺平老师坦克大战的框架和思路,进行了一些优化.编码上尽量按照阿里的代码规约:有非常详尽的注释:引入了线程池,线程安全集合类,原子类等:通过这个小项目的学习,可以深入地理解 ...

  7. 【Pygame实战】经典的坦克大战游戏,勾起童年无限回忆《坦克大战小霸王版》

    导语 哈喽!哈喽--我是木木子 今天来升级下之前写的坦克大战游戏嘛,哈哈哈 其实也不算是修改,就是稍微的调试一下!​​ 因为之前写的界面都是英文的 ,有的小伙伴儿英文一点儿都不会的可能看着别扭,今天来 ...

  8. 经典坦克大战设计模式版完结!

    已经过了这么长时间了,我都有点不好意思再写博客了(笑哭) 中间因为学校这学期的课内实验耽搁了几天,然后五一回了老家没有电脑也没办法继续了,我知道我鸽了所以我一口气把这个版本都完成了,中间的经历的困难这 ...

  9. 坦克大战java_java版坦克大战游戏源码

    [java]代码库package tankwar; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; imp ...

最新文章

  1. nvidia-jetson系列硬件平台上安装Qt
  2. 排序中减治法算法伪代码_【算法与数据结构】伪代码与流程图
  3. 吴裕雄 python 神经网络——TensorFlow 图、张量及会话
  4. onhashchange
  5. 树——平衡二叉树插入和查找的JAVA实现
  6. hive内置函数详解
  7. arp协议属于哪一层_TCP/IP协议栈-之-ARP协议分析
  8. [原创]纯CSS3打造的3D翻页翻转特效
  9. NTA - ERP远程接入硬件解决方案
  10. 趣学 C 语言(五)—— 内存管理
  11. Python格式化输出、转义字符、结束符
  12. 多线程编程(Linux C)
  13. VB.net 进度条使用
  14. FileUtils(文件读写操作工具类)
  15. cat3 utp是不是网线_CAT网线品种分类
  16. 网络安全管理解决方案
  17. 高性能抗干扰宽带自组网电台——T3M2-20W视距100km测试
  18. 小说app源码,uni-app跨平台框架开发,一套代码双端运行,无差别
  19. The Finalless——新学期的scrum
  20. SRM 613 div1 500pt

热门文章

  1. 【移动硬盘】Ubuntu20.04 移动硬盘不能访问
  2. js HTML <iframe> srcdoc 属性
  3. WIZnet以太网帽[RP2040]+MQTT发布[mosquitto]
  4. Python study_note
  5. html 特殊字符 显示平方米
  6. 大周末的,发个 1000 元现金红包吧!
  7. 智能车载终端解决方案,聪明的车驶入智慧公交时代
  8. go语言生成linux桌面快捷,使用Go语言在MacOS创建一个自定义的命令行工具
  9. 使用python+pyqt5开发桌面工具
  10. 为什么我辞去华尔街日报的工作加盟Oracle