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);//让窗口监听键盘 } }
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现