tankwar java,TankWar 單機(JAVA版) 版本0.4~版本0.6 讓坦克動起來
版本0.4的項目要求是讓坦克動起來 由於在版本0.6也是讓坦克聽從我們指揮 等會再寫
在這里主要是建立一個屏幕刷新線程 使屏幕達到時時刷新的效果
代碼如下:
public class updateThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
//刷新屏幕
repaint();
try {
//設置線程睡眠時間
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.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 stub
myTank.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
myTank.keyReleased(e);
}
由於是坦克的移動 而且控制的是我方坦克 所以要把我方坦克定義為全局變量
然后為屏幕添加鍵盤監聽事件 通過監視鍵盤 來移動myTank
移動坦克時通過調用Tank里面的方法
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
switch (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);
//添加自定義的panel
add(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{
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
myTank.keyPressed(e);
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
myTank.keyReleased(e);
}
}
//自定義Jpanel
public class TankClientPanel extends JPanel{
//重寫patit方法
@Override
public void paint(Graphics g) {
//畫我的坦克
myTank.draw(g);
}
}
//屏幕刷新線程
public class updateThread extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
//刷新屏幕
repaint();
try {
//設置線程睡眠時間
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.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 stub
switch (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,TankWar 單機(JAVA版) 版本0.4~版本0.6 讓坦克動起來相关推荐
- java poi excel导出2003版改成2007版本的时候报错
03版本: HSSFWorkbook book =new HSSFWorkbook();---并无报错 07版本: XSSFWorkbook book =new XSSFWorkbook(); 报错内 ...
- 从GitHub火到了博客,共计1658页的《Java岗面试核心MCA版》,拿走不谢
2019年我凭借一份<Java面试核心知识点>成功拿下了阿里.字节.小米等大厂的offer,两年的时间,为了完成我给自己立的flag(拿下一线互联网企业offer大满贯),即使在职也一直在 ...
- 从 GitHub 火到 CSDN 共计 1658 页的 Java 岗面试核心 PDF 版,拿走不谢
2019 年 10 月 16 日,我凭借一份<Java 面试核心知识点>成功拿下了阿里.字节.小米等大厂的 offer,两年的时间,为了完成我给自己立的 flag(拿下一线互联网企业 of ...
- TankWar 单机(JAVA版)版本2.3~版本2.4 为坦克画血条
运行结果: 为了在坦克上方画血条 .血条首先要有坐标x,y 宽和高width和height 血量的多少life也要有. 所以新建类Life要有这些参数 Life类如下: package tankWa ...
- 我的世界JAVA版编程语言_Java版版本记录/开发版本
此页面并非官方版本记录或更新日志.官方日志请见Minecraft官网. 关于1.11及此前版本,请见Mojang官网. 关于Beta 1.8及此前版本,请见Notch的博客,Word of Notch ...
- 我的世界基岩JAVA附魔_我的世界1.2.5版本,基岩版的可以100级附魔吗,就是
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:我的世界1.2.5版本,基岩版的可以100级附魔吗,就是自定义附魔的那种回答:1.2.5基岩版的give指令还未完善,暂时不能这么附 ...
- mc用什么版本的java_MC版本Java版5大功能优势
众所周知Java开发应用广泛,Java版本被很多人认为是最好的MC版本,MC版本Java版5大功能优势有什么呢?Java版开发优势:支持更多的模组.各种节日彩蛋.官方更高的重视性.游戏画面色彩更好.操 ...
- 我的世界1.18java,我的世界Java版1.16.5-rc1版本
我的世界Java版1.16.5-rc1版本是一款非常不错的世界冒险和探索类的游戏.独特的沙盒玩法,可以更好的进行较量,解谜各种的地域,可以更好的完成作战,打破一场属于你的别样时刻,可以快速的进行提升, ...
- java血条_TankWar 单机(JAVA版)版本2.3~版本2.4 为坦克画血条
运行结果: 为了在坦克上方画血条 .血条首先要有坐标x,y 宽和高width和height 血量的多少life也要有. 所以新建类Life要有这些参数 Life类如下: package tankWa ...
最新文章
- give root password for maintenance 启动异常的解决
- PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)
- 数据结构之单链表尾插法创建-RearCreate
- MFC获取键盘光标和鼠标光标所在控件的ID
- 管理任务执行-如何排任务优先级
- gulp与webpack的对比
- UltraISO 制作ESXi 的 USB 安装盘
- 使用python制作ArcGIS插件(1)工具介绍
- 【技术邻】FloEFD热仿真分析之结果处理
- html css js菜鸟教程,DOM CSS - JavaScript 教程 - 菜鸟学堂-脚本之家
- 【简单示例:数据库表转XML】
- 04Selenium剩余部分及练习:爬取京东商品信息
- 记一次 WebBrowser 打开 PDF 文件失败问题的排查过程
- 淘宝新店刚开详情页到底需要怎么做
- 计算机视觉经典论文的参考论文目录
- 天地水火雷风山泽 乾坤坎离震巽艮兑
- PaddleHub创意之艺术风格迁移
- 小觅双目摄像头标准彩色版发布 为移动机器人视觉导航避障优化设计
- JDK目录介绍(bin,db,jre,include,lib,src)以及javac,java命令
- 郴州市少儿机器人编_郴州市举办中小学机器人竞赛
热门文章
- 结棍!Spring 支持 PHP 了!?
- 重磅!微软发布 vscode.dev,把 VS Code 带入浏览器!
- 皮一皮:高考考了 692 分想当程序员的女生
- 2021年假期怎么放?都给你安排得明明白白!
- SpringBoot中使用ShardingJdbc切分数据库表
- linux下内存测试mbw,【转帖】MBW内存测试
- MVC--Rzaor--例子
- cannot assign module before Module.__init__() call
- WeightNet torch
- 没有与制定类型匹配的重载函数 cv::Vec<_Tp 实例