1. 程式人生 > >坦克大戰第一節——畫出自己的坦克(新手篇)

坦克大戰第一節——畫出自己的坦克(新手篇)

      剛剛開始學習Java,對Java不是很熟悉,但是自己的興趣挺喜歡Java。現在自己在自學Java做一個小遊戲,坦克大戰。

     自己現在完成了畫出自己的坦克和坦克的移動方向。希望各位大神指導一下我這個剛剛學Java的新手小白。

     我會每完成一個階段,就更新一下部落格,跟進一下自己的學習進度。

    在做這個坦克大戰的時候,不知道從哪裡開始做起,再來自己就覺得先畫出自己的坦克吧。

    下面是建立坦克類(方便以後能建立更加多的坦克),再建立自己的坦克繼承坦克類。

package tankgames;

import java.awt.*;

//建立坦克類
public class Tank {
    int x,y,w,h;
    int speed;
    int direct;
    Color c1,c2,c3;
    
    public Tank(){
        x=230;
        y=300;
        w=5;
        h=60;
        speed=10;
        direct=0;
    
    }

    public Tank(int x, int y, int w, int
h, int speed, int direct) { super(); this.x = x; this.y = y; this.w = w; this.h = h; this.speed = speed; this.direct = direct; } } //建立我的坦克子類 class MyTank extends Tank{ //建立顏色物件,並設定顏色 public MyTank(){ this.c1 = new Color(128,128,128);
this.c2 = new Color(0,255,0); this.c3 = new Color(0,0,255); } public MyTank(int x, int y, int w, int h, int speed, int direct) { super(x, y, w, h, speed, direct); this.c1 = new Color(128,128,128); this.c2 = new Color(0,255,0); this.c3 = new Color(0,0,255); } }

 

      建立完自己的坦克,要寫個主函式來畫出自己的坦克,以下是畫出自己的坦克:

package tankgames;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

public class TankGame extends JFrame{
    private static final long serialVersionUID = 1L;
    
    MyPanel mp;

    public static void main(String[] args) {
        new TankGame().setVisible(true);

    }
    
    public TankGame(){
        this.setTitle("坦克大戰");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setBounds(100, 100, 600, 500);
        
        //建立我的面板物件,並新增到我的窗體裡面
        mp = new MyPanel();
        this.getContentPane().add(mp);
        
        //註冊鍵盤事件監聽
        this.addKeyListener(mp);
    }

}

//建立我的面板子類
class MyPanel extends JPanel implements KeyListener{
    MyTank myTank;
    private static final long serialVersionUID = 1L;
    
    public MyPanel(){
        this.setLayout(null);
        myTank = new MyTank();
    }
    
    //面板容器的設定和元件在面板容器裡顯示
    public void paint(Graphics g){
        super.paint(g);
        g.setColor(new Color(255,255,221));
        g.fill3DRect(0, 0, 500, 400, false);
        drawTank(myTank,g);
    }
    
    //畫坦克
    public void drawTank(Tank t,Graphics g){
        int x = t.x, y = t.y, w = t.w, h = t.h;
        //畫出向上的坦克
        if(t.direct == 0){
            Graphics2D g2d = (Graphics2D)g;
            g.setColor(t.c1);
            g.fill3DRect(x, y, w, h, false);
            g.fill3DRect(x+7*w, y, w, h, false);
            g.setColor(t.c2);
            g.fill3DRect(x+w, y+2*w, 6*w, 8*w, false);
            g.fillOval(x+2*w, y+4*w, 4*w, 4*w);
            g2d.setColor(t.c3);
            g2d.setStroke(new BasicStroke(5.0f));
            g2d.drawLine(x+4*w, y, x+4*w, y+6*w);
        }
        //畫出向下的坦克
        else if(t.direct == 2){
            Graphics2D g2d = (Graphics2D)g;
            g.setColor(t.c1);
            g.fill3DRect(x, y, w, h, false);
            g.fill3DRect(x+7*w, y, w, h, false);
            g.setColor(t.c2);
            g.fill3DRect(x+w, y+2*w, 6*w, 8*w, false);
            g.fillOval(x+2*w, y+4*w, 4*w, 4*w);
            g2d.setColor(t.c3);
            g2d.setStroke(new BasicStroke(5.0f));
            g2d.drawLine(x+4*w, y+6*w, x+4*w, y+12*w);
        }
        //畫出向左的坦克
        else if(t.direct == 3){
            Graphics2D g2d = (Graphics2D)g;
            g.setColor(t.c1);
            g.fill3DRect(x, y, h, w, false);
            g.fill3DRect(x, y+7*w, h, w, false);
            g.setColor(t.c2);
            g.fill3DRect(x+2*w, y+w, 8*w, 6*w, false);
            g.fillOval(x+4*w, y+2*w, 4*w, 4*w);
            g2d.setColor(t.c3);
            g2d.setStroke(new BasicStroke(5.0f));
            g2d.drawLine(x, y+4*w, x+6*w, y+4*w);
        }
        //畫出向右的坦克
        else if(t.direct ==1){
            Graphics2D g2d = (Graphics2D)g;
            g.setColor(t.c1);
            g.fill3DRect(x, y, h, w, false);
            g.fill3DRect(x, y+7*w, h, w, false);
            g.setColor(t.c2);
            g.fill3DRect(x+2*w, y+w, 8*w, 6*w, false);
            g.fillOval(x+4*w, y+2*w, 4*w, 4*w);
            g2d.setColor(t.c3);
            g2d.setStroke(new BasicStroke(5.0f));
            g2d.drawLine(x+6*w, y+4*w, x+12*w, y+4*w);
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        
    }
    //我的坦克移動
    @Override
    public void keyPressed(KeyEvent e) {
        //向左移動
        if(e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_A){
            myTank.x -= myTank.speed;
            myTank.direct = 3;
        }
        //向右移動
        else if(e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_D){
            myTank.x += myTank.speed;
            myTank.direct = 1;
        }
        //向上移動
        else if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_W){
            myTank.y -= myTank.speed;
            myTank.direct =0;
        }
        //向下移動
        else if(e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_S){
            myTank.y += myTank.speed;
            myTank.direct = 2;
        }
        //關閉遊戲
        else if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
            System.exit(0);
        }
        //重新整理圖形
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        
    }

}

     我畫自己的坦克只是計算好位置,畫出圖形。

    再來自己到最後,有一個疑惑,自己不懂。

   坦克每次改變方向移動時,能不能有更加方便的方法來封裝上面畫圖形時自己手動改變位置?若畫其他坦克,是不是還要自己手動改變坦克的位置?這裡自己覺得處理不是很好,現在還在想怎麼能更加完美,更加方便。