欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

坦克大战第一节——画出自己的坦克(新手篇)

程序员文章站 2022-03-18 15:47:45
刚刚开始学习Java,对Java不是很熟悉,但是自己的兴趣挺喜欢Java。现在自己在自学Java做一个小游戏,坦克大战。 自己现在完成了画出自己的坦克和坦克的移动方向。希望各位大神指导一下我这个刚刚学Java的新手小白。 我会每完成一个阶段,就更新一下博客,跟进一下自己的学习进度。 在做这个坦克大战 ......

      刚刚开始学习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) {
        
    }

}

坦克大战第一节——画出自己的坦克(新手篇)

     我画自己的坦克只是计算好位置,画出图形。

    再来自己到最后,有一个疑惑,自己不懂。

   坦克每次改变方向移动时,能不能有更加方便的方法来封装上面画图形时自己手动改变位置?若画其他坦克,是不是还要自己手动改变坦克的位置?这里自己觉得处理不是很好,现在还在想怎么能更加完美,更加方便。