版本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 讓坦克動起來相关推荐

  1. java poi excel导出2003版改成2007版本的时候报错

    03版本: HSSFWorkbook book =new HSSFWorkbook();---并无报错 07版本: XSSFWorkbook book =new XSSFWorkbook(); 报错内 ...

  2. 从GitHub火到了博客,共计1658页的《Java岗面试核心MCA版》,拿走不谢

    2019年我凭借一份<Java面试核心知识点>成功拿下了阿里.字节.小米等大厂的offer,两年的时间,为了完成我给自己立的flag(拿下一线互联网企业offer大满贯),即使在职也一直在 ...

  3. 从 GitHub 火到 CSDN 共计 1658 页的 Java 岗面试核心 PDF 版,拿走不谢

    2019 年 10 月 16 日,我凭借一份<Java 面试核心知识点>成功拿下了阿里.字节.小米等大厂的 offer,两年的时间,为了完成我给自己立的 flag(拿下一线互联网企业 of ...

  4. TankWar 单机(JAVA版)版本2.3~版本2.4 为坦克画血条

    运行结果: 为了在坦克上方画血条 .血条首先要有坐标x,y  宽和高width和height 血量的多少life也要有. 所以新建类Life要有这些参数 Life类如下: package tankWa ...

  5. 我的世界JAVA版编程语言_Java版版本记录/开发版本

    此页面并非官方版本记录或更新日志.官方日志请见Minecraft官网. 关于1.11及此前版本,请见Mojang官网. 关于Beta 1.8及此前版本,请见Notch的博客,Word of Notch ...

  6. 我的世界基岩JAVA附魔_我的世界1.2.5版本,基岩版的可以100级附魔吗,就是

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:我的世界1.2.5版本,基岩版的可以100级附魔吗,就是自定义附魔的那种回答:1.2.5基岩版的give指令还未完善,暂时不能这么附 ...

  7. mc用什么版本的java_MC版本Java版5大功能优势

    众所周知Java开发应用广泛,Java版本被很多人认为是最好的MC版本,MC版本Java版5大功能优势有什么呢?Java版开发优势:支持更多的模组.各种节日彩蛋.官方更高的重视性.游戏画面色彩更好.操 ...

  8. 我的世界1.18java,我的世界Java版1.16.5-rc1版本

    我的世界Java版1.16.5-rc1版本是一款非常不错的世界冒险和探索类的游戏.独特的沙盒玩法,可以更好的进行较量,解谜各种的地域,可以更好的完成作战,打破一场属于你的别样时刻,可以快速的进行提升, ...

  9. java血条_TankWar 单机(JAVA版)版本2.3~版本2.4 为坦克画血条

    运行结果: 为了在坦克上方画血条 .血条首先要有坐标x,y  宽和高width和height 血量的多少life也要有. 所以新建类Life要有这些参数 Life类如下: package tankWa ...

最新文章

  1. give root password for maintenance 启动异常的解决
  2. PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)
  3. 数据结构之单链表尾插法创建-RearCreate
  4. MFC获取键盘光标和鼠标光标所在控件的ID
  5. 管理任务执行-如何排任务优先级
  6. gulp与webpack的对比
  7. UltraISO 制作ESXi 的 USB 安装盘
  8. 使用python制作ArcGIS插件(1)工具介绍
  9. 【技术邻】FloEFD热仿真分析之结果处理
  10. html css js菜鸟教程,DOM CSS - JavaScript 教程 - 菜鸟学堂-脚本之家
  11. 【简单示例:数据库表转XML】
  12. 04Selenium剩余部分及练习:爬取京东商品信息
  13. 记一次 WebBrowser 打开 PDF 文件失败问题的排查过程
  14. 淘宝新店刚开详情页到底需要怎么做
  15. 计算机视觉经典论文的参考论文目录
  16. 天地水火雷风山泽 乾坤坎离震巽艮兑
  17. PaddleHub创意之艺术风格迁移
  18. 小觅双目摄像头标准彩色版发布 为移动机器人视觉导航避障优化设计
  19. JDK目录介绍(bin,db,jre,include,lib,src)以及javac,java命令
  20. 郴州市少儿机器人编_郴州市举办中小学机器人竞赛

热门文章

  1. 结棍!Spring 支持 PHP 了!?
  2. 重磅!微软发布 vscode.dev,把 VS Code 带入浏览器!
  3. 皮一皮:高考考了 692 分想当程序员的女生
  4. 2021年假期怎么放?都给你安排得明明白白!
  5. SpringBoot中使用ShardingJdbc切分数据库表
  6. linux下内存测试mbw,【转帖】MBW内存测试
  7. MVC--Rzaor--例子
  8. cannot assign module before Module.__init__() call
  9. WeightNet torch
  10. 没有与制定类型匹配的重载函数 cv::Vec<_Tp 实例