内容介绍:
1.坦克大战游戏图片
2.java绘图坐标体系
3.java绘图技术
4java时间处理机制
5.我的坦克大战游戏(1.0版)
目标:
1)理解java绘图坐标体系
2)掌握java绘图基本技术
3)充分理解java时间处理机制
4)完成坦克大战游戏(1.0版)
用到的知识:
1.java绘图坐标体系
下图说明了java坐标体系,坐标原点位于左上角,以像素为单位,像素是计算机屏幕上最小的显示单位,在java的坐标体系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直放行,距离坐标原点y个像素。
案例:我们画一个圆圈
案例代码:
/**
* 功能:java绘图技术
*
* @author Administrator
*
*/
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test extends JFrame {
MyPanel mp = null;
public static void main(String[] args) {
Test test = new Test();
}
public Test() {
mp = new MyPanel();
this.add(mp);
this.setSize(400, 300);
this.setLocation(100, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
// 定义一个MyPanel(我自己的面板,是用于绘图和显示的区域)
class MyPanel extends JPanel {
// 覆盖JPanel 的paint放啊
// Graphics是绘图的重要类,你可以把它理解成一只画笔
public void paint(Graphics g) {
// 1.调用父类函数完成初始化任务
// 这句话,不能少
super.paint(g);
// 先画一个圆圈
// g.drawOval(10, 10, 30, 30);
// 画出直线
// g.drawLine(10, 10, 100, 10);//(x1,y1)起点坐标,(x2,y2)终点坐标
// 矩形边框
// g.drawRect(10, 10, 100, 100);// (x1,y1)左上角的坐标,(x2,y2)右下角坐标
// 填充矩形
// 设置矩形颜色
// g.setColor(Color.YELLOW);
// g.fillRect(10, 10, 100, 100);
// 填充椭圆
// g.drawOval(10, 10, 50, 100);
// 在面板上画出图片
// Image im = Toolkit.getDefaultToolkit().getImage(
// Panel.class.getResource("/labixiaoxin.png"));// 图片放在src目录下面
// g.drawImage(im, 80, 80, 200, 150, this);
// // 如何画出字
// g.setColor(Color.blue);
// g.setFont(new Font("隶书",Font.BOLD,30));
// g.drawString("祖国万岁", 100, 100);
// g.draw3DRect(100, 100, 50, 30, true);
// g.drawRect(10, 10, 10, 10);
}
}
绘图原理(1)
Component类提供了两个和绘图相关的最重要的方法:
1)paint(Graphics g)绘制组件的外观
2)repaint()刷新组件的外观
当组件第一次在屏幕上显示的时候,程序会自动的调用paint()方法来绘制组件
绘图原理(2)
在以下情况paint()将会被调用:
1)窗口最小化,再最大化。
2)窗口的大小发生变化。
3)repaint函数被调用
绘图小练习
坦克大战游戏中,我们用到坦克,现在我们就利用java绘图技术来画出一个小坦克,完成我们坦克大战的1.0版本,因为用图片很浪费资源,所以我们还是自己用java画坦克。
开始画坦克:
案例代码:
/**
* 功能:坦克游戏的1.0
* 1.画出坦克
*/
package tankev1;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyTankGame1 extends JFrame {
MyPanel mp = null;
public static void main(String[] args) {
MyTankGame1 myTankGame1 = new MyTankGame1();
}
public MyTankGame1() {
mp = new MyPanel();
this.add(mp);
this.setSize(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
// 我的面板
class MyPanel extends JPanel {
// 定义一个我的坦克
Hero hero = null;
// 构造函数
public MyPanel() {
hero = new Hero(10, 10);
}
// 重写paint方法
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 400, 300);
this.drawTank(hero.getX(), hero.getY(), g, 0, 0);
}
// 画出坦克的函数
public void drawTank(int x, int y, Graphics g, int direct, int type) {
// 判断坦克类型
switch (type) {
case 0:
g.setColor(Color.CYAN);
break;
case 1:
g.setColor(Color.YELLOW);
break;
}
// 判断方向
switch (direct) {
case 0:
// 画出我的坦克(到时候在封装成一个函数)
// 1.画出左面的矩形
g.fill3DRect(x, y, 5, 30, false);
// 画出右面矩形
g.fill3DRect(x + 15, y, 5, 30, false);
// 3画出中间矩形
g.fill3DRect(x + 5, x + 5, 10, 20, false);
// 4画出圆形
g.fillOval(x + 5, x + 10, 10, 10);
// 画线
g.drawLine(x + 10, x + 15, x + 10, y);
break;
}
}
}
// 坦克类
class Tank {
// 表示坦克横坐标
int x = 0;
// 坦克纵坐标
int y = 0;
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);
}
}
//-----------------------------------------------------------------------------------------------------------------
java事件处理机制
请大家看一个小程序,怎么样让小球受到键盘的空值,上下左右移动呢?
初步介绍
java事件处理是采用“委派事件模型” ,所谓“委派事件模型”是指当事件发生时,产生事件的对象(即事件源),会把此“信息”传递给“事件的监听者” 处理的一种方式,而这里所说的“信息”,实际上市java.awt.event 事件类库里面的某个类所创建的对象,我们暂时把它称为“事件的对象”。
请大家看一个示意图:
案例:
案例代码:
/**
* 功能:讲解事件处理机制
*/
package demo9;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test extends JFrame implements ActionListener {
// 定义一个Panel
JPanel jp = null;
JButton jb1 = null;
JButton jb2 = null;
public static void main(String[] args) {
Test test = new Test();
}
public Test() {
jp = new JPanel();
jb1 = new JButton("黑色");
jb2 = new JButton("红色");
this.add(jb1, BorderLayout.NORTH);
jp.setBackground(Color.yellow);
this.add(jp);
this.add(jb2, BorderLayout.SOUTH);
Cat cat = new Cat();
// 注册监听
jb1.addActionListener(this);// this代表当前JFrame监听,也可以写成类的对象来继承
//事件源对象时jb1,事件监听对象时cat
jb1.addActionListener(cat);
// 指定action命令
jb1.setActionCommand("黑色");// 用来区分事件源
jb2.addActionListener(this);
jb2.setActionCommand("红色");
this.setSize(200, 150);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
//对事件处理的方法
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
// 判断是哪个按钮被点击
if (arg0.getActionCommand().equals("黑色")) {
jp.setBackground(Color.BLACK);
} else if (arg0.getActionCommand().equals("红色")) {
jp.setBackground(Color.RED);
}
}
}
class Cat implements ActionListener {
//对事件处理的方法
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getActionCommand().equals("黑色")) {
System.out.println("猫也在监听");
}
}
}
运动的小球案例:
案例代码:
/**
* 功能:加深对事件处理机制的理解
* 1.通过上下左右的光标来控制一个小球的位置
*/
package demo9;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test2 extends JFrame {
MyPanel mp = null;
public static void main(String[] args) {
Test2 test2 = new Test2();
}
public Test2() {
mp = new MyPanel();
this.add(mp);
// 事件监听
this.addKeyListener(mp);
this.setTitle("运动的小球");
this.setSize(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
// 定义自己的面板
class MyPanel extends JPanel implements KeyListener {
int x = 10;
int y = 10;
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x, y, 10, 10);
}
// 键被按下
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
System.out.println("键被按下" + (char) e.getKeyCode());
if (e.getKeyCode() == KeyEvent.VK_DOWN) {
y++;
System.out.println("下");
} else if (e.getKeyCode() == KeyEvent.VK_UP) {
y--;
System.out.println("上");
}else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
x--;
System.out.println("左");
}else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
x++;
System.out.println("右");
}
// 重绘
// 调用repaint()函数
this.repaint();
}
// 键被释放
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
// 键的一个值被输出
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
}
注:一个类要实现监听的步骤
1)实现相应的接口(KeyListener,MouseListener,ActionLister,WindowListener)
2)把接口的处理方法根据需要重新编写(Override)
3) 在事件源注册监听
4)事件传递时靠事件对象传递
//-------------------------------------------------------------------------------------------------------
java事件处理机制深入理解
前面我们提到的几个重要概念
1)事件源2)事件3)事件监听器
我们下面来看全面的介绍他们,因为这几个概念是非常重要的。
1)事件源
事件源是一个产生(或触发)事件的对象,比如前面的JButton的一个对象btn1.当这个事件源对象的某些状态可能会生成多个不同类时,就会产生某种类型的事件(一个事件源可能会生成多个不同类型的事件)。如果某个组件(对象)希望得到事件源产生的事件,就需要在这个事件源上注册,比如前面的案例。
2)事件
事件就是承载事件源状态改变的信息对象。或者说,事件是事件源向事件监听器传输事件源状态的载体。在用户和GUI组件进行交互时就会生成事件,比如当鼠标在面板中移动时,就会生成一个鼠标移动的事件对象,而这个对象保存着当前鼠标在面板中位置信息。java.awt.event包和javax.swing.event包中定义了各种事件类型,常见的有:
正在续写中!!!