折腾了这么久,坦克总算能动了。只贴代码编辑不给上首页,花了半个小时的时间写了n多注释。

再顺便把绘图的原理发在这里:

绘图原理

Component类提供了两个和绘图有关的重要方法:

①   paint(Graphics g)绘制组件的外观.

②   repaint()刷新组件的外观

当组件第一次在屏幕显示的时候,程序会自动调用paint()方法绘制组件.

类 Panel

java.lang.Object

java.awt.Component

java.awt.Container

java.awt.Panel

在上一节种

public MyPanel extends Panel{

public void paint(Graphics g){

super.paint(g);

g.drawRect();

}

}

现在可以为什么MyPanel继承了Panel就会有paint方法,可以画图了.

在以下情况下paint()方法将会被调用.

1.窗口最小化,再最大化.

2.窗口大小发生变化.

3.repaint函数被调用.

事件监听的步骤:

一个类实现监听的步骤:

  1. 实现相应的接口(KeyListener,MouseListener,ActionListener,WindowListener)
  2. 实现对事件的处理方法
  3. 在事件源上注册监听

MyTankGame2

 /**
* 坦克游戏的2.0版
* 1.画出坦克
* 2.我的坦克可以上下左右移动
*/
package com.test5; import java.awt.*;
import java.awt.event.*;
import javax.swing.*; public class MyTankGame2 extends JFrame { MyPanel mp = null;
public static void main(String[] args) {
MyTankGame2 myTankGame2 = new MyTankGame2();
}
//构造函数
public MyTankGame2(){
mp = new MyPanel();
this.add(mp);
//c)在事件源上注册监听,mp为监听器
this.addKeyListener(mp); this.setSize(400,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
/*
* 我的面板,不清楚为什么MyPanel继承Panel监听没有效果。而继承JPanel则正常。有知道的大神告诉我下,先谢谢了。
*/
class MyPanel extends Panel implements KeyListener{ //a)实现键盘监听接口
//定义一个我的坦克
Hero hero = null; //创建工作放在构造函数
public MyPanel(){
hero = new Hero(100,100);
}
//重写paint
public void paint(Graphics g){
super.paint(g);
//将活动区域设置背景为黑色
g.fillRect(0, 0, 400, 300);
//画出我的坦克[封装成函数]
this.drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),0);
}
public void drawTank(int x,int y,Graphics g,int direct,int type){
//1.设置颜色,画出左边的矩形
switch(type){
case 0:
g.setColor(Color.cyan);
break;
case 1:
g.setColor(Color.yellow);
break;
}
switch(direct){
case 0:
g.fill3DRect(x,y, 5, 30,false);
//2.画出右边的矩形
g.fill3DRect(x+15,y, 5, 30,false);
//3.画出中间的矩形
g.fill3DRect(x+5,y+5, 10, 20,false);
//4.画出中间的圆型
g.fillOval(x+5,y+10, 10, 10);
//5.画炮管
g.drawLine(x+10,y,x+10,y+15);
break;
case 1:
/*
* 炮筒向右
*/
//画上面的矩形
g.fill3DRect(x,y, 30,5,false);
//2.画出右边的矩形
g.fill3DRect(x,y+15, 30, 5,false);
//3.画出中间的矩形
g.fill3DRect(x+5,y+5, 20, 10,false);
//4.画出中间的圆型
g.fillOval(x+10,y+5, 10, 10);
//5.画炮管
g.drawLine(x+15,y+10,x+30,y+10);
break;
case 2:
g.fill3DRect(x,y, 5, 30,false);
//2.画出右边的矩形
g.fill3DRect(x+15,y, 5, 30,false);
//3.画出中间的矩形
g.fill3DRect(x+5,y+5, 10, 20,false);
//4.画出中间的圆型
g.fillOval(x+5,y+10, 10, 10);
//5.画炮管
g.drawLine(x+10,y+15,x+10,y+30);
break;
case 3:
/*
* 炮筒向左边
*/
//画上面的矩形
g.fill3DRect(x,y, 30,5,false);
//2.画出右边的矩形
g.fill3DRect(x,y+15, 30, 5,false);
//3.画出中间的矩形
g.fill3DRect(x+5,y+5, 20, 10,false);
//4.画出中间的圆型
g.fillOval(x+10,y+5, 10, 10);
//5.画炮管
g.drawLine(x+15,y+10,x,y+10);
break; }
}
public void keyTyped(KeyEvent e) {
}
//对键按下处理,用wdsa控制
//b)实现对事件的处理方法
public void keyPressed(KeyEvent e) {
//按下w键,向上
if(e.getKeyCode()==KeyEvent.VK_W){
this.hero.setDirect(0);//设置坦克方向
this.hero.moveUp();//向上移动
}else if(e.getKeyCode()==KeyEvent.VK_D){
//d键,向右
this.hero.setDirect(1);
this.hero.moveRight();
}else if(e.getKeyCode()==KeyEvent.VK_S){
//s键,向下
this.hero.setDirect(2);
this.hero.moveDown();
}else if(e.getKeyCode()==KeyEvent.VK_A){
//a键,向左
this.hero.setDirect(3);
this.hero.moveLeft();
}
this.repaint(); //重绘坦克。当重回被调用的时候界面才能被刷新。
}
public void keyReleased(KeyEvent e) {
}
}
//画坦克,分析:坦克生活在哪个区域(MyPanel中)

members类

 package com.test5;
//坦克类
class Tank{
//坦克的横坐标
int x = 0;
int y = 0;
//坦克方向 0上,1右,2下,3左
int direct = 0;
//坦克速度
int speed = 1;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public int getDirect() {
return direct;
}
public void setDirect(int direct) {
this.direct = direct;
}
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 Tank(int x,int y){
this.x = x;
this.y = y;
}
}
//我的坦克
class Hero extends Tank{
public Hero(int x,int y){
super(x,y);
}
//坦克向上移动
public void moveUp(){
y-=speed;
}
//坦克向右移动
public void moveRight(){
x+=speed;
}
//坦克向下移动
public void moveDown(){
y+=speed;
}
//坦克向左移动
public void moveLeft(){
x-=speed;
}
}

【 java版坦克大战--事件处理】 坦克动起来了的更多相关文章

  1. 【 java版坦克大战--事件处理】 让坦克动起来--事件处理的准备

    要能够控制坦克运动,必须用到事件处理的知识. 事件处理的一个demo. /** * 事件处理机制:委派事件模型.指当事件发生的时候,产生事件的对象(事件源),会把此 * "消息"传 ...

  2. 【 java版坦克大战--事件处理】 键盘控制小球上下左右移动

    上一节已经学习了事件处理,这一节需要完成通过键盘的上下左右键控制小球移动. 然后再通过应用到我们绘制的坦克上. /** * 加深对事件处理机制的理解 * 通过光标的上下左右键,控制小球的左右上下移动. ...

  3. java版飞机大战 实战项目详细步骤.md

    [toc] 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是 ...

  4. java版飞机大战代码

    @ 目录 前言 Plane PlaneStatus类 Power类 Gift Diji play类 over类 MainFrame主类 MyZiDan DijiZiDan Before 前言 很久之前 ...

  5. java版模拟浏览器下载百度动漫图片到本地。

    package javaNet.Instance.ImageDownload; import java.io.BufferedReader; import java.io.File; import j ...

  6. Html 5 坦克大战(韩顺平县版本号)

    html 5例如,下面的代码段: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/ ...

  7. 【 java版坦克大战--绘图技术】 绘制坦克

    通过上一节,我们学会的用java绘图.那现在就用java绘制自己坦克. 首先通过分析坦克由这几部分组成.如图 各个部件的长宽如图.15,10为圆心. /** * 坦克游戏的1.0版 * 1.画出坦克 ...

  8. Java坦克大战 (七) 之图片版

    本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...

  9. 【java版坦克大战---准备篇】 java 绘图

    要写坦克大战当然要先画出坦克.java画图是基础. package com.game; import java.awt.*; import javax.swing.*; public class Pr ...

随机推荐

  1. Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)

    # 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译) - 原文 <https://githu ...

  2. iOS 开发中使用到的小技巧汇总

    国庆即将来到,一个小项目也即将完成,把自己在项目中用的一些小技巧写出来,方便查找. 1,去掉分割线--动画设置透明度alpha //去掉tableView的分隔线:     self.tableVie ...

  3. 点击modal确定键后删除tr

    做第一个笔记,关于 “书单”.2016-09-03关于一个表格调用modal后,在点击表格中的删除按钮弹出modal,点击确定删除后,将一整行tr 删除的功能. 以下内容为table,表示为某班学生. ...

  4. [分享]Ubuntu12.04安装基础教程(图文)

    [分享]Ubuntu12.04安装基础教程(图文) 原文地址: http://teliute.org/linux/Ubsetup/lesson21/lesson21.html 1.进入 live cd ...

  5. 使用TabLayout快速实现一个导航栏

    在没有Material Design的年代,要实现一个类似微信主页面的效果,我们有以下几种解决方案: 1.Fragment + ViewPager  +  RadioGroup自定义固定导航条 2.F ...

  6. 小蔡计算器 V4.0新版全新发布上线啦~欢迎大家下载使用哈~

    小蔡计算器4.0新版全新发布上线啦~欢迎大家下载使用哦~ 立即下载:http://www.zhentiyuan.com/windows/index.aspx 软件介绍:小蔡计算器4.0是一款界面优美的 ...

  7. 【转】MyEclipse第一个Servlet程序

    转自:http://blog.csdn.net/wangdingqiaoit/article/details/7674367 前言 本文旨在帮助学习java web开发的人员,熟悉环境,在Win7系统 ...

  8. Android 开发第三天

    今天学习的内容

  9. WPF Command命令模式

    //定义接口 public interface IView { bool IsChanged { get; set; } void SetBinding(); void Clear(); } //定义 ...

  10. 一种协程的 C/C++ 实现

    一种协程的 C/C++ 实现 介绍 在前几天接触到了协程的概念,觉得很有趣.因为我可以使用一个线程来实现一个类似多线程的程序,如果使用协程来替代线程,就可以省去很多原子操作和内存栅栏的麻烦,大大减少与 ...