【 java版坦克大战--事件处理】 坦克动起来了
折腾了这么久,坦克总算能动了。只贴代码编辑不给上首页,花了半个小时的时间写了n多注释。
再顺便把绘图的原理发在这里:
绘图原理
Component类提供了两个和绘图有关的重要方法:
① paint(Graphics g)绘制组件的外观.
② repaint()刷新组件的外观
当组件第一次在屏幕显示的时候,程序会自动调用paint()方法绘制组件.
类 Panel
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函数被调用.
事件监听的步骤:
一个类实现监听的步骤:
- 实现相应的接口(KeyListener,MouseListener,ActionListener,WindowListener)
- 实现对事件的处理方法
- 在事件源上注册监听
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版坦克大战--事件处理】 坦克动起来了的更多相关文章
- 【 java版坦克大战--事件处理】 让坦克动起来--事件处理的准备
要能够控制坦克运动,必须用到事件处理的知识. 事件处理的一个demo. /** * 事件处理机制:委派事件模型.指当事件发生的时候,产生事件的对象(事件源),会把此 * "消息"传 ...
- 【 java版坦克大战--事件处理】 键盘控制小球上下左右移动
上一节已经学习了事件处理,这一节需要完成通过键盘的上下左右键控制小球移动. 然后再通过应用到我们绘制的坦克上. /** * 加深对事件处理机制的理解 * 通过光标的上下左右键,控制小球的左右上下移动. ...
- java版飞机大战 实战项目详细步骤.md
[toc] 分析 飞机大战 首先对这个游戏分析,在屏幕上的物体都是飞行物,我们可以把建一个类,让其他飞行物继承这个类.游戏中应有英雄机(也就是自己控制的飞机).敌人.而敌人应该分为打死给分的飞机(就是 ...
- java版飞机大战代码
@ 目录 前言 Plane PlaneStatus类 Power类 Gift Diji play类 over类 MainFrame主类 MyZiDan DijiZiDan Before 前言 很久之前 ...
- java版模拟浏览器下载百度动漫图片到本地。
package javaNet.Instance.ImageDownload; import java.io.BufferedReader; import java.io.File; import j ...
- Html 5 坦克大战(韩顺平县版本号)
html 5例如,下面的代码段: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/ ...
- 【 java版坦克大战--绘图技术】 绘制坦克
通过上一节,我们学会的用java绘图.那现在就用java绘制自己坦克. 首先通过分析坦克由这几部分组成.如图 各个部件的长宽如图.15,10为圆心. /** * 坦克游戏的1.0版 * 1.画出坦克 ...
- Java坦克大战 (七) 之图片版
本文来自:小易博客专栏.转载请注明出处:http://blog.csdn.net/oldinaction 在此小易将坦克大战这个项目分为几个版本,以此对J2SE的知识进行回顾和总结,希望这样也能给刚学 ...
- 【java版坦克大战---准备篇】 java 绘图
要写坦克大战当然要先画出坦克.java画图是基础. package com.game; import java.awt.*; import javax.swing.*; public class Pr ...
随机推荐
- python学习(4)
python(4)4.1 高阶函数:map/reduce map:实际上map也是一个函数,只不过他可以在参数里面包含别的函数.他有两种参数:第一种:函数(作用在后面要说的序列上),第二种:一个序列 ...
- 删除mysql服务
当我们卸载完MySQL后重新装MySQL提示 The service already exists! 是因为服务名称还残留在系统里 打开cmd 输入下面 sc delete mysql 这个mysql ...
- 成员方法的this指针
1.我们知道成员方法中,有个隐式的this常量指针.考虑,Derived继承的成员方法中this指针的表面类型是什么?子类重写的虚方法中this指针的表面类型是什么? 2.Derived继承的方法,就 ...
- 我们应该如何去了解JavaScript引擎的工作原理 系列
http://www.nowamagic.net/librarys/veda/detail/1579
- oralce表空间自增长占满磁盘
取消表空间自动增长 SELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE,bytes/1024/1024/1024 FROM dba_data_files; ...
- Nexus搭建Maven服务器
参考:http://blog.csdn.net/ichsonx/article/details/14642897 1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央 ...
- 理解Objective-c中的copy
说一下深拷贝和浅拷贝的基本概念:a指针指向地址A1, 浅拷贝是创建了一个b指针指向地址A1:深拷贝是创建了一个c指针指向地址A2,A1和A2的地址不同. 我们看到NSObject接口里面是已经声明了c ...
- Es6 之箭头函数 初学
不积跬步,无以至千里;不积小流,无以成江海! // ES5 var selected = allJobs.filter(function (job) { return job.isSelected() ...
- count()与sum()
介绍Mysql中的count()与sum()区别 CREATE TABLE `result` ( `name` varchar(20) default NULL, `subject` varchar( ...
- 获得服务器硬件信息(CPUID、硬盘号、主板序列号、IP地址等)
1 // 注意:首先要在项目中添加引用 System.Management using System; using System.Collections.Generic; using System.L ...