坦克大战1--》java绘图机制

内容:理解java绘图坐标体系,掌握java绘图的基本技术,充分理解java事件处理机制,完成坦克大战小游戏

涉及到的技术:java面向对象编程   java界面编程   绘图技术   多线程  文件I/O操作   数据库

成为一个编程专家的秘诀就是:思考---》编程---》思考---》编程


【1】坐标体系:坐标原点位于JFrame或者JPanel左上角,以像素为单位,像素是计算机屏幕上最小的显示单位。在Java坐标系中,第一个是X坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是Y坐标,表示当前位置为垂直方向,距离坐标原点y个像素

像素:计算机在屏幕上显示的内容是由屏幕上的每一个像素组成的。例如,计算机显示器的分辨率是800*600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。现在的计算机可以支持更高的分辨率,也就是说,屏幕上可以显示更多的像素。因此,像素是一个密度单位,不是长度单位


【2】入门:在面板上划一个小圆,然后借这个案例,学习java绘图技术原理

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

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

(2)repaint()刷新组件的外观

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

在以下情况paint()将会被调用:窗口最小化,再最大化;窗口的大小发生变化;repaint函数被调用

/**
 * 功能:java绘图原理
 */
package com.zjz.huitu;


import java.awt.*;
import javax.swing.*;


public class Demo9_1 extends JFrame{
MyPanel mp = null;
public static void main(String[] args) {
Demo9_1 demo9_1 = new Demo9_1();


}

public Demo9_1() {
mp = new MyPanel();
this.add(mp);
this.setSize(400,300);
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);
System.out.println("paint方法被调用");
//2.先画出一个圆圈
g.drawOval(10,10,30,30);//前俩个参数确定左上角位置
}
}

坦克大战1--》java绘图机制_第1张图片

坦克大战1--》java绘图机制_第2张图片

在做填充图形的时候,在画图之前可以先设置画笔颜色:g.setColor(Color.blue);


//在面板上画一个图片
Image im = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb.gif"));
g.drawImage(im, 90, 90, 200, 150,this);
//画出字
g.setColor(Color.red);

//g.setColor(new Color(66,66,66));
g.setFont(new Font("华文彩云",Font.BOLD,50));
g.drawString("加油吧",100 , 100);


应该是本机没有华文彩云这个字体


开始画坦克:

package com.zjz.huitu;


import java.awt.*;
import javax.swing.*;


public class MyTankGame1 extends JFrame{
MyTankPanel mp = null;


public static void main(String[] args) {
MyTankGame1 mtg = new MyTankGame1();
}

public MyTankGame1() {
mp = new MyTankPanel();
this.add(mp);
this.setSize(400, 300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}


}


//定义一个坦克类
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);
}
}


//我的面板
class MyTankPanel extends JPanel {
//定义一个我的坦克,因为所有坦克均在JPanel里面活动
Hero hero = null;

//构造函数
public MyTankPanel() {
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 direction, int type) {
//判断坦克类型
switch(type) {
case 0 :
g.setColor(Color.cyan);
break;
case 1 :
g.setColor(Color.yellow);
break;
}
//判断方向
switch(direction) {
//向上
case 0 :
g.fill3DRect(x,y,5,30,false);//true表示凸起,false表示凹进
g.fill3DRect(x+15, y, 5, 30,false);
g.fill3DRect(x+5, y+5, 10, 20,false);
// g.setColor(Color.red);
g.fillOval(x+5,y+10, 10, 10);
g.drawLine(x+10, y+15, x+10, y);
break;
}
}
}


你可能感兴趣的:(坦克大战1--》java绘图机制)