文章目录

  • 1.java绘图技术
    • (1)画框框
    • (2)画布
    • (3)画个坦克,封装在画布的一个方法里
  • 2.事件控制(监听)(坦克移动)

1.java绘图技术

简单来说,就是先要一个框,在上面加载画布
画布里有一个paint方法,相当于工作台,参数是一个画笔,在这个方法里就针对g进行绘画
对于一些封装的绘画,就放在其他方法里,在paint调用,记得参数把g传进去就好

(1)画框框

public class DrawCircle extends JFrame { //这是画板(框)(展示器)private MyPanel mp = null;       //定义画布,放在这里是为了提高作用域public static void main(String[] args) {new DrawCircle();     //把自己实例化,就是执行下面的构造器}public DrawCircle(){mp = new MyPanel(); //生成画布对象this.add(mp);           //this的意思是调的本对象的父类JFrame的方法     //在框架里加入画布this.setSize(1000,750);             //设置框的大小this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关了框框程序就结束this.setVisible(true); //展示框}
}

(2)画布

class MyPanel extends JPanel {          //画布,在这里画东西Hero hero = null;         public MyPanel(){hero = new Hero(10,20);}@Overridepublic void paint(Graphics g) {  //g是画笔     //这个paint函数是自动调用的,只要new了MyPanel这个类就会调,//相当于画画的工作台super.paint(g);     //要先调用父类初始化g.fillRect(0,0,1000,750);       //画一个和框架大小一样的和黑色背景drawTank(hero.getX(),hero.getY(),g,0,0);//调用画坦克的方法}

(3)画个坦克,封装在画布的一个方法里

/*x,y是坦克的坐标g是画笔direct是坦克面朝的方向type是坦克的类型*/public void drawTank(int x, int y , Graphics g, int direct, int type){//绘制不同类型的坦克switch (type){case 0: //我们的坦克g.setColor(Color.cyan);     //把g这个画笔设置成某种颜色break;case 1: //敌人的坦克g.setColor(Color.yellow);break;}//绘制不同方向的坦克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);//画炮}}
}

2.事件控制(监听)(坦克移动)

这部分的用途是怎么通过键盘来控制小球移动
首先让画布要实现一个监听的接口KeyListener,可以接受键盘的输入
然后把小球的坐标设置成变量,然后每次按下某一个键就改变变量,然后用this.repaint这个方法重绘

class Mypan extends JPanel implements KeyListener {int x = 100;int y = 100;@Overridepublic void paint(Graphics g) {super.paint(g);g.fillOval(x,y,20,20);}//有字符输出,该方法会触发@Overridepublic void keyTyped(KeyEvent e) {}//某个键按下,该方法会触发@Overridepublic void keyPressed(KeyEvent e) {if(e.getKeyCode() == KeyEvent.VK_DOWN){  //VK_DOWN代表向下这个按键的code值y++;this.repaint();}}//某个键松开,该方法会触发@Overridepublic void keyReleased(KeyEvent e) {}
}

注意在画板那里也要加一个方法,才能监听到画布的变化

        this.addKeyListener(mypan);//面板可以监听到画布上发生的键盘事件

这里简单介绍一下java事件处理机制
如图所示,用户操纵键盘。然后又一个事件监听者一直在盯着键盘的操作,一旦操作了,这个操作就会被监听到,然后事件监听者对其进行处理

事件源:一个产生事件的对象,比如按钮,窗口等

事件:承载事件源状态改变的对象,比如当键盘事件、鼠标事件、窗口事件等等,会生成一个对象事件,该对象保存着当前时间的很多信息,比如KeyEvent对象含有被按下的Code值。java.awt.exent包和javax.swing.event包中定义了各种事件类型

事件类型:

事件监听器接口:
1. 即产生一个事件就可以监听到,然后传送给监听者处理
2. 事件监听者其实就是一个类,只要实现了监听者接口,那他就是事件监听者,可以对监听到的事件进行处理
3. 事件监听器有多种,可以同时监听不同的,方法就是实现接口
4. 接口就在上述的包里

对于键盘控制小球这个案例来说:
键盘是事件源,按下了某个键就会产生一个事件对象,这个事件里有按键的信息,然后传给监听者接口,然后实现了对应监听者接口的Mypanel类就是监听者,可以对监听到的信息进行处理

下面是把这个应用到坦克移动里,先画出不同方向坦克的图,再每次按键修改坦克方向,代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;public class DrawCircle extends JFrame {  //这是画板(框)(展示器)private MyPanel mp = null;public static void main(String[] args) {new DrawCircle();}public DrawCircle(){mp = new MyPanel(); //这是画布this.add(mp);           //调的本对象的父类JFrame的方法     //在框架里加入画布this.addKeyListener(mp);this.setSize(1000,750);             //设置框的大小this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}
}class MyPanel extends JPanel implements KeyListener {          //画布,在这里画东西Hero hero = null;public MyPanel(){hero = new Hero(10,20,0);}@Overridepublic void paint(Graphics g) {  //g是画笔     //这个paint函数是自动调用的,只要new了MyPanel这个类就会调,相当于画画的工作台super.paint(g);     //要先调用父类初始化g.fillRect(0,0,1000,750);       //画一个和框架大小一样的和黑色背景drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),0);//调用画坦克的方法}/*x,y是坦克的坐标g是画笔direct是坦克面朝的方向type是坦克的类型*/public void drawTank(int x, int y , Graphics g, int direct, int type){//绘制不同类型的坦克switch (type){case 0: //我们的坦克g.setColor(Color.cyan);     //把g这个画笔设置成某种颜色break;case 1: //敌人的坦克g.setColor(Color.yellow);break;}//绘制不同方向的坦克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("输错了");break;}}@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {switch (e.getKeyCode()){case KeyEvent.VK_DOWN:hero.setDirect(2);hero.setY(hero.getY()+3);break;case KeyEvent.VK_UP:hero.setDirect(0);hero.setY(hero.getY()-3);break;case KeyEvent.VK_LEFT:hero.setDirect(3);hero.setX(hero.getX()-3);break;case KeyEvent.VK_RIGHT:hero.setDirect(1);hero.setX(hero.getX()+3);break;default:break;}this.repaint();}@Overridepublic void keyReleased(KeyEvent e) {}
}

当然,坦克是用类封装起来的

接下来,我们想让坦克都自己动起来,就需要多线程的知识。

韩顺平坦克大战项目0.2(画坦克并且移动)相关推荐

  1. 韩顺平老师坦克大战项目总结

    韩顺平老师讲的坦克大战项目,用代码进行了复现,有几个自己的总结 1 有个别功能没有实现,EnemyTank中敌人坦克向四周移动功能没有实现,只是实现了随机转向,但一直停在原地不动,没有找到bug所在. ...

  2. 韩老师坦克大战2.0版本

    本博文源于对b站视频韩老师(韩顺平)的java学习,本章学习坦克大战2.0版本,用多线程实现,本章内容还是比较多的,先看内容效果 内容效果 开局 被打死(黄色是hero) 打死别人 源码 Bomb.j ...

  3. [ java ] 坦克大战 5.0 ~ 最终完整版

    坦克大战5.0 新增功能内容:(加入IO流内容) 防止敌坦克间重叠 击杀数显示 保存上局游戏进度–>两种开局方式 加入开局音乐 修复记录文件丢失后的异常 5.0版本为最终版 提示:爆炸图片需自行 ...

  4. 坦克大战2.0,3.0,4.0版本

    1.坦克大战 0.3 在坦克大战游戏(0.2版)基础上添加如下功能:当玩家按一下j键,就发射一颗子弹. 编写Shot类 package com.yt.tankgame03;/*** 射击子弹*/ pu ...

  5. CocosCreator项目学习系列lt;三gt;BattleCity_90tank坦克大战项目的学习

    CocosCreator项目学习系列<三>坦克大战项目的学习<25/12/2017> 知识点总结: 1.TileMap的使用精髓; 2.Joystick虚拟摇杆的整合单脚本; ...

  6. Java学习总结之坦克大战项目(完结版)

    接上篇 V1.0:在这个版本中呢,我们要让敌方坦克动起来,不仅要移动,还要打出炮弹,怎么实现呢?其实很简单,在RobotTank类中添加一个随机数产生器就ok了.用nextInt ( n ) 方法可以 ...

  7. 坦克大战java_清华毕业大佬用一个坦克大战项目讲完了23种设计模式

    先给大家讲述一下坦克大战是怎么进行运行的. 坦克大战第一节: new 出一个窗口: 设定标题栏内容: TankFrame从Frame继承+显示: 认识paint方法,重写: 坦克大战第二节 学习gra ...

  8. java之详解坦克大战_Java之详解坦克大战游戏(一)

    相信大家小时候一定玩过坦克大战游戏,躲避敌方坦克,炸毁敌方坦克,不断向前进攻直逼敌方基地-这次,我们来实现一个简单版的坦克大战,我想学Java的人都有想到以前的按键手机里那菜单点开"Java ...

  9. java 坦克大战 教程_[Java教程]坦克大战(一)

    [Java教程]坦克大战(一) 0 2016-09-16 08:00:05 坦克大战(一) 相信大家对坦克大战都不陌生,并且网上也有很多用java实现的小程序,最近用了几天时间将其使用javaScri ...

最新文章

  1. 现在已经不喜欢注释而喜欢直接看代码了
  2. Android 交叉编译
  3. CentOS 6.7 配置JSP运行环境之resin
  4. android root 技术,android root实践
  5. SQL 格式化输出 千分位 ¥货币格式
  6. 用树莓派学嵌入式linux,基于树莓派的嵌入式Linux开发教学探索
  7. Google退出中国
  8. c语言计算三个并联电阻,3个电阻并联怎么计算
  9. matlab eval函数代替,Matlab自动图例方法-使用eval函数
  10. Azure与Aliyun服务对比
  11. 什么是802.11ax(Wi-Fi 6)
  12. matlab numel x,试图访问 x(2);由于 numel(x)=1,索引超出范围。
  13. 简单好用的录音软件?
  14. 指尖江湖李忘生鸿蒙初开,指尖江湖掌门天团年轻时外装来袭!其中,纯阳掌教李忘生的该系列外装名为?剑网3指尖江湖11.9答案_游侠手游...
  15. C++中虚函数的理解,以及简单继承情况下的虚函数的表!
  16. Commvault逻辑架构及组件说明
  17. 动态生成模板(模板生成器)
  18. 2020上半年10大典型工业网络安全事件
  19. Hello Jexus
  20. 智能手机双摄像头产业链、工艺、及原理

热门文章

  1. 为什么抖音账号作品很少粉丝却很多,抖音删除的粉丝还能看到吗
  2. 蓝牙设备删除失败_这软件能让你的蓝牙耳机,用上AirPods的功能
  3. 2019-CSP赛后总结
  4. 家庭教育中有近一半是由母亲负责孩子学习,占49%,父亲负责仅占10%
  5. CSS字体颜色,文本装饰线,删除线
  6. 【实践案例分享】美团配送A/B评估体系建设与实践
  7. 门限签名技术火了,它的硬核之处绝不仅仅是秘密共享……
  8. 小白学编程(CSS):跳动的文字
  9. 【css太极图】html+css用一个div画出太极图
  10. python全案例学习_Python全案例学习与实践