项目-坦克大战-让坦克动起来

news2024/11/29 0:51:32

为什么写这个项目

  • 好玩
  • 涉及到java各个方面的技术
    1,java面向对象
    2,多线程
    3,文件i/o操作
    4,数据库
  • 巩固知识

java绘图坐标体系

坐标体系-介绍

在这里插入图片描述

坐标体系-像素

  • 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的
  • 像素是一个密度单位,而厘米是长度单位,两者无法比较
    例如“计算机显示器的分辨率是800*600,表示计算机屏幕上的每一行由800个点组成,共有600行。整个计算机屏幕共有480000个像素。

介绍-快速入门

入门案例-在面板上绘制一个圆

public class DrawCircle extends JFrame {//JFrame 对应窗口,可以理解成一个画框

    public static void main(String[] args) {
        new DrawCircle();
    }

    //1,定义一个面板
    private MyPanel mp = null;

    public DrawCircle() {//构造器
        //2,初始化面板
        mp = new MyPanel();
        //3,把面板放入到画框
        this.add(mp);
        //4,设置窗口的大小
        this.setSize(800, 800);
        //5,(默认退出)当点击窗口的小×,程序完全退出
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //6,可以显示
        this.setVisible(true);
    }
}

//1,先定义一个MyPanel类,继承JPanel类, 画图形,在画板上画
class MyPanel extends JPanel {
    /*
    1,MyPanel 对象就是一个画板
    2,Graphics g  可以把g理解成一支画笔
    3,Graphics 提供了很多绘图方法
     */
    //paint方法被调用:当组件第一次在屏幕显示时,程序会自动调用paint()方法来绘制组件
    @Override
    public void paint(Graphics g) {//绘图方法
        super.paint(g);//调用父类的方法完成初始化
        System.out.println("paint方法被调用了~");
        //画一个圆形  drawOval(x1,y1,y2,y2)
//        g.drawOval(0,0,100,100);

        //画直线 drawLine(int x1,int y1,int x2,int y2)
//        g.drawLine(10, 10, 100, 100);

        //画矩形边框 drawRect(int x, int y, int width, int height)
        //g.drawRect(10, 10, 100, 100);

        //画椭圆边框 drawOval(int x, int y, int width, int height)

        //填充矩形 fillRect(int x, int y, int width, int height)
        //填充椭圆 fillOval(int x, int y, int width, int height)

        //设置画笔的颜色
//        g.setColor(Color.blue);
//        g.drawOval(0,0,100,100);

        //画图片  drawImage(Image img, int x, int y, ..)
        //1,获取图片资源   /表示在该项目的根目录去获取  图片资源
//        Image image = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/01.jpg"));
//        g.drawImage(image,10,10,740,500,this);
        //画字符串 drawString(String str, int x, int y)//写字
         //给画笔设置颜色和字体
        g.setColor(Color.red);
        //public abstract void setFont(Font font);  调用setFont方法,需要传入一个对象
        g.setFont(new Font("隶书", Font.BOLD, 50));//Font.BOLD 表示粗体
        //给画笔设置内容
        //这里设置的 100, 100, 是 "北京你好"左下角
        g.drawString("北京你好", 100, 100);
        //设置画笔的字体 setFont(Font font)
        //设置画笔的颜色 setColor(Color c) 
    }
}

在这里插入图片描述

在这里插入图片描述

绘图原理

  • Component类提供了两个和绘图相关最重要的方法
    1,paint(Graphics g) 绘制组件的外观
    2,repaint() 刷新组件的外观
  • 当组件第一次在屏幕显示时,程序会自动调用paint()方法来绘制组件
  • 在以下情况下paint() 将会被调用
    1,窗口最小化,再最大化
    2,窗口的大小发生变化
    3,repaint方法被调用

Graphics 类

Graphics类可以理解为:就是画笔。为我们提供了各种绘制图形的方法

绘出坦克

  • 坦克父类 Tank
    定义坦克的横坐标和纵坐标,进行初始化,并调用set get方法,以供其他类来使用
  • 自己的坦克类,继承坦克父类 Hero
    重写父类的构造器
  • 画板类 MyPanel 继承Jpanel类
    1,定义自己的坦克,并初始化自己的坦克
    2,重写Jpanel类中的paint方法(传入画笔)
    3,通过画笔填充一个矩形区域 g.fillRect();
    4,创建drawTank方法,设置参数(int x, int y, Graphics g, int direct, int type) direct:用与控制方向 type:用于控制颜色
    5,在paint方法中调用drawTank方法
  • 窗体类 TankGame01
    1,创建画板对象,并进行初始化
    2,把画板传入窗体
    3,设置窗体大小
    4,设置窗体默认退出
    5,设置窗体可见

坦克父类

//坦克父类
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;
    }
}

自己的坦克

//自己的坦克,继承坦克父类
public class Hero extends Tank{
//重写父类的构造器
    public Hero(int x, int y) {
        super(x, y);
    }
}

画板类


//画板类
public class MyPanel extends JPanel {
    //	1,定义自己的坦克,并初始化自己的坦克
    Hero hero = null;

    public MyPanel() {//初始化自己的坦克
        hero = new Hero(100,100);
    }

    //2,重写Jpanel类中的paint方法(传入画笔)
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //	3,通过画笔填充一个矩形区域   g.fillRect();
        g.fillRect(0,0,1000,750);//填充矩形,默认为黑色
        //	5,在paint方法中调用drawTank方法
        drawTank(hero.getX(),hero.getY(),g,0,1);
        drawTank(hero.getX() +100,hero.getY(),g,0,0);
    }
    /*
    int x 坦克的横坐标
    int y 坦克的纵坐标
    Graphics g  画笔
    int direct  坦克的方向
    int type  坦克的类型
     */
    //4,创建drawTank方法,设置参数(int x, int y, Graphics g, int direct, int type)  direct:用与控制方向   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 + 30, x + 20, y);//画出炮筒
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }
}


窗体类

//窗体类
public class TankGame01 extends JFrame {//窗体
    public static void main(String[] args) {
        new TankGame01();
    }

    private MyPanel mp = null;//1,创建画板对象
    public TankGame01(){
        mp = new MyPanel();//画板初试化
        this.add(mp);//2,把画板传入窗体
        this.setSize(1000,750);//3,设置窗体大小
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//4,设置窗体默认退出
        this.setVisible(true);//	5,设置窗体可见

    }

}

java事件处机制

事件处理机制入门案例:小球移动代码

小球案例中的事件源、事件/对象和事件监听者分别是什么

  • 事件源:键盘
  • 事件:按下鼠标
  • 事件监听者:MyPanel_类(实现KeyListener键盘监听器接口)
public class BallMove extends JFrame{//窗体

    public static void main(String[] args) {
        BallMove ballMove = new BallMove();
    }
    //创建画板对象
    private MyPanel_ mp = null;

    public BallMove() {
        mp = new MyPanel_();//初始化画板
        this.add(mp);//给窗体添加组件-画板
        this.setSize(500,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //窗体JFrame对象可以监听键盘事件,面板时间了键盘监听器
        // 即可以监听到面板发生的监听事件
        this.addKeyListener(mp);
        this.setVisible(true);
    }
}
class MyPanel_ extends JPanel implements KeyListener {//画板 实现键盘监听器
    int x = 10;
    int y = 10;
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.fillOval(x,y,10,10);
    }
    //有字符输出时,该方法就会触发
    @Override
    public void keyTyped(KeyEvent e) {

    }
    //当某个键按下,该方法会触发
    @Override
    public void keyPressed(KeyEvent e) {
//        System.out.println("按键");
        if (e.getKeyCode() == KeyEvent.VK_DOWN){
            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) {

    }
}

java事件处理是采取“委派事件模型”。当事件发生时,产生事件的对象,会把此“信息”传递给“事件的监听者”处理,。这里所说的“信息”实际上是java.awt.event事件类库里某个类所创建的对象,把他成为“事件的对象”在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

让坦克动起来

在前面绘制好坦克的基础上实现改变方向和移动

改变坦克的方向

  • 坦克父类 Tank
    定义坦克方向的属性,进行初试化,并创建set get方法
  • 自己的坦克类,继承坦克父类 Hero
    不变
  • 画板类 MyPanel 继承Jpanel 实现 KeyListener 键盘监听器接口
    1,在drawTank方法中,设置方向:向上 向下 向左 向右
    2,在实现KeyListener 键盘监听器接口时,重写接口中的方法
    3,在keyPressed方法中,将键盘输入与方向相结合
    4,在keyPressed中调用repaint方法进重绘,使的画出的图形改变时,仍然可以画出
  • 窗体类 TankGame02
    让窗体监听画板发生的监事件

使坦克动移动起来

  • 坦克父类 Tank
    1,定义 可以上下左右移动的方法。使得在MyPanel 类中可以直接调用方法进行移动
    2,定义speed属性,进行初始化,并添加set get方法
  • 自己的坦克类,继承坦克父类 Hero
    不变
  • 画板类 MyPanel 继承Jpanel 实现 KeyListener 键盘监听器接口
    1,在MyPanel 类中调用setSpeed设置speed的大小
    3,在keyPressed方法中,调用hero中的 上下左右方法
  • 窗体类 TankGame02
    不变

坦克父类

//坦克父类
public class Tank {
    private int x;//坦克的横坐标
    private int y;//坦克的纵坐标
    private int direct;//坦克方向   //direct表示方法:  0:向上   1:向右    2:向下    3:向左
    private int speed = 1;

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
    //定义 可以上下左右移动的方法
    public void moveUp() {
        y -= speed;
    }

    public void moveDown() {
        y += speed;
    }

    public void moveLeft() {
        x -= speed;
    }

    public void moveRight() {
        x += speed;
    }


    public Tank(int direct) {
        this.direct = direct;
    }

    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 void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

自己的坦克,继承坦克父类

//自己的坦克,继承坦克父类
public class Hero extends Tank {

    public Hero(int x, int y) {
        super(x, y);
    }
}

画板类

//画板类
public class MyPanel extends JPanel implements KeyListener {
    //定义我的坦克
    Hero hero = null;

    public MyPanel() {//初始化自己的坦克
        hero = new Hero(100,100);
        hero.setSpeed(5);
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //3,通过画笔填充一个矩形区域   g.fillRect();
        g.fillRect(0,0,1000,750);//填充矩形,默认为黑色

        drawTank(hero.getX(),hero.getY(),g,hero.getDirect(),1);
//        drawTank(hero.getX() +100,hero.getY(),g,hero.getDirect(),0);
//        drawTank(hero.getX() +200,hero.getY(),g,hero.getDirect(),0);
//        drawTank(hero.getX() +300,hero.getY(),g,hero.getDirect(),1);
    }
    /*
    int x 坦克的横坐标
    int y 坦克的纵坐标
    Graphics g  画笔
    int direct  坦克的方向
    int 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;
        }

        //根据坦克的方向,来绘制坦克
        //direct表示方法:  0:向上   1:向右    2:向下    3:向左
        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 + 30, x + 20, y);//画出炮筒
                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);//画出炮筒
                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);//画出炮筒
                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);//画出炮筒
                break;
            default:
                System.out.println("暂时没有处理");
        }
    }
    //有字符输出时,该方法就会触发
    @Override
    public void keyTyped(KeyEvent e) {

    }
    //当某个键按下,该方法会触发
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W){
            //改变坦克方向
            hero.setDirect(0);
            //让坦克动起来
            hero.moveUp();
        } else if (e.getKeyCode() == KeyEvent.VK_S) {
            hero.setDirect(2);
            hero.moveDown();
        } else if (e.getKeyCode() == KeyEvent.VK_A) {
            hero.setDirect(3);
            hero.moveLeft();
        } else if (e.getKeyCode() == KeyEvent.VK_D) {
            hero.setDirect(1);
            hero.moveRight();
        }

        //重绘
        repaint();
    }
    //当某个键释放(松开),该方法会触发
    @Override
    public void keyReleased(KeyEvent e) {

    }
}

窗体类

//窗体类
public class TankGame02 extends JFrame {//窗体
    public static void main(String[] args) {
        new TankGame02();
    }
    private MyPanel mp = null;//创建画板对象
    public TankGame02(){
        mp = new MyPanel();//画板初试化
        this.add(mp);//把画板传入窗体
        this.setSize(1000,750);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //窗体JFrame对象可以监听键盘事件,面板实现了键盘监听器
        // 即可以监听到面板发生的监听事件
        this.addKeyListener(mp);
        this.setVisible(true);
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1670567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

netty配置SSL、netty配置https(生产环境)

netty配置SSL、netty配置https(生产环境) 上一篇提到了如何在开发环境使用SSL:https://lingkang.top/archives/netty-pei-zhi-ssl 转自:https://lingkang.top/archives/netty-pei-zhi-https 那么netty如何使用可信任的证书呢&a…

栈的实现与OJ括号匹配

今日备忘录: "不破不立. " 本文索引 1. 前言2. 顺序表与链表的区别3. 什么是栈4. 栈的实现5. OJ括号匹配6. 总结 1. 前言 人总是在坍塌中重建, 有些东西必须摧毁, 才能迎来新生, 不管是那些消耗你的人, 还是令你感到焦虑的事情, 还是一份你觉得毫无意义并且又不喜欢…

python(环境安装)搭建、pycharm安装、背景改为白色详细文章

安装python环境 1、下载python安装包 Welcome to Python.org(官网链接) 2、点击下载、windows、python3.12.3 安装python 执行安装程序、安装选项 选择下面两项 翻译 Use admin privieges when installing py.exe是使用administrator超级管理员用户安…

疾病防范:拯救微笑,关于儿童抑郁的注意事项

引言: 儿童抑郁是一种常见但常被忽视的心理健康问题,对孩子的身心健康和成长都会造成严重影响。本文将探讨儿童抑郁的注意事项,以帮助家长和教育者更好地识别、理解和应对儿童抑郁问题。 1. 深入了解抑郁症: 抑郁症并非一种偶发的…

技术探索:揭秘美颜API与直播美颜SDK的算法与优化策略

今天,小编将深入探讨美颜API与直播美颜SDK背后的算法原理和优化方法。 一、美颜算法概述 美颜算法的核心在于对人脸的识别和特征分析,通过对人脸各个部位的处理,达到美颜等效果。 二、美颜API的算法原理 美颜API通常是以云服务的形式提供&…

参加了深圳线下组织的商业沙龙,收获颇丰

能参加本次商业沙龙也本是一连串的事情导致的,听我慢慢道来: 大概在4.13之前无意收到忘了谁发的短信了,说有个啥AI的报告会,然后我就报名了: 会上大佬还是挺多的,来了好多各界的老板和政府的领导&#xff…

MySQL—子查询

目录 ▐ 子查询概述 ▐ 准备工作 ▐ 标量子查询 ▐ 列子查询 ▐ 表子查询 ▐ 多信息嵌套 ▐ 子查询概述 • 子查询也称嵌套查询,即在一个查询语句中又出现了查询语句 • 子查询可以出现在from 后面 或where后面 • 出现在 from 后称表子查询,结…

CSS 之 帧动画(Keyframe Animation)

一、简介 ​ CSS 制作 Web 动画有两种方式: 帧动画(Keyframe Animation)和过渡动画(Transition Animation)。在不同的业务场景中,我们应该选择不同的动画方式,通常来说:对于交互元素…

数据库管理-第187期 23ai:怎么用SQL创建图(20240510)

数据库管理187期 2024-05-10 数据库管理-第187期 23ai:怎么用SQL创建图(20240510)1 安装PGX1.1 数据库配置对应用户1.2 使用RPM包安装Graph Server1.3 安装Oracle Graph Client1.4 访问PGX页面 2 SQL Property Graph2.1 创建SQL属性图2.2 关于点和边图元…

k8s 使用Docker和Containerd对比分析

目录 k8s 使用Docker和Containerd对比分析 互动1:docker build构建的镜像和containerd镜像通用吗? 互动2:k8s1.24之前版本和1.24及1.24之后版本区别? k8s 使用Docker和Containerd对比分析 如果你使用Docker作为K8S容器运行时的…

NASA数据集——非洲加蓬上空的回波能量波形、高程数据和地理标记图像V001版本

数据英文名称 AfriSAR LVIS L1B Geolocated Return Energy Waveforms V001 AfriSAR LVIS L2 Geolocated Surface Elevation Product V001 AfriSAR LVIS L1A Geotagged Images V001 简介 该数据集包含非洲加蓬上空的回波能量波形数据。测量数据由美国国家航空航天局的陆地、…

《一“企”谈》∣企企通走进『鹏辉能源』,探索百亿储能上市企业如何实现供应链数字化转型

随着运营模式的升级和市场竞争的加剧,采购数字化已成为企业提升竞争力的关键。通过整合人工智能、大数据、云计算和物联网等先进技术,采购流程正逐步实现智能化、协同化和绿色化,大幅提升采购效率和决策质量。 广州鹏辉能源科技股份有限公司&…

STM: SpatioTemporal and Motion Encoding for Action Recognition 论文阅读

STM: SpatioTemporal and Motion Encoding for Action Recognition 论文阅读 Abstract1. Introduction2. Related Works3. Approach3.1. Channel-wise SpatioTemporal Module3.2. Channel-wise Motion Module3.3. STM Network 4. Experiments5. Conclusion 文章信息&#xff1a…

vin查询接口如何对接

vin查询接口是VIN车辆识别代码查询接口的简称,也叫vin查询车辆信息接口、车架号查询接口,指的是输入车辆VIN识别码(车架号),返回车辆相关信息,如车辆品牌、车型、油耗、车身形式、排量等。那么vin查询接口如…

数据治理平台有哪些核心功能?十款热门数据治理平台盘点

数据治理是管理企业数据资产全过程中的决策、监督和执行控制,旨在引导和影响组织内所有其他数据管理活动,核心目标是确保数据按照既定的管理制度和行业最佳实践得到妥善管理。不论企业是否设有正式的数据治理职位,那些确立了正式数据治理流程…

高德地图:标点-连线-自定义图标-文字提示的使用

目录 下面是使用高德地图进行标点连线的使用: 1.定义一个装载地图的容器,并定义进行标点和连线的数据 2.在组件的mounted钩子函数中初始化地图,给地图添加点击事件监听器。 3.使用高德地图的Polyline类来绘制连接线。 这是上面代码的效果…

人工智能生成图像的兴起:区分事实与虚构

人工智能生成图像的兴起:区分事实与虚构 概述 在人工智能 (AI) 已融入我们日常生活的时代,人工智能生成图像的快速发展引发了人们对数字内容真实性的担忧。最近,人工智能生成的图像甚至欺骗了最敏锐的眼睛,这引发了人们对批判性…

Shell生成支持x264的ffmpeg安卓全平台so

安卓 FFmpeg系列 第一章 Ubuntu生成ffmpeg安卓全平台so 第二章 Windows生成ffmpeg安卓全平台so 第三章 生成支持x264的ffmpeg安卓全平台so(本章) 文章目录 安卓 FFmpeg系列前言一、实现步骤1、下载x264源码2、交叉编译生成.a3、加入x264配置4、编译ffmp…

数字水印 | Python 基于离散小波变换 DWT 的图像水印嵌入(下)

🍍原文: 基于 dwt (离散小波变换) 实现彩色图像水印嵌入部分_2.0 🍍写在前面: 本文在原文的基础上进行了代码补全。 正文 修改了尺寸变换导致的图像失真问题,同时简化了部分代码。 效果确实很好😉 1 通道…

15W 3KVAC隔离 宽电压输入 AC/DC 电源模块——TP15AL系列

TP15AL系列产品是一款小体积裸板式电源,该系列电源输出功率为15W,具有低漏电流小于0.35mA,隔离耐压高达3KV等特点。产品安全可靠,EMC性能好,该系列产品广泛应用于智能家居、充电桩、安防、物联、工控等行业中,如应用于电磁兼容比较恶劣的环境…