Java学习第四十五天<Java绘图技术><坦克大战项目>

Java绘图技术

 

package chapter19.Pre;
​
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.setSize(400,300);//设置画框大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击窗口小×,程序退出
        this.setVisible(true);//可视
        this.add(mp);//面板放入到窗口(画框)
    }
}
//1定义一个MyPanel面板类 继承JPanel类 画图在面板上画
class MyPanel extends JPanel{
    @Override//paint 回车
    public void paint(Graphics g) {//Graphics g画笔
        super.paint(g);//调用父类方法完成初始化
        g.drawOval(10,10,100,100);//左上角坐标 长宽 画圆
        System.out.println("paint方法被调用");//第一次可视化,最小化,最大化都会自动调用
​
        g.drawLine(10,10,100,100);//画直线
        g.drawRect(10,10,100,100);//画边框
        g.setColor(Color.BLUE);//设置画笔颜色
        g.fillRect(10,10,100,100);//矩形填充
        g.fillOval(10,10,100,100);//椭圆填充
​
        //获取图片资源 /1.jpg表示在该项目的根目录获取1.jpg
        Image image = Toolkit.getDefaultToolkit().getImage("D:/Documents/Pictures/Saved Pictures/2.jpg");//获取图片资源 +图片路径
        g.drawImage(image,10,10,121,123,this);
        g.setFont(new Font("隶书",Font.BOLD,50));//字体 粗体 大小50
        g.drawString("北京你好",100,100);//左下角写字
    }
}

 

package chapter19.Pre;
​
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
​
//键盘控制小球移动
public class BallMove extends JFrame{
    MyPanel2 mp=null;
​
    public static void main(String[] args) {
        BallMove ballMove = new BallMove();
    }
​
    public BallMove()  {
        mp=new MyPanel2();
        this.add(mp);
        this.setSize(400,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.addKeyListener(mp);//窗口可以监听mp面板的键盘事件
​
    }
}
class MyPanel2 extends JPanel implements KeyListener {//监听键盘事件
    int x=10;
    int y=10;//坐标能动,改变量
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x,y,20,20);
    }
​
    @Override
    public void keyTyped(KeyEvent e) {//监听字符输出
​
    }
​
    @Override
    public void keyPressed(KeyEvent e) {//监听按键
        System.out.println((char)e.getKeyCode()+"被按了");
        if (e.getKeyCode()== KeyEvent.VK_DOWN){ //向下键code值
           y++;
        }else if (e.getKeyCode()== KeyEvent.VK_UP){
            y--;
        }else if (e.getKeyCode()== KeyEvent.VK_LEFT){
            x--;
        }else if (e.getKeyCode()== KeyEvent.VK_RIGHT){
            x++;
        }
​
        repaint();//重绘动起来
​
    }
​
    @Override
    public void keyReleased(KeyEvent e) {//监听松开键
​
    }
}

 

坦克大战项目

1.绘制我方坦克

package chapter19.TankGame;
​
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 int getY() {
        return y;
    }
}

 

package chapter19.TankGame;
​
public class Hero extends Tank{
​
    public Hero(int x, int y) {
        super(x, y);
    }
​
}

 

package chapter19.TankGame;
​
import javax.swing.*;
import java.awt.*;
​
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,1000,750);//填充矩形 默认黑色 画游戏黑色背景
        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://向上
                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,x+20,y+30);
                g.setColor(Color.white);
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+2,y+10*i,x+8,y+10*i);
                }
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+32,y+10*i,x+38,y+10*i);
                }
​
​
​
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }
}

 

package chapter19.TankGame;
​
import javax.swing.*;
import java.awt.*;
​
public class TankGame01 extends JFrame {
    MyPanel mp=null;//定义一个面板
​
    public static void main(String[] args) {
        TankGame01 tankGame01 = new TankGame01();
    }
​
    public TankGame01() {
        mp=new MyPanel();//创建面板
        this.add(mp);//放入窗口
        this.setSize(1000,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
}

 

2 绘制我方敌方坦克,并控制运动

package chapter19.TankGame2;
​
public class Tank {
    private int x;
    private int y;
    private int direct;
    private int speed;
​
    public int getSpeed() {
        return speed;
    }
​
    public void setSpeed(int speed) {
        this.speed = speed;
    }
​
    public int getDirect() {
        return direct;
    }
​
    public void setDirect(int direct) {
        this.direct = direct;
    }
​
    public Tank(int x, int y) {
        this.x = x;
        this.y = y;
    }
​
    public int getX() {
        return x;
    }
​
    public int getY() {
        return y;
    }
​
    public void moveUp(){
        y-=speed;
    }
    public void moveRight(){
        x+=speed;
    }
    public void moveLeft(){
        x-=speed;
    }
    public void moveDown(){
        y+=speed;
    }
}

 

package chapter19.TankGame2;
​
public class Hero extends Tank {
​
    public Hero(int x, int y) {
        super(x, y);
    }
​
}

 

package chapter19.TankGame2;
​
public class Enemy extends Tank{
​
    public Enemy(int x, int y) {
        super(x, y);
    }
}

 

package chapter19.TankGame2;
​
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
​
public class MyPanel extends JPanel implements KeyListener {//监听键盘
    //定义我的坦克
    Hero hero=null;
    Vector<Enemy> enemies=new Vector<>();
    int enemySize=3;
​
    public MyPanel() {
        hero=new Hero(100,100);//初始化自己的坦克
        hero.setSpeed(20);
        for (int i=0;i<enemySize;i++){
            Enemy enemy = new Enemy((100 * (i + 1)), 0);//先初始化再放容器内
            enemy.setDirect(2);
            enemies.add(enemy);
        }
​
    }
​
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillRect(0,0,1000,750);//填充矩形 默认黑色 画游戏黑色背景
        drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);
        for (int i = 0; i <enemies.size() ; i++) {//考虑销毁后的数量
            Enemy enemy = enemies.get(i);
            drawTank(enemy.getX(),enemy.getY(),g,enemy.getDirect(),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){//0上 1右 2下 3左
            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+30,x+20,y);//炮筒
                g.setColor(Color.white);
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+2,y+10*i,x+8,y+10*i);
                }
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+32,y+10*i,x+38,y+10*i);
                }
                break;
            case 1://向右
                g.fill3DRect(x,y,60,10,false);//左轮
                g.fill3DRect(x,y+30,60,10,false);//右轮
                g.fill3DRect(x+10,y+10,40,20,false);//中块
                g.fillOval(x+20,y+10,20,20);//盖子
                g.drawLine(x+30,y+20,x+60,y+20);
                g.setColor(Color.white);
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+10*i,y+2,x+10*i,y+8);
                }
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+10*i,y+32,x+10*i,y+38);
                }
                break;
            case 2://向下
                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+30,x+20,y+60);
                g.setColor(Color.white);
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+2,y+10*i,x+8,y+10*i);
                }
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+32,y+10*i,x+38,y+10*i);
                }
                break;
            case 3://向左
                g.fill3DRect(x,y,60,10,false);//左轮
                g.fill3DRect(x,y+30,60,10,false);//右轮
                g.fill3DRect(x+10,y+10,40,20,false);//中块
                g.fillOval(x+20,y+10,20,20);//盖子
                g.drawLine(x+30,y+20,x,y+20);
                g.setColor(Color.white);
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+10*i,y+2,x+10*i,y+8);
                }
                for (int i = 1; i <6 ; i++) {
                    g.drawLine(x+10*i,y+32,x+10*i,y+38);
                }
                break;
​
            default:
                System.out.println("暂时没有处理");
        }
    }
​
    @Override
    public void keyTyped(KeyEvent e) {
​
    }
​
    @Override
    public void keyPressed(KeyEvent e) {//处理wdsa键按下情况
      if (e.getKeyCode()== KeyEvent.VK_W){
          hero.setDirect(0);
          hero.moveUp();
      }else if (e.getKeyCode()==KeyEvent.VK_D){
          hero.setDirect(1);
          hero.moveRight();
      }else if (e.getKeyCode()==KeyEvent.VK_S){
          hero.setDirect(2);
          hero.moveDown();
      }else if (e.getKeyCode()==KeyEvent.VK_A){
          hero.setDirect(3);
          hero.moveLeft();
      }
      this.repaint();
    }
​
    @Override
    public void keyReleased(KeyEvent e) {
​
    }
}

 

package chapter19.TankGame2;
​
import javax.swing.*;
​
public class TankGame02 extends JFrame {
    MyPanel mp=null;//定义一个面板
​
    public static void main(String[] args) {
        TankGame02 tankGame01 = new TankGame02();
    }
​
    public TankGame02() {
        mp=new MyPanel();//创建面板
        this.add(mp);//放入窗口
        this.setSize(1000,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.addKeyListener(mp);//让窗口监听键盘
    }
}
posted @   征途**  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示