maptalks 右键删除多边形 电子围栏

news2024/11/15 8:44:49

<!-- 地图组件 -->
<template>
  <div :id="id" class="container"></div>
</template>

<script>
import _ from "lodash";
import "maptalks/dist/maptalks.css";
import * as maptalks from "maptalks";
export default {
  //import引入的组件需要注入到对象中才能使用
  name: "Map",
  props: {
    id: {
      type: String,
      default: () => {
        return "map";
      },
    },
    mapSet: {
      type: Object,
      default: () => {
        return {};
      },
    },
    color: {
      type: String,
      default: () => {
        return "";
      },
    },
  },
  components: {},
  data() {
    //这里存放数据
    return {
      dataLis: [],
      layer: null,
      layer2: null,
      map: null,
      polygon: null,
      drawTool: null,
      // 默认中心点点位
      center: [121.7294793802647, 29.97249795779439],
      // 缩放层级
      zoom: 14,
      // 倾斜度
      pitch: 0,
      // 轴承
      // bearing: 90,
      // 最小缩放层级
      minZoom: 1,
      // 最大缩放层级
      maxZoom: 18.5,
      symbol: {
        polygonFill: "#ff0000", // 图形覆盖颜色
        polygonOpacity: 0.3, // 图形覆盖区域透明度
        lineColor: "#ff0000", // 线条颜色
        lineWidth: 2, // 线条宽度
      },
      pointSymbol: {
        markerFile: "@/assets/logo/logo.png",
        markerWidth: 20,
        markerHeight: 20,
      },
      layerSwitcherControl: {
        position: "top-right",
        // title of base layers
        baseTitle: "Base Layers",
        // title of layers
        overlayTitle: "Layers",
        // layers you don't want to manage with layer switcher
        excludeLayers: [],
        // css class of container element, maptalks-layer-switcher by default
        containerClass: "maptalks-layer-switcher",
      },
      // 电子地图图层
      // urlTemplate: "http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
      // subdomains: ["a", "b", "c", "d"],
      // attribution:
      //   '&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/">CARTO</a>'
      // urlTemplate:
      //   "https://gss{s}.bdstatic.com/8bo_dTSlRsgBo1vgoIiO_jowehsv/tile/?qt=tile&x={x}&y={y}&z={z}&styles=pl&scaler=1&udt=20170927",
      // subdomains: [0, 1, 2, 3],
      // attribution:
      //   '&copy; <a target="_blank" href="http://map.baidu.com">Baidu</a>'
      drawMap: {
        Point: "点",
        LineString: "线",
        Polygon: "多边形",
        Circle: "圆",
        Ellipse: "椭圆",
        Rectangle: "长方形",
      },
    };
  },
  //监听属性 类似于data概念
  computed: {},
  //监控data中的数据变化
  watch: {
    mapSet: {
      deep: true,
      immediate: true,
      async handler(val) {
        if (Object.keys(val).length) {
          let { drawMapType, drawMapArray, editable, draggable } = val;
          if (this.map != undefined) this.map.remove();
          await this.init();
          //  循环插入多边形
          if (drawMapArray && drawMapArray.length > 0) {
            drawMapArray.forEach(item => {
              let obj = {
                // 编辑图形
                drawMapArray: () => {
                  this.startEdit(item, {
                    drawMapType,
                    editable,
                    draggable,
                    drawMapArray: item
                  });
                },
                // 绘制图形
                drawMapType: () => {
                  this.drawMapType({
                    drawMapType,
                    editable,
                    draggable,
                    drawMapArray: item
                  });
                },
              };
              let arrayKeys = Object.keys({
                drawMapType,
                editable,
                draggable,
                drawMapArray: item
              });
              arrayKeys.map((item) => {
                if (obj[item]) return obj[item]();
              });
            })
          } else {
            let obj = {
              // 编辑图形
              // drawMapArray: () => {
              //   this.startEdit(item, {
              //     drawMapType,
              //     editable,
              //     draggable,
              //     drawMapArray
              //   });
              // },
              // 绘制图形
              drawMapType: () => {
                this.drawMapType({
                  drawMapType,
                  editable,
                  draggable,
                  drawMapArray
                });
              },
            };
            let arrayKeys = Object.keys({
              drawMapType,
              editable,
              draggable,
              drawMapArray
            });
            arrayKeys.map((item) => {
              if (obj[item]) return obj[item]();
            });
          }
        } else {
          // console.log("销毁地图");
          if (this.map != undefined) this.map.remove();
        }
      },
    },
    color: {
      immediate: true,
      handler(val) {
        // console.log("🚀 ~ Date:2023/06/15 17:14 ~ File: index.vue ~ Line:118 ----- ", val);
        if (val) {
          let { drawTool, polygon } = this;
          if (drawTool) this.changeSymbol("drawTool", drawTool, val);
          if (polygon) this.changeSymbol("polygon", polygon, val);
          // if (drawTool) {
          //   drawTool.setSymbol({
          //     polygonFill: val, // 图形覆盖颜色
          //     polygonOpacity: 0.3, // 图形覆盖区域透明度
          //     lineColor: val, // 线条颜色
          //     lineWidth: 2 // 线条宽度
          //   });
          // }
          // if (polygon) {
          //   polygon.updateSymbol({
          //     polygonFill: val, // 图形覆盖颜色
          //     lineColor: val // 线条颜色
          //   });
          // }
        }
      },
    },
  },
  //生命周期 - 创建完成(可以访问当前this实例)
  created() { },
  //生命周期 - 挂载完成(可以访问DOM元素)
  mounted() {
    // let a = "rgb(255, 69, 0)";
    // console.log(a.slice(5, a.length - 1));
  },
  // beforeDestroy() {
  //   let { map } = this;
  //   // console.log(
  //   //   "🚀 ~ Date:2023/07/11 14:37 ~ File: index.vue ~ Line:154 ----- ",
  //   //   销毁地图
  //   // );
  //   if (map) map.remove();
  // },
  //方法集合
  methods: {
    // 获取到图层所有的点位
    getSent(data) {
      let array = []
      data.forEach(res => {
        let arrray2 = []
        res._coordinates.forEach(res2 => {
          arrray2.push({
            "lngWgs": res2.x,
            "latWgs": res2.y,
            // "sort": index2
          })
        })
        array.push(arrray2)
      })
      return array;
    },
    init() {
      this.$nextTick(() => {
        let { center, zoom, pitch, minZoom, maxZoom, symbol, layerSwitcherControl, id } = this;
        this.map = new maptalks.Map(id, {
          center,
          zoom,
          pitch,
          minZoom,
          maxZoom,
          centerCross: true,
          seamlessZoom: true,
          attribution: true,
          zoomControl: true, // add zoom control
          scaleControl: true, // add scale control
          layerSwitcherControl,
          symbol,
          // baseLayer 表示基础图层,它可以添加多个,逗号隔开
          baseLayer: new maptalks.GroupTileLayer("Base TileLayer", [
            new maptalks.TileLayer("卫星图", {
              urlTemplate:
                "https://t5.tianditu.gov.cn/DataServer?T=img_w&X={x}&Y={y}&L={z}&tk=074d4a21c8f34a3a20cd1f69f81b26bf",
              subdomains: ["a", "b", "c", "d"],
            }),
            new maptalks.TileLayer("Carto light", {
              visible: false,
              urlTemplate:
                "https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
              subdomains: ["a", "b", "c", "d"],
            }),
            new maptalks.TileLayer("Carto dark", {
              visible: false,
              urlTemplate:
                "https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",
              subdomains: ["a", "b", "c", "d"],
            }),
            new maptalks.WMSTileLayer("survey", {
              urlTemplate: "http://10.169.61.30:8080/geoserver/gwc/service/wms",
              crs: "EPSG:3857",
              layers: "haigang",
              styles: "",
              version: "1.1.1",
              tileStackDepth: 0,
              format: "image/png",
              transparent: true,
              uppercase: true,
              zIndex: 1,
              forceRenderOnMoving: true,
              forceRenderOnZooming: true,
            }),
          ]),
        });
        // this.layer = new maptalks.VectorLayer("vector").addTo(this.map)
        this.layer = new maptalks.VectorLayer("vector").addTo(this.map)
        this.layer2 = new maptalks.VectorLayer("vector2").addTo(this.map)
        // this.map.on("click", function (params) {
        //   console.log(666, params);
        // });
        this.map.on("editrecord", function (params) {
          console.log(params);
        });
      });
    },
    // 绘制图形
    drawMapType(val) {
      !this.layer ? this.layer = new maptalks.VectorLayer("vector").addTo(this.map) : null
      // console.log('绘制图形', val, this.map);
      let { drawMapType, drawMapArray } = val;
      if (!drawMapArray) {
        let { map, symbol, color } = this;
        let that = this;
        // var layer = new maptalks.VectorLayer("vector").addTo(map);
        var drawTool = new maptalks.DrawTool({
          mode: drawMapType,
          // once: true,
          // once: false,
          symbol: drawMapType == "Point" ? null : symbol,
        })
          .addTo(map)
          .disable();
        drawTool.on("drawend", function (param) {
          // console.log(param.geometry);
          let { _coordinates } = param.geometry;
          let array = null;
          if (drawMapType == "Point") {
            array = [_coordinates.x, _coordinates.y];
          } else if (drawMapType == "Polygon") {
            array = _coordinates.map((item) => {
              return [item.x, item.y];
            });
          }
          that.dataLis.push(array)
          // console.log(123, array);
          that.layer.addGeometry(param.geometry);
          that.startEdit(array, val, that.dataLis.length - 1);
          that.layer.remove();
          that.layer.setZIndex(6);
          that.$nextTick(() => {
            // console.log("绘制好了 发送", that.getSent(that.layer2._geoList));
            that.$emit("drawPointChange", that.getSent(that.layer2._geoList));
          })
        });
        this.drawTool = drawTool;
        drawTool.setMode(drawMapType).enable();
        // 改变覆盖物设置
        if (color) this.changeSymbol("drawTool", drawTool, color);
        // if (color) {
        //   drawTool.setSymbol({
        //     polygonFill: color, // 图形覆盖颜色
        //     polygonOpacity: 0.3, // 图形覆盖区域透明度
        //     lineColor: color, // 线条颜色
        //     lineWidth: 2 // 线条宽度
        //   });
        // }
      }
    },

    // 编辑绘制图形
    startEdit(array, val) {
      // let nun = Math.random();
      // console.log("编辑绘制图形", array, val);
      let that = this;
      let { drawMapType, editable, draggable } = val;
      let { symbol, map, pointSymbol, color } = that;
      let type = null;
      let pointArray = _.clone(array);
      // that.$emit("drawPointChange", pointArray);
      let objArray = [
        [() => drawMapType == "Polygon", () => {
          type = "Polygon"
        },
        () => {
          polygon.startEdit();
          // 更改形状
          polygon.on("shapechange", function (param) {
            let { _coordinates } = param.target;
            pointArray = _coordinates.map((item) => {
              // console.log("111111111111111111", that.getSent(that.layer2._geoList));
              return [item.x, item.y];
            });
            that.$emit("drawPointChange", that.getSent(that.layer2._geoList));
          });
          // 更改位置
          polygon.on("positionchange", function (param) {
            let { _coordinates } = param.target;
            pointArray = _coordinates.map((item) => {
              return [item.x, item.y];
            });
            that.$emit("drawPointChange", that.getSent(that.layer2._geoList));
          });
          // 监听删除
          polygon.on("remove", function (param) {
            let { _coordinates } = param.target;
            pointArray = _coordinates.map((item) => {
              return [item.x, item.y];
            });
            that.$emit("drawPointChange", that.getSent(that.layer2._geoList));
          });
          // 监听右键点击事件
          // polygon.on("contextmenu", function (e) {
          //   console.log(112233, e);
          //   // 判断点击的是否为多边形
          //   if (e.target instanceof maptalks.Polygon) {
          //     // 删除多边形
          //     map.removeGeometry(e.target);
          //   }
          // });
        },
        ],
      ];
      let state = objArray.find((m) => m[0]());
      if (state) state[1]();
      let polygon = new maptalks[type](array, {
        visible: true,
        editable,
        cursor: "pointer",
        draggable,
        dragShadow: false,
        drawOnAxis: null,
        symbol,
      });

      var options = {
        'items': [
          {
            item: '删除', click: function (e) {
              that.layer2.removeGeometry(polygon);

            }
          }
        ]
      };
      polygon.setMenu(options).openMenu();
      // new maptalks.VectorLayer("vectorEdit" + nun, polygon).addTo(map);

      that.layer2.addGeometry(polygon);
      // that.layer.addGeometry(polygon);
      map.fitExtent(polygon.getExtent(), -1); // 自动适配区域 
      if (color) this.changeSymbol("polygon", polygon, color);
      if (state) state[2]();
      that.polygon = polygon;
    },

    // 覆盖物设置更改
    changeSymbol(type, mapObj, color) {
      let obj = {
        drawTool: () => {
          mapObj.setSymbol({
            polygonFill: color, // 图形覆盖颜色
            polygonOpacity: 0.3, // 图形覆盖区域透明度
            lineColor: color, // 线条颜色
            lineWidth: 2, // 线条宽度
          });
        },
        polygon: () => {
          mapObj.updateSymbol({
            polygonFill: color, // 图形覆盖颜色
            lineColor: color, // 线条颜色
          });
        },
      };
      if (obj[type]) return obj[type]();
    },
    // 绘制多边形
    // addPoint(val) {
    //   // console.log(this.map,66);
    //   let layer = new maptalks.VectorLayer("vector").addTo(this.map);
    //   // console.log(layer,"tu");
    //   val.forEach((item) => {
    //     let polygon = new maptalks.Polygon(item, {
    //       visible: true,
    //       editable: false,
    //       cursor: "pointer",
    //       draggable: false,
    //       dragShadow: false,
    //       drawOnAxis: null,
    //       // properties: {
    //       //   name,
    //       // },
    //       symbol: [
    //         {
    //           lineColor: "skyblue",
    //           lineWidth: 1,
    //           polygonFill: "skyblue",
    //           polygonOpacity: 0.1,
    //         },
    //       ],
    //     }).addTo(layer);
    //     //  polygon.setZIndex(0)
    //     layer.setZIndex(1);
    //   });
    // },

    // 绘制2dmark
    // addMark(val) {
    //   console.log(val, 6677);
    //   this.layer = new maptalks.VectorLayer("vector2").addTo(this.map);
    //   val.forEach((item) => {
    //     let sort = item.sort;
    //     let file = require("@/assets/warehouseWeb/equipment/001.png");

    //     let marker = new maptalks.Marker(item.list, {
    //       properties: {
    //         sort,
    //       },
    //       symbol: [
    //         {
    //           markerType: "path",
    //           markerFile: file,
    //           markerWidth: {
    //             stops: [
    //               [7, 15],
    //               [18, 25],
    //             ],
    //           },
    //           markerHeight: {
    //             stops: [
    //               [7, 15],
    //               [18, 25],
    //             ],
    //           },
    //           markerDx: 0,
    //           markerDy: 20,
    //           markerOpacity: 1,
    //         },
    //         {
    //           textFaceName: "sans-serif",
    //           textName: "{sort}",
    //           textSize: 12,
    //           textDy: 30,
    //           textFill: "#7ee6ed",
    //         },
    //       ],
    //     });
    //     this.layer.addGeometry(marker);
    //   });
    // },
    // 绘制3dmark
    // addMark3d(val) {
    //   console.log(val, 6677);
    //   this.layer2 = new maptalks.VectorLayer("vector3").addTo(this.map);
    //   val.forEach((item) => {
    //     let sort = item.sort;
    //     let file = require("@/assets/warehouseWeb/equipment/001.png");

    //     let marker = new maptalks.Marker(item.list, {
    //       properties: {
    //         sort,
    //       },
    //       symbol: [
    //         {
    //           markerType: "path",
    //           markerFile: file,
    //           markerWidth: {
    //             stops: [
    //               [7, 15],
    //               [18, 25],
    //             ],
    //           },
    //           markerHeight: {
    //             stops: [
    //               [7, 15],
    //               [18, 25],
    //             ],
    //           },
    //           markerDx: 0,
    //           markerDy: 20,
    //           markerOpacity: 1,
    //         },
    //         {
    //           textFaceName: "sans-serif",
    //           textName: "{sort}",
    //           textSize: 12,
    //           textDy: 30,
    //           textFill: "#7ee6ed",
    //         },
    //       ],
    //     });
    //     this.layer2.addGeometry(marker);
    //   });
    // },
  },
};
</script>
<style scoped>
.container {
  width: calc(100% - 50px);
  /* width: 550px; */
  min-height: 550px;
  margin: 15px;
}
</style>

 

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

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

相关文章

RDMA vs InfiniBand 网卡接口如何区分?

(该架构图来源于参考文献) 高性能计算网络&#xff0c;RoCE vs. InfiniBand该怎么选&#xff1f; 新 RoCEv2 标准可实现 RDMA 路由在第三层以太网网络中的传输。RoCEv2 规范将用以太网链路层上的 IP 报头和 UDP 报头替代 InfiniBand 网络层。这样&#xff0c;就可以在基于 IP…

虹科分享丨AR与AI融合加速,医疗护理更便捷!

来源&#xff1a;虹科数字化与AR 虹科分享丨AR与AI融合加速&#xff0c;医疗护理更便捷&#xff01; 原文链接&#xff1a;https://mp.weixin.qq.com/s/Fi0wNfk_TDXRo_1-6cSRNQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #AR眼镜 #医疗护理 根据Reports and Da…

【动态规划】【map】【C++算法】1289. 下降路径最小和 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 map LeetCode1289. 下降路径最小和 II 给你一个 n x n 整数矩阵 grid &#xff0c;请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为&#xff1a;从 grid 数组中的每一行选择一个数字&#xff0c;…

云计算项目五:部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务

部署数据库服务mysql |部署共享存储服务NFS | 配置网站服务 案例1:配置逻辑卷步骤一:创建LV步骤二:格式化案例2:配置数据库服务器步骤一:安装软件MySQL服务软件(2台数据库服务器都要安装)步骤二:挂载lv设备步骤三:启动服务步骤四:管理员登录案例3:配置主从同步步骤一…

【自然语言处理】【深度学习】文本向量化、one-hot、word embedding编码

因为文本不能够直接被模型计算&#xff0c;所以需要将其转化为向量 把文本转化为向量有两种方式&#xff1a; 转化为one-hot编码转化为word embedding 一、one-hot 编码 在one-hot编码中&#xff0c;每一个token使用一个长度为N的向量表示&#xff0c;N表示词典的数量。 即&…

谷歌地球引擎Google Earth Engine针对不同地表类型分别自动生成随机采样点的方法

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;按照给定的地表分类数据&#xff0c;对每一种不同的地物类型&#xff0c;分别加以全球范围内随机抽样点自动批量选取的方法。 本文是谷歌地球引擎&#xff08;Google Earth En…

05.Elasticsearch应用(五)

Elasticsearch应用&#xff08;五&#xff09; 1.目标 咱们这一章主要学习Mapping&#xff08;映射&#xff09; 2.介绍 Mapping是对索引库中文档的约束&#xff0c;类似于数据表结构&#xff0c;作用如下&#xff1a; 定义索引中的字段的名称定义字段的数据类型&#xff…

0124-2-算法题解析与总结(四)

5.5 如何去除有序数组的重复元素 本文对应的力扣题目&#xff1a; 26.删除排序数组中的重复项 83.删除排序链表中的重复元素 26.删除排序数组中的重复项&#xff1a; int removeDuplicates(int[] nums) {int n nums.length;if (n 0) return 0;int slow 0, fast 1;while…

Spring基于AbstractRoutingDataSource实现MySQL多数据源

目录 多数据源实现 yml配置文件 配置类 业务代码 案例演示 多数据源实现 yml配置文件 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedatasource1:url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezoneUTC&useUnicodetrue&characte…

第二百八十六回

文章目录 概念介绍实现方法示例代码 我们在上一章回中介绍了如何拦截路由相关的内容&#xff0c;本章回中将介绍页面转场动画.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在上一章回中介绍了路由拦截相关的内容&#xff0c;本章回中将使用路由拦截实现转场…

《动手学深度学习(PyTorch版)》笔记3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;本书源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode测试通过。 Chapter3 Linear …

长城资产信息技术岗24届校招面试面经

本文介绍2024届秋招中&#xff0c;中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等。 10月投递了中国长城资产管理股份有限公司的信息技术岗岗位&#xff0c;所在部门为长城新盛信托有限责任公司。目前完成了一面&#xff0c;在这里记录一下一面经…

Puppeteer结合Jest对网页进行测试

之前我们使用Puppeteer进行网页爬虫&#xff08;以及自动化操作&#xff09;&#xff0c;这篇文章主要验证一下Puppeteer测试的可实现性。 项目设置 让我们从设置一个基本的React应用程序开始。 我们将安装其他依赖项,如Puppeteer和Faker。 为了这篇文章的目的,我创建了一个…

ASP.NET Core WebAPI从HTTPS调整为HTTP启动

使用VS2022创建WebAPI项目时&#xff0c;默认勾选“配置HTTPS(H)”&#xff0c;这样启动WebAPI时以https方式启动。   如果要从HTTPS调整为HTTP启动&#xff0c;需要修改项目中以下几处&#xff0c;首先是Program.cs中删除app.UseHttpsRedirection()语句&#xff0c;删除后…

gitlab runner 安装、注册、配置、使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

GitLab升级版本(任意用户密码重置漏洞CVE-2023-7028)

目录 前言漏洞分析影响范围查看自己的GitLab版本升级路程 升级过程13.1.1113.8.8 - 14.0.1214.3.614.9.5 - 16.1.6 前言 最近GitLab发了个紧急漏洞需要修复&#xff0c;ok接到命令立刻着手开始修复&#xff0c;在修复之前先大概了解一下这个漏洞是什么东西 漏洞分析 1、组件…

免费的 UI 设计资源网站 Top 8

今日与大家分享8个优秀的免费 UI 设计资源网站。这些网站的资源包括免费设计材料站、设计工具、字体和其他网站&#xff0c;尤其是一些材料站。它们是免费下载的&#xff0c;材料的风格目前很流行&#xff0c;适合不同的项目。非常适合平面设计WEB/UI设计师收藏&#xff0c;接下…

.git 文件夹结构解析

.git 文件夹结构解析 在这篇文章就让我们来看看这个 Git 仓库里的文件分别都是用来干什么的&#xff0c;以及在执行了相关的 Git 命令后这些文件会如何响应。 hooks&#xff08;钩&#xff09;&#xff1a;存放一些shell脚本info&#xff1a;存放仓库的一些信息logs&#xff…

1分钟部署幻兽帕鲁联机服务,PalWorld服务器搭建教程(阿里云)

1分钟部署幻兽帕鲁联机服务&#xff0c;PalWorld服务器搭建教程 最近这游戏挺火&#xff0c;很多人想跟朋友联机&#xff0c;如果有专用服务器&#xff0c;就不需要房主一直开着电脑&#xff0c;稳定性也好得多。 概述 幻兽帕鲁是Pocketpair开发的一款开放世界生存制作游戏&…

Linux系统Shell脚本编程之条件语句

一、条件测试 Shell 环境根据命令执行后的返回状态值 " $? " 来判断是否执行成功&#xff0c;当返回值为0时表示成功&#xff0c;否则表示失败或异常&#xff08;非0值&#xff09;。使用专门的测试工具 test 命令&#xff0c;可以对特定条件进行测试&#xff0c;并…