JavaGUI-坦克大戰 1.Java繪圖坐標體系 坐標體系介紹:下圖說明瞭一個Java坐標體系。坐標原點位於左上角,以像素為單位。在Java坐標體系中,第一個是x坐標,表示當前位置為水平方向,距離坐標原點x個像素;第二個是y坐標,表示當前位置為垂直方向,距離坐標原點y個像素。 坐標體系-像素: 繪 ...
JavaGUI-坦克大戰
1.Java繪圖坐標體系
- 坐標體系介紹:下圖說明瞭一個Java坐標體系。坐標原點位於左上角,以像素為單位。在Java坐標體系中,第一個是x坐標,表示當前位置為水平方向,距離坐標原點x個像素;第二個是y坐標,表示當前位置為垂直方向,距離坐標原點y個像素。
- 坐標體系-像素:
- 繪圖還必須要搞清一個非常重要的概念-像素 一個像素等於多少釐米?
- 電腦在屏幕上顯示的內容都是由屏幕上的每一個像素組成的。例如:電腦顯示器的解析度是800*600,表示電腦屏幕上的每一行由800個點組成,共有600行,整個電腦屏幕共有480 000個像素。像素是一個密度單位,而釐米是一個長度單位,兩者無法比較。
2.繪圖入門和機制
繪圖原理:
- Component類提供了兩個和繪圖相關最重要的方法:
paint(Graphics g)
繪製組件的外觀repaint()
刷新組件的外觀
- 當組件第一次在屏幕顯示的時候,程式會自動地調用
paint()
方法來繪製組件 - 在以下情況
paint()
將會被調用:- 視窗最小化,再最大化
- 視窗的大小發生變化
repaint
方法被調用
思考:如何證明上面的三種情況會調用paint()方法?
例子1:畫出一個圓形
package li.gui;
import javax.swing.*;
import java.awt.*;
public class DrawCircle extends JFrame {//JFrame對應視窗,可以理解成一個畫框
//定義一個面板
private MyPanel mp = null;
public static void main(String[] args) {
new DrawCircle();
}
public DrawCircle() {//構造器
//初始化面板
mp = new MyPanel();
//把面板放入視窗(畫框)
this.add(mp);
//設置視窗的的大小
this.setSize(400, 300);
//當點擊視窗的小x時,程式完全退出
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setVisible(true);//可以顯示
}
}
//1 .先定義一個MyPanel,繼承JPanel類,畫圖形,就在面板上畫
class MyPanel extends JPanel {
// 1.MyPanel 對象就是一個畫板
// 2. Graphics g 把 g理解成一支畫筆
// 3. Graphics提供了很多繪圖的方法
@Override
public void paint(Graphics g) {//繪圖方法
super.paint(g);//調用父類的方法完成初始化
System.out.println("paint方法被調用~");
//畫出一個圓形
g.drawOval(0, 0, 100, 100);
}
}
在以下情況paint()
將會被調用:
- 視窗最小化,再最大化
- 視窗的大小發生變化
repaint
方法被調用
思考:如何證明上面的三種情況會調用paint()方法?
運行上面的程式,可以看到命令行視窗列印出“paint方法被調用~“的字樣。
這時,點擊繪製圓形圖案視窗的最小化按鈕,可以看到命令行視窗又列印了一行paint方法被調用的字樣:
拖動列印圓形圖案的視窗,調整其大小,可以看到命令行視窗一直顯示paint方法被調用:
repaint
方法被調用在後面證明。
3.繪圖方法
Graphics類:
Graphics類可以理解就是畫筆,為我們提供了各種繪製圖形的方法[參考JDK幫助文檔]
-
畫直線
drawLine(int x1, int y1, int x2, int y2);
在該圖形上下文的坐標系中的點
(x1, y1)
和(x2, y2)
之間繪製一條使用當前顏色的線 -
畫矩形邊框
drawRect(int x, int y, int width, int height)
繪製指定矩形的輪廓, 矩形的左右邊緣為
x
和x + width
。 頂部和底部邊緣為y
和y + height
-
畫橢圓邊框
drawOval(int x, int y, int width, int height)
x,y為要繪製的橢圓的左上角的坐標,width為橢圓的寬度,height為橢圓的高度
-
填充矩形
fillRect(int x, int y, int width, int height)
填寫指定的矩形。 矩形的左右邊緣為
x
和x + width - 1
。 頂部和底部邊緣在y
和y + height - 1
-
填充橢圓
fillOval(int x, int y, int width, int height)
用當前顏色填充由指定矩形界定的橢圓。x,y為要填充的橢圓的左上角的坐標,width為要填充橢圓的寬度,height為填充橢圓的高度
-
畫圖片
drawImage(Image img,int x,int y, ...)
繪製當前可用的指定圖像的大小。 該圖像在其圖形上下文的坐標空間中的左上角( x,y)處繪製。 圖像中的透明像素不會影響已經存在的任何像素
-
畫字元串
drawString(String str,int x,int y)
使用該圖形上下文的當前字體和顏色繪製由指定字元串給出的文本。 最左邊角色的基線是在這個圖形上下文的坐標系中的位置( x,y)
-
設置畫筆的字體
setFont(Font font)
將此圖形上下文的字體設置為指定的字體。 使用此圖形上下文的所有後續文本操作都使用此字體。 空參數被預設忽略
-
設置畫筆的顏色
setColor(Color c)
將此圖形上下文的當前顏色設置為指定的顏色, 使用此圖形上下文的所有後續圖形操作都使用此指定顏色
例子:演示具體用法
package li.gui;
import javax.swing.*;
import java.awt.*;
public class DrawCircle extends JFrame {//JFrame對應視窗,可以理解成一個畫框
//定義一個面板
private MyPanel mp = null;
public static void main(String[] args) {
new DrawCircle();
}
public DrawCircle() {//構造器
//初始化面板
mp = new MyPanel();
//把面板放入視窗(畫框)
this.add(mp);
//設置視窗的的大小
this.setSize(400, 300);
//當點擊視窗的小x時,程式完全退出
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.setVisible(true);//可以顯示
}
}
//1 .先定義一個MyPanel,繼承JPanel類,畫圖形,就在面板上畫
class MyPanel extends JPanel {
// 1.MyPanel 對象就是一個畫板
// 2. Graphics g 把 g理解成一支畫筆
// 3. Graphics提供了很多繪圖的方法
@Override
public void paint(Graphics g) {//繪圖方法
super.paint(g);//調用父類的方法完成初始化
//System.out.println("paint方法被調用~");
//畫出一個圓形
//g.drawOval(0, 0, 100, 100);
//演示繪製不同的圖形
// 1. 畫直線 drawLine(int x1, int y1, int x2, int y2);
//g.drawLine(10,10,100,100);
// 2. 畫矩形邊框 drawRect(int x, int y, int width, int height)
//g.drawRect(10,10,100,100) ;
// 3. 畫橢圓邊框 drawOval(int x, int y, int width, int height)
//g.drawOval(10, 10, 100, 80);
// 4. 填充矩形 fillRect(int x, int y, int width, int height)
//先設置畫筆的顏色
//g.setColor(Color.blue);
//g.fillRect(10,10,100,100);
// 5. 填充橢圓 fillOval(int x, int y, int width, int height)
//g.setColor(Color.red);
//g.fillOval(10,10,100,80);
// 6. 畫圖片 drawImage(Image img,int x,int y, ...)
//首先獲取圖片資源
//註意圖片要放到out目錄的項目的根目錄下
//Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bg.png"));
//g.drawImage(image,10,10,186,282,this);
// 7. 畫字元串 drawString(String str,int x,int y)
//先設置字體顏色
g.setColor(Color.green);
g.setFont(new Font("隸書",Font.BOLD,50));
g.drawString("閃電五連鞭",100,100);
// 8. 設置畫筆的字體 setFont(Font font)
// 9. 設置畫筆的顏色 setColor(Color c)
}
}
4.繪製坦克游戲區域
4.1坦克坐標設計
Tank類
package li.TankGame.VersionFirst;
/**
* @author 李
* @version 1.0
*/
public class Tank {
private int x;//坦克的橫坐標
private int y;//坦克的縱坐標
public Tank(int x, int y) {
this.x = x;
this.y = y;
}
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;
}
}
Hero類
package li.TankGame.VersionFirst;
/**
* @author 李
* @version 1.0
*/
public class Hero extends Tank{
public Hero(int x, int y) {
super(x, y);
}
}
MyPanel類
package li.TankGame.VersionFirst;
import javax.swing.*;
import java.awt.*;
/**
* @author 李
* @version 1.0
* 坦克大戰的繪圖區域
*/
public class MyPanel extends JPanel {
//定義我的坦克
Hero hero = null;
public MyPanel() {
hero = new Hero(100, 100);//初始化自己的坦克
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillRect(0, 0, 700, 550);//填充矩形,預設為黑色
//畫出坦克-封裝方法
drawTank(hero.getX(),hero.getY(),g,0,0);
}
/** 編寫方法,畫出坦克
* @param x 坦克的左上角橫坐標
* @param y 坦克的左上角縱坐標
* @param g 畫筆
* @param direct 坦克方向(上下左右)
* @param type 坦克的類型(我方,敵方)
*/
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:
g.fill3DRect(x, y, 10, 60,false);//畫出坦克左邊的輪子
g.fill3DRect(x+30, y, 10, 60,false);//畫出坦克右邊的輪子
g.fill3DRect(x+10,y+10,20,40,false);//畫出坦克主體
g.fillOval(x+10,y+20,20,20);//畫出坦克艙體
g.drawLine(x+20,y-5,x+20,y+30);//畫出炮管
break;
default:
System.out.println("暫時沒有處理");
}
}
}
TankGame01類(主方法)
package li.TankGame.VersionFirst;
import javax.swing.*;
/**
* @author 李
* @version 1.0
*/
public class TankGame01 extends JFrame {
//定義一個MyPanel
MyPanel mp = null;
public static void main(String[] args) {
TankGame01 tankGame01 = new TankGame01();
}
public TankGame01(){
mp = new MyPanel();
this.add(mp);//把面板(就是游戲的繪圖區域)添加進來
this.setSize(700,550);//設置大小
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//點擊視窗的叉時停止運行
this.setVisible(true);//設置顯示
}
}
繪圖練習:畫出如下圖形
1.蛤蟆
2.王八
3.小老鼠