坦克大战自学全过程 v1.0

内容介绍:

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包中定义了各种事件类型,常见的有:


正在续写中!!!

猜你喜欢

转载自andy2019.iteye.com/blog/1603614