TankWar 单机(JAVA版) 版本0.4~版本0.6 让坦克动起来

2024-02-09 16:08

本文主要是介绍TankWar 单机(JAVA版) 版本0.4~版本0.6 让坦克动起来,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


版本0.4的项目要求是让坦克动起来 由于在版本0.6也是让坦克听从我们指挥  等会再写

在这里主要是建立一个屏幕刷新线程  使屏幕达到时时刷新的效果

代码如下:

public class updateThread extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){//刷新屏幕repaint();try {//设置线程睡眠时间Thread.sleep(30);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

然后通过实例化窗口的时候  实例化这个线程  并且让它开始执行即可

new updateThread().start();


版本0.5  修改一下就可以了

//窗口的高度public static final int SCREENHEIGHT=600;//窗口的宽度public static final int SCREENWIDTH=800;


版本0.6就是添加键盘事件了  

首先自定义键盘时间KeyMonitor  继承KeyAdapter重写里面的

public void keyPressed(KeyEvent e) {// TODO Auto-generated method stubmyTank.keyPressed(e);}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stubmyTank.keyReleased(e);}


由于是坦克的移动 而且控制的是我方坦克 所以要把我方坦克定义为全局变量


然后为屏幕添加键盘监听事件  通过监视键盘  来移动myTank


移动坦克时通过调用Tank里面的方法

public void keyPressed(KeyEvent e) {// TODO Auto-generated method stubswitch (e.getKeyCode()) {case KeyEvent.VK_UP:y-=speed;break;case KeyEvent.VK_DOWN:y+=speed;break;case KeyEvent.VK_LEFT:x-=speed;break;case KeyEvent.VK_RIGHT:x+=speed;break;default:break;}}

其中speed为按键一次移动的长度。

全部代码如下:

TankClient类

package tankWar;import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;import javax.swing.JFrame;
import javax.swing.JPanel;public class TankClient extends JFrame {//窗口的高度public static final int SCREENHEIGHT=600;//窗口的宽度public static final int SCREENWIDTH=800;public static Tank myTank;//创建一个窗口public TankClient(){setTitle("坦克大战");//窗口的大小setSize(SCREENWIDTH, SCREENHEIGHT);//设置窗口的显示位置在屏幕中央setLocationRelativeTo(null);//关闭窗口的事件管理setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//不允许窗口的大小改动setResizable(false);setVisible(true);//添加自定义的paneladd(new TankClientPanel());//实例化我的坦克myTank=new Tank(50, 50, 50, 50);//为窗口添加键盘事件addKeyListener(new KeyMonitor());//启动屏幕刷新线程new updateThread().start();}public static void main(String[] args) {//启动窗口new TankClient();}public class KeyMonitor  extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e) {// TODO Auto-generated method stubmyTank.keyPressed(e);}@Overridepublic void keyReleased(KeyEvent e) {// TODO Auto-generated method stubmyTank.keyReleased(e);}}//自定义Jpanelpublic class TankClientPanel extends JPanel{//重写patit方法@Overridepublic void paint(Graphics g) {//画我的坦克myTank.draw(g);}}//屏幕刷新线程public class updateThread extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){//刷新屏幕repaint();try {//设置线程睡眠时间Thread.sleep(30);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}


Tank类

package tankWar;import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;public class Tank {//坦克x坐标private int x;//坦克y坐标private int y;//坦克的宽private int width;//坦克的高private int height;//坦克移动的速度private int speed=5;public Tank() {super();// TODO Auto-generated constructor stub}public Tank(int x, int y, int width, int height) {super();this.x = x;this.y = y;this.width = width;this.height = height;}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 int getWidth() {return width;}public void setWidth(int width) {this.width = width;}public int getHeight() {return height;}public void setHeight(int height) {this.height = height;}public void draw(Graphics g){Graphics2D g2=(Graphics2D) g;//画一个圆Ellipse2D e2=new Ellipse2D.Double(x, y, width, height);//颜色为红色g2.setColor(Color.RED);//填充g2.fill(e2);//画一条线 通过坦克的坐标计算炮杆的坐标//默认坦克朝上Line2D l2=new Line2D.Double(x+width/2, y+height/2, x+width/2, y+height/2-40);g2.setColor(Color.BLACK);g2.setStroke(new BasicStroke(3)); g2.draw(l2);}//我方坦克的键盘按下事件public void keyPressed(KeyEvent e) {// TODO Auto-generated method stubswitch (e.getKeyCode()) {case KeyEvent.VK_UP:y-=speed;break;case KeyEvent.VK_DOWN:y+=speed;break;case KeyEvent.VK_LEFT:x-=speed;break;case KeyEvent.VK_RIGHT:x+=speed;break;default:break;}}//我方坦克的键盘松下事件public void keyReleased(KeyEvent e) {// TODO Auto-generated method stub}
}


运行结果:


从运行结果 我们可以看到 虽然我们的坦克动了  可是炮杆的方向并没有根据移动的方向来切换 所以我们还要优化一下

下一篇文章就是优化炮杆方向和移动方向不一致



这篇关于TankWar 单机(JAVA版) 版本0.4~版本0.6 让坦克动起来的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694685

相关文章

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte