项目-坦克大战-让坦克动起来

为什么写这个项目

  • 好玩
  • 涉及到java各个方面的技术
    1,java面向对象
    2,多线程
    3,文件i/o操作
    4,数据库
  • 巩固知识

java绘图坐标体系

坐标体系-介绍

在这里插入图片描述

坐标体系-像素

  • 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的
  • 像素是一个密度单位,而厘米是长度单位,两者无法比较
    例如“计算机显示器的分辨率是800*600,表示计算机屏幕上的每一行由800个点组成,共有600行。整个计算机屏幕共有480000个像素。

介绍-快速入门

入门案例-在面板上绘制一个圆

public class DrawCircle extends JFrame {//JFrame 对应窗口,可以理解成一个画框public static void main(String[] args) {new DrawCircle();}//1,定义一个面板private MyPanel mp = null;public DrawCircle() {//构造器//2,初始化面板mp = new MyPanel();//3,把面板放入到画框this.add(mp);//4,设置窗口的大小this.setSize(800, 800);//5,(默认退出)当点击窗口的小×,程序完全退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//6,可以显示this.setVisible(true);}
}//1,先定义一个MyPanel类,继承JPanel类, 画图形,在画板上画
class MyPanel extends JPanel {/*1,MyPanel 对象就是一个画板2,Graphics g  可以把g理解成一支画笔3,Graphics 提供了很多绘图方法*///paint方法被调用:当组件第一次在屏幕显示时,程序会自动调用paint()方法来绘制组件@Overridepublic void paint(Graphics g) {//绘图方法super.paint(g);//调用父类的方法完成初始化System.out.println("paint方法被调用了~");//画一个圆形  drawOval(x1,y1,y2,y2)
//        g.drawOval(0,0,100,100);//画直线 drawLine(int x1,int y1,int x2,int y2)
//        g.drawLine(10, 10, 100, 100);//画矩形边框 drawRect(int x, int y, int width, int height)//g.drawRect(10, 10, 100, 100);//画椭圆边框 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)//设置画笔的颜色
//        g.setColor(Color.blue);
//        g.drawOval(0,0,100,100);//画图片  drawImage(Image img, int x, int y, ..)//1,获取图片资源   /表示在该项目的根目录去获取  图片资源
//        Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/01.jpg"));
//        g.drawImage(image,10,10,740,500,this);//画字符串 drawString(String str, int x, int y)//写字//给画笔设置颜色和字体g.setColor(Color.red);//public abstract void setFont(Font font);  调用setFont方法,需要传入一个对象g.setFont(new Font("隶书", Font.BOLD, 50));//Font.BOLD 表示粗体//给画笔设置内容//这里设置的 100, 100, 是 "北京你好"左下角g.drawString("北京你好", 100, 100);//设置画笔的字体 setFont(Font font)//设置画笔的颜色 setColor(Color c) }
}

在这里插入图片描述

在这里插入图片描述

绘图原理

  • Component类提供了两个和绘图相关最重要的方法
    1,paint(Graphics g) 绘制组件的外观
    2,repaint() 刷新组件的外观
  • 当组件第一次在屏幕显示时,程序会自动调用paint()方法来绘制组件
  • 在以下情况下paint() 将会被调用
    1,窗口最小化,再最大化
    2,窗口的大小发生变化
    3,repaint方法被调用

Graphics 类

Graphics类可以理解为:就是画笔。为我们提供了各种绘制图形的方法

绘出坦克

  • 坦克父类 Tank
    定义坦克的横坐标和纵坐标,进行初始化,并调用set get方法,以供其他类来使用
  • 自己的坦克类,继承坦克父类 Hero
    重写父类的构造器
  • 画板类 MyPanel 继承Jpanel类
    1,定义自己的坦克,并初始化自己的坦克
    2,重写Jpanel类中的paint方法(传入画笔)
    3,通过画笔填充一个矩形区域 g.fillRect();
    4,创建drawTank方法,设置参数(int x, int y, Graphics g, int direct, int type) direct:用与控制方向 type:用于控制颜色
    5,在paint方法中调用drawTank方法
  • 窗体类 TankGame01
    1,创建画板对象,并进行初始化
    2,把画板传入窗体
    3,设置窗体大小
    4,设置窗体默认退出
    5,设置窗体可见

坦克父类

//坦克父类
public class Tank {private int x;//坦克的横坐标private int y;//坦克的纵坐标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;}
}

自己的坦克

//自己的坦克,继承坦克父类
public class Hero extends Tank{
//重写父类的构造器public Hero(int x, int y) {super(x, y);}
}

画板类


//画板类
public class MyPanel extends JPanel {//	1,定义自己的坦克,并初始化自己的坦克Hero hero = null;public MyPanel() {//初始化自己的坦克hero = new Hero(100,100);}//2,重写Jpanel类中的paint方法(传入画笔)@Overridepublic void paint(Graphics g) {super.paint(g);//	3,通过画笔填充一个矩形区域   g.fillRect();g.fillRect(0,0,1000,750);//填充矩形,默认为黑色//	5,在paint方法中调用drawTank方法drawTank(hero.getX(),hero.getY(),g,0,1);drawTank(hero.getX() +100,hero.getY(),g,0,0);}/*int x 坦克的横坐标int y 坦克的纵坐标Graphics g  画笔int direct  坦克的方向int type  坦克的类型*///4,创建drawTank方法,设置参数(int x, int y, Graphics g, int direct, int type)  direct:用与控制方向   type:用于控制颜色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;}//根据坦克的方向,来绘制坦克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;default:System.out.println("暂时没有处理");}}
}

窗体类

//窗体类
public class TankGame01 extends JFrame {//窗体public static void main(String[] args) {new TankGame01();}private MyPanel mp = null;//1,创建画板对象public TankGame01(){mp = new MyPanel();//画板初试化this.add(mp);//2,把画板传入窗体this.setSize(1000,750);//3,设置窗体大小this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//4,设置窗体默认退出this.setVisible(true);//	5,设置窗体可见}}

java事件处机制

事件处理机制入门案例:小球移动代码

小球案例中的事件源、事件/对象和事件监听者分别是什么

  • 事件源:键盘
  • 事件:按下鼠标
  • 事件监听者:MyPanel_类(实现KeyListener键盘监听器接口)
public class BallMove extends JFrame{//窗体public static void main(String[] args) {BallMove ballMove = new BallMove();}//创建画板对象private MyPanel_ mp = null;public BallMove() {mp = new MyPanel_();//初始化画板this.add(mp);//给窗体添加组件-画板this.setSize(500,500);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体JFrame对象可以监听键盘事件,面板时间了键盘监听器// 即可以监听到面板发生的监听事件this.addKeyListener(mp);this.setVisible(true);}
}
class MyPanel_ extends JPanel implements KeyListener {//画板 实现键盘监听器int x = 10;int y = 10;@Overridepublic void paint(Graphics g) {super.paint(g);g.fillOval(x,y,10,10);}//有字符输出时,该方法就会触发@Overridepublic void keyTyped(KeyEvent e) {}//当某个键按下,该方法会触发@Overridepublic void keyPressed(KeyEvent e) {
//        System.out.println("按键");if (e.getKeyCode() == KeyEvent.VK_DOWN){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++;}//重绘repaint();}//当某个键释放(松开),该方法会触发@Overridepublic void keyReleased(KeyEvent e) {}
}

java事件处理是采取“委派事件模型”。当事件发生时,产生事件的对象,会把此“信息”传递给“事件的监听者”处理,。这里所说的“信息”实际上是java.awt.event事件类库里某个类所创建的对象,把他成为“事件的对象”在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

让坦克动起来

在前面绘制好坦克的基础上实现改变方向和移动

改变坦克的方向

  • 坦克父类 Tank
    定义坦克方向的属性,进行初试化,并创建set get方法
  • 自己的坦克类,继承坦克父类 Hero
    不变
  • 画板类 MyPanel 继承Jpanel 实现 KeyListener 键盘监听器接口
    1,在drawTank方法中,设置方向:向上 向下 向左 向右
    2,在实现KeyListener 键盘监听器接口时,重写接口中的方法
    3,在keyPressed方法中,将键盘输入与方向相结合
    4,在keyPressed中调用repaint方法进重绘,使的画出的图形改变时,仍然可以画出
  • 窗体类 TankGame02
    让窗体监听画板发生的监事件

使坦克动移动起来

  • 坦克父类 Tank
    1,定义 可以上下左右移动的方法。使得在MyPanel 类中可以直接调用方法进行移动
    2,定义speed属性,进行初始化,并添加set get方法
  • 自己的坦克类,继承坦克父类 Hero
    不变
  • 画板类 MyPanel 继承Jpanel 实现 KeyListener 键盘监听器接口
    1,在MyPanel 类中调用setSpeed设置speed的大小
    3,在keyPressed方法中,调用hero中的 上下左右方法
  • 窗体类 TankGame02
    不变

坦克父类

//坦克父类
public class Tank {private int x;//坦克的横坐标private int y;//坦克的纵坐标private int direct;//坦克方向   //direct表示方法:  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 moveDown() {y += speed;}public void moveLeft() {x -= speed;}public void moveRight() {x += speed;}public Tank(int direct) {this.direct = direct;}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;}
}

自己的坦克,继承坦克父类

//自己的坦克,继承坦克父类
public class Hero extends Tank {public Hero(int x, int y) {super(x, y);}
}

画板类

//画板类
public class MyPanel extends JPanel implements KeyListener {//定义我的坦克Hero hero = null;public MyPanel() {//初始化自己的坦克hero = new Hero(100,100);hero.setSpeed(5);}@Overridepublic void paint(Graphics g) {super.paint(g);//3,通过画笔填充一个矩形区域   g.fillRect();g.fillRect(0,0,1000,750);//填充矩形,默认为黑色drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);
//        drawTank(hero.getX() +100,hero.getY(),g,hero.getDirect(),0);
//        drawTank(hero.getX() +200,hero.getY(),g,hero.getDirect(),0);
//        drawTank(hero.getX() +300,hero.getY(),g,hero.getDirect(),1);}/*int x 坦克的横坐标int y 坦克的纵坐标Graphics g  画笔int direct  坦克的方向int type  坦克的类型*/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("暂时没有处理");}}//有字符输出时,该方法就会触发@Overridepublic void keyTyped(KeyEvent e) {}//当某个键按下,该方法会触发@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_W){//改变坦克方向hero.setDirect(0);//让坦克动起来hero.moveUp();} else if (e.getKeyCode() == KeyEvent.VK_S) {hero.setDirect(2);hero.moveDown();} else if (e.getKeyCode() == KeyEvent.VK_A) {hero.setDirect(3);hero.moveLeft();} else if (e.getKeyCode() == KeyEvent.VK_D) {hero.setDirect(1);hero.moveRight();}//重绘repaint();}//当某个键释放(松开),该方法会触发@Overridepublic void keyReleased(KeyEvent e) {}
}

窗体类

//窗体类
public class TankGame02 extends JFrame {//窗体public static void main(String[] args) {new TankGame02();}private MyPanel mp = null;//创建画板对象public TankGame02(){mp = new MyPanel();//画板初试化this.add(mp);//把画板传入窗体this.setSize(1000,750);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//窗体JFrame对象可以监听键盘事件,面板实现了键盘监听器// 即可以监听到面板发生的监听事件this.addKeyListener(mp);this.setVisible(true);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/11317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣HOT100 - 70. 爬楼梯

解题思路&#xff1a; 动态规划 注意 if 判断和 for 循环 class Solution {public int climbStairs(int n) {if (n < 2) return n;int[] dp new int[n 1];dp[1] 1;dp[2] 2;for (int i 3; i < n; i) {dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }

品牌设计理念和logo设计方法

一 品牌设计的目的 设计是为了传播&#xff0c;让传播速度更快&#xff0c;传播效率更高&#xff0c;减少宣传成本 二 什么是好的品牌设计 好的设计是为了让消费者更容易看懂、记住的设计&#xff0c; 从而辅助传播&#xff0c; 即 看得懂、记得住。 1 看得懂 就是让别人看懂…

树莓派|采集视频并实时显示画面

1、使用SSH远程连接到树莓派 2、新建存放代码的目录 mkdir /home/pi/my_code_directory 3、进入存放代码的目录 cd /home/pi/my_code_directory 4、新建py文件 nano cv2test.py 5、输入代码 import cv2# 打开摄像头 cap cv2.VideoCapture(0)while True:# 读取视频帧ret…

BGP学习二:BGP通告原则,BGP反射器,BGP路径属性细致讲解,新手小白无负担

目录 一.AS号 二.BGP路由生成 1.network 2.import-route引入 三.BGP通告原则 1.只发布最优且有效的路由 2.从EBGP获取的路由&#xff0c;会发布给所有对等体 3.水平分割原则 4.IBGP学习BGP默认不发送给EBGP&#xff0c;但如果也从IGP学习到了这条路由&#xff0c;就发…

java项目之智慧图书管理系统设计与实现(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的智慧图书管理系统设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 智慧图书管理…

新闻资讯微信小程序开发后端+php【附源码,文档说明】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

管理科学SCI、SSCI双检索,自引率低,无预警风险,对国人相当友好!

一、期刊名称 Journal of Organizational and End User Computing 二、期刊简介概况 期刊类型&#xff1a;SSCI 学科领域&#xff1a;管理学 影响因子&#xff1a;6.5 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$3300 三、期刊征稿范围…

探秘钱塘高中,筑梦未来之旅————杭州市钱塘高级中学

晨曦微露&#xff0c;书生琅琅&#xff0c;古韵今风交织在这方学府&#xff0c;滔滔的钱塘江畔&#xff0c;杭州市钱塘高级中学屹立于此。这所学校自1958年建校伊始&#xff0c;走过几十年的光辉岁月&#xff0c;一直致力于提供优质的教育资源。 近年来&#xff0c;学校获得多项…

Learning C# Programming with Unity 3D

作者&#xff1a;Alex Okita 源码地址&#xff1a;GitHub - badkangaroo/UnityProjects: A repo for all of the projects found in the book. 全书 686 页。

Java常见数据结构---八大结构

前言&#xff1a; 数据结构是计算机底层存储、组织数据的方式。是指数据相互之间是以什么方式排列在一起的。 通常情况下&#xff0c;精心选择的数据结构可以带来更高的运行或者存储效率 常见的八大数据结构&#xff1a; 栈&#xff1a; 思想&#xff1a; 栈是一种数据结构&…

大数据项目中的拉链表(hadoop,hive)

缓慢渐变维 拉链表 拉链表&#xff0c;可实现数据快照&#xff0c;可以将历史和最新数据保存在一起 如何实现: 在原始数据增加两个新字段 起始时间&#xff08;有效时间&#xff1a;什么时候导入的数据的时间&#xff09;&#xff0c;结束时间&#xff08;默认的结束时间为99…

运筹系列92:vrp算法包VROOM

1. 介绍 VROOM is an open-source optimization engine written in C20 that aim at providing good solutions to various real-life vehicle routing problems (VRP) within a small computing time. 可以解决如下问题&#xff1a; TSP (travelling salesman problem) CVRP …

九、 个人信息出境标准合同的签署及备案流程是怎样的?

为指导和帮助个人信息处理者规范有序备案个人信息出境标准合同&#xff0c;国家网信办结合此前备案实践经验发布了《标准合同备案指南&#xff08;第二版&#xff09;》&#xff0c;并就个人信息出境标准合同备案的适用范围、备案方式、备案流程和材料以及咨询、举报联系方式等…

产品推荐 | 基于AMD Virtex 7 FPGA VC709 的高速连接功能开发板

01 产品概述 Virtex™ 7 FPGA VC709 连接功能套件是一款速率为 40Gb/s 的高速平台&#xff0c;您可以通过评估和开发连接功能&#xff0c;迅速为包含所有必要软硬件和 IP 核的高带宽和高性能应用提供强大的支持。它包括一个含有 PCI Express Gen 3、Northwest Logic 公司推出的…

4.1 文本相似度(二)

目录 1 文本相似度评估 2 代码 2.1 load_dataset 方法 2.2 AutoTokenizer、AutoModelForSequenceClassification 1 文本相似度评估 对两个文本拼接起来&#xff0c;然后作为一个样本喂给模型&#xff0c;作为一个二分类的任务&#xff1b; 数据处理的方式以及训练的基本流程…

maven .lastUpdated文件作用

现象 有时候我在用maven管理项目时会发现有些依赖报错&#xff0c;这时你可以看一下本地仓库中是否有.lastUpdated文件&#xff0c;也许与它有关。 原因 有这个文件就表示依赖下载过程中发生了错误导致依赖没成功下载&#xff0c;可能是网络原因&#xff0c;也有可能是远程…

平面设计基础指南:从零开始的学习之旅!

平面设计师主要做什么&#xff1f; 平面设计师通过创建视觉概念来传达信息。他们创造了从海报和广告牌到包装、标志和营销材料的所有内容&#xff0c;并通过使用形状、颜色、排版、图像和其他元素向观众传达了他们的想法。平面设计师可以在内部工作&#xff0c;专门为品牌创建…

Mac安装jadx

1、使用命令brew安装 : brew install jadx 输入完命令,等待安装完毕 备注&#xff08;关于Homebrew &#xff09;&#xff1a; Homebrew 是 MacOS 下的包管理工具&#xff0c;类似 apt-get/apt 之于 Linux&#xff0c;yum 之于 CentOS。如果一款软件发布时支持了 homebrew 安…

mac定时任务、自启动任务

https://quail.ink/mynotes/p/mac-startup-configuration-detailed-explanation <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.d…

【2024年5月备考新增】】 考前篇(2)《官方平台 - 考生模拟练习平台常用操作(一)》

软考考生常用操作说明 说明:模拟作答系统是旨在让考生熟悉计算机化考试环境和作答方式,模拟作答不保存考生作答 历史记录。考试题型、题量、分值、界面及文字内容以正式考试答题系统为准。 1 如何标记试题、切换试题 2 简答题如何查看历史记录、切换输入法 3 选做题,已作答…