2d俯视视角游戏,可以切换多种枪械

news2024/11/16 12:36:04

文章目录

  • 一、 介绍
  • 二、 人物移动、鼠标控制转向
  • 三、子弹脚本
  • 四、子弹随机抛壳
  • 五、 爆炸特效
  • 六、 发射子弹
  • 七、 子弹、弹壳对象池
  • 八、 散弹枪
  • 九、 火箭弹、发射火箭
  • 十、 下载工程文件


一、 介绍

2d俯视视角游戏。
人物视角跟随鼠标移动
多种枪械
抛壳效果
多种设计效果
对象池

在这里插入图片描述


二、 人物移动、鼠标控制转向

获取玩家的输入向量,设置刚体的速度,实现玩家的移动
获取鼠标位置,根据位置设置玩家的朝向
检查是否按下了 Q 或 E 键,根据按下的键切换到新的选中的枪支

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace BulletHell 
{
    public class PlayerMovement : MonoBehaviour 
    {
        public GameObject[] guns; // 存放玩家枪支的 GameObject 数组
        public float speed; // 玩家的速度
        private Vector2 input; // 存放玩家输入的 Vector2 变量
        private Vector2 mousePos; // 存放鼠标位置的 Vector2 变量
        private Animator animator; // 存放动画组件的变量
        private Rigidbody2D rigidbody; // 存放刚体组件的变量
        private int gunNum; // 存放当前选中的枪支在数组中的索引

        void Start()
        {
            animator = GetComponent<Animator>(); // 获取动画组件
            rigidbody = GetComponent<Rigidbody2D>(); // 获取刚体组件
            guns[0].SetActive(true); // 激活第一个枪支
        }

        void Update()
        {
            SwitchGun(); // 检查是否切换枪支的输入
            input.x = Input.GetAxisRaw("Horizontal"); // 获取水平输入轴的值
            input.y = Input.GetAxisRaw("Vertical"); // 获取竖直输入轴的值

            rigidbody.velocity = input.normalized * speed; // 设置刚体的速度为标准化的输入向量与速度的乘积

            mousePos = Input.mousePosition; // 获取鼠标位置
            if (mousePos.x > transform.position.x) // 如果鼠标在玩家右侧
            {
                transform.rotation = Quaternion.Euler(new Vector3(0, 0, 0)); // 玩家朝向右侧
            }
            else // 如果鼠标在玩家左侧
            {
                transform.rotation = Quaternion.Euler(new Vector3(0, 180, 0)); // 玩家朝向左侧
            }

            if (input != Vector2.zero) // 如果输入向量不为零(即玩家正在移动)
                animator.SetBool("isMoving", true); // 将动画组件中的 "isMoving" 参数设为 true
            else // 如果输入向量为零(即玩家未移动)
                animator.SetBool("isMoving", false); // 将动画组件中的 "isMoving" 参数设为 false
        }

        void SwitchGun()
        {
            if (Input.GetKeyDown(KeyCode.Q)) // 如果按下了 Q 键
            {
                guns[gunNum].SetActive(false); // 关闭当前选中的枪支
                if (--gunNum < 0) // 索引减一,如果小于零
                {
                    gunNum = guns.Length - 1; // 将索引设为数组中最后一个元素的索引
                }
                guns[gunNum].SetActive(true); // 激活新的选中的枪支
            }
            if (Input.GetKeyDown(KeyCode.E)) // 如果按下了 E 键
            {
                guns[gunNum].SetActive(false); // 关闭当前选中的枪支
                if (++gunNum > guns.Length - 1) // 索引加一,如果大于数组中最后一个元素的索引
                {
                    gunNum = 0; // 将索引设为数组中第一个元素的索引
                }
                guns[gunNum].SetActive(true); // 激活新的选中的枪支
            }
        }
    }
}

三、子弹脚本

这段代码实现了游戏中子弹的飞行、碰撞和销毁功能。
代码使用了 Unity 引擎提供的 MonoBehaviou 类和内置组件,如 Rigidbody2D 和 Collider2D 等。
代码中使用了对象池技术,实现了对子弹对象的回收和重复使用,提高了游戏的性能。
代码的逻辑清晰,注释详细,易于理解和维护。
代码提供了设置子弹速度的公共方法,可以方便地进行修改和调整。
子弹对象在碰撞到其他物体时,可以选择实例化爆炸效果或从对象池中获取爆炸效果对象,并将其位置设置为子弹的位置。
可以选择销毁子弹对象或将其回收到对象池中,以便重复使

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet : MonoBehaviour // 继承自 MonoBehaviour 的类
{
    public float speed; // 子弹的速度
    public GameObject explosionPrefab; // 爆炸效果的预制体
    new private Rigidbody2D rigidbody; // 存放刚体组件的变量

    void Awake()
    {
        rigidbody = GetComponent<Rigidbody2D>(); // 获取刚体组件
    }

    public void SetSpeed(Vector2 direction) // 设置子弹速度的方法
    {
        rigidbody.velocity = direction * speed; // 根据方向和速度设置刚体的速度
    }

    void Update()
    {

    }

    private void OnTriggerEnter2D(Collider2D other) // 当子弹碰撞到其他物体时执行
    {
        // Instantiate(explosionPrefab, transform.position, Quaternion.identity); // 实例化爆炸效果

        // 从对象池中获取爆炸效果对象
        GameObject exp = ObjectPool.Instance.GetObject(explosionPrefab);
        exp.transform.position = transform.position; // 将爆炸效果的位置设置为子弹的位置

        // Destroy(gameObject); // 销毁子弹对象
        ObjectPool.Instance.PushObject(gameObject); // 将子弹对象回收到对象池中
    }
}

四、子弹随机抛壳

这段代码实现了游戏中子弹的飞行和消失功能,具体包括:

在 OnEnable() 函数中设置子弹的初始速度、透明度和重力系数,并开始协程等待子弹消失
在 Stop() 协程中等待子弹停止一段时间后,将子弹的速度和重力系数设为零,然后不断将子弹的透明度降低,直到消失为止
最后,可以选择销毁子弹对象或将其回收到对象池中,以便重复使用。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletShell : MonoBehaviour
{
    public float speed;
    public float stopTime = .5f;
    public float fadeSpeed = .01f;
    new private Rigidbody2D rigidbody;
    private SpriteRenderer sprite;

    void Awake()
    {
        rigidbody = GetComponent<Rigidbody2D>();
        sprite = GetComponent<SpriteRenderer>();


    }

    private void OnEnable()
    {
        float angel = Random.Range(-30f, 30f);
        rigidbody.velocity = Quaternion.AngleAxis(angel, Vector3.forward) * Vector3.up * speed;

        sprite.color = new Color(sprite.color.r, sprite.color.g, sprite.color.b, 1);
        rigidbody.gravityScale = 3;

        StartCoroutine(Stop());
    }

    IEnumerator Stop()
    {
        yield return new WaitForSeconds(stopTime);
        rigidbody.velocity = Vector2.zero;
        rigidbody.gravityScale = 0;

        while (sprite.color.a > 0)
        {
            sprite.color = new Color(sprite.color.r, sprite.color.g, sprite.color.g, sprite.color.a - fadeSpeed);
            yield return new WaitForFixedUpdate();
        }
        // Destroy(gameObject);
        ObjectPool.Instance.PushObject(gameObject);
    }
}


五、 爆炸特效

这段代码的作用是控制爆炸动画的播放和销毁,在 Update() 函数中:

获取动画组件
在 Awake() 函数中获取动画组件
获取当前动画状态信息
在 Update() 函数中获取当前动画状态信息
判断动画是否播放完毕
如果动画已经播放完毕,可以选择销毁爆炸对象或将其回收到对象池中,以便重复使用。这里可以通过调用 ObjectPool 类的 PushObject() 方法来将对象回收到对象池中。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Explosion : MonoBehaviour 
{
    private Animator animator; // 存放动画组件的变量
    private AnimatorStateInfo info; // 存放动画状态信息的变量

    void Awake()
    {
        animator = GetComponent<Animator>(); // 获取动画组件
    }

    void Update()
    {
        info = animator.GetCurrentAnimatorStateInfo(0); // 获取当前动画状态信息
        if (info.normalizedTime >= 1) // 如果动画已经播放完毕
        {
            // Destroy(gameObject); // 销毁爆炸对象
            ObjectPool.Instance.PushObject(gameObject); // 将爆炸对象回收到对象池中
        }
    }
}

六、 发射子弹

这段代码是一个游戏中的武器类,实现了武器的朝向、射击和弹壳脱落等功能。
代码使用了 Unity 引擎提供的 MonoBehaviou 类和内置组件,如 Animator 和 Transform 等。
代码中使用了对象池技术,实现了对子弹和弹壳对象的回收和重复使用,提高了游戏的性能。
代码的逻辑清晰,注释详细,易于理解和维护。
代码提供了可重写的虚函数,可以方便地扩展和修改功能。
武器在鼠标的位置朝向和翻转时,可以选择翻转武器的 Y 轴。
武器可以通过点击鼠标左键进行射击,通过设置时间间隔来控制射击频率。
射击时会播放射击动画,并从对象池中获取子弹和弹壳对象,并设置它们的位置和速度。
子弹的速度可以根据武器的朝向和一个随机的角度进行调整。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Gun : MonoBehaviour // 继承自 MonoBehaviour 的类
{
    public float interval; // 射击间隔时间
    public GameObject bulletPrefab; // 子弹预制体
    public GameObject shellPrefab; // 弹壳预制体
    protected Transform muzzlePos; // 发射口位置
    protected Transform shellPos; // 弹壳位置
    protected Vector2 mousePos; // 鼠标位置
    protected Vector2 direction; // 发射方向
    protected float timer; // 计时器
    protected float flipY; // Y 轴翻转参数
    protected Animator animator; // 动画组件

    protected virtual void Start() // 在 Start() 函数中初始化一些变量和组件
    {
        animator = GetComponent<Animator>(); // 获取动画组件
        muzzlePos = transform.Find("Muzzle"); // 获取发射口位置
        shellPos = transform.Find("BulletShell"); // 获取弹壳位置
        flipY = transform.localScale.y; // 获取 Y 轴翻转参数
    }

    protected virtual void Update() // 在 Update() 函数中进行鼠标位置朝向、射击和弹壳脱落等操作
    {
        mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 将鼠标位置从屏幕坐标系转换为世界坐标系

        if (mousePos.x < transform.position.x) // 如果鼠标在武器左侧
            transform.localScale = new Vector3(flipY, -flipY, 1); // 翻转武器的 Y 轴
        else
            transform.localScale = new Vector3(flipY, flipY, 1); // 不翻转武器的 Y 轴

        Shoot(); // 进行射击操作
    }

    protected virtual void Shoot() // 进行射击操作
    {
        direction = (mousePos - new Vector2(transform.position.x, transform.position.y)).normalized; // 计算射击方向
        transform.right = direction; // 设置武器的朝向

        if (timer != 0) // 如果计时器不为零
        {
            timer -= Time.deltaTime; // 减少计时器时间
            if (timer <= 0)
                timer = 0; // 如果计时器小于等于零,将计时器归零
        }

        if (Input.GetButton("Fire1")) // 如果按下了鼠标左键
        {
            if (timer == 0) // 如果计时器为零
            {
                timer = interval; // 重置计时器
                Fire(); // 进行射击
            }
        }
    }

    protected virtual void Fire() // 进行射击
    {
        animator.SetTrigger("Shoot"); // 播放射击动画

        // GameObject bullet = Instantiate(bulletPrefab, muzzlePos.position, Quaternion.identity); // 在发射口位置实例化子弹
        GameObject bullet = ObjectPool.Instance.GetObject(bulletPrefab); // 从对象池中获取子弹对象
        bullet.transform.position = muzzlePos.position; // 设置子弹位置

        float angel = Random.Range(-5f, 5f); // 随机一个角度
        bullet.GetComponent<Bullet>().SetSpeed(Quaternion.AngleAxis(angel, Vector3.forward) * direction); // 根据角度和方向设置子弹速度

        // Instantiate(shellPrefab, shellPos.position, shellPos.rotation); // 在弹壳位置实例化弹壳
        GameObject shell = ObjectPool.Instance.GetObject(shellPrefab); // 从对象池中获取弹壳对象
        shell.transform.position = shellPos.position; // 设置弹壳位置
        shell.transform.rotation = shellPos.rotation; // 设置弹壳旋转角度
    }
}

七、 子弹、弹壳对象池

使用一个字典来存储预制体,字典的键为预制体的名称,值为一个对象队列。

提供 GetObject() 函数用于从对象池中获取一个预制体,实现如下:

如果对象池中没有该预制体或者预制体的数量为0,则实例化一个新的预制体并加入对象池。

如果对象池为空,则创建一个新的空物体作为对象池的父物体。

查找该预制体的子对象池,如果不存在,则创建一个空物体作为该预制体的子对象池。

从对象池中取出一个对象,并激活该对象。

提供 PushObject() 函数用于将一个预制体放回对象池中,实现如下:
将对象放回对象池,并将对象设置为不激活状态。

注意,为了能够正确地将预制体放回对象池中,预制体的名称不能包含 (Clone),因此在 PushObject() 函数中会将名称中的 (Clone) 替换为空字符串。

提供一个静态的 Instance 属性,用于获取对象池的单例实例。如果该实例为 null,则会创建一个新的对象池实例。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPool
{
    private static ObjectPool instance;
    private Dictionary<string, Queue<GameObject>> objectPool = new Dictionary<string, Queue<GameObject>>();
    private GameObject pool;
    public static ObjectPool Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new ObjectPool();
            }
            return instance;
        }
    }

    // 从对象池中获取一个对象
    public GameObject GetObject(GameObject prefab)
    {
        GameObject _object;
        // 如果对象池中没有该预制体或者预制体的数量为0,则实例化一个新的预制体并加入对象池
        if (!objectPool.ContainsKey(prefab.name) || objectPool[prefab.name].Count == 0)
        {
            _object = GameObject.Instantiate(prefab);
            PushObject(_object);
            // 如果对象池为空,则创建一个新的空物体作为对象池的父物体
            if (pool == null)
                pool = new GameObject("ObjectPool");
            // 查找该预制体的子对象池,如果不存在,则创建一个空物体作为该预制体的子对象池
            GameObject childPool = GameObject.Find(prefab.name + "Pool");
            if (!childPool)
            {
                childPool = new GameObject(prefab.name + "Pool");
                childPool.transform.SetParent(pool.transform);
            }
            _object.transform.SetParent(childPool.transform);
        }
        // 从对象池中取出一个对象,并激活该对象
        _object = objectPool[prefab.name].Dequeue();
        _object.SetActive(true);
        return _object;
    }

    // 将对象放回对象池
    public void PushObject(GameObject prefab)
    {
        string _name = prefab.name.Replace("(Clone)", string.Empty);
        // 如果对象池中没有该预制体,则新建一个队列用于存储该预制体
        if (!objectPool.ContainsKey(_name))
            objectPool.Add(_name, new Queue<GameObject>());
        // 将对象放回对象池,并将对象设置为不激活状态
        objectPool[_name].Enqueue(prefab);
        prefab.SetActive(false);
    }
}

在这里插入图片描述

八、 散弹枪

根据子弹数量和夹角计算出每颗子弹的旋转方向。
播放开枪动画。
从对象池中取出子弹并设置位置和旋转。
从对象池中取出弹壳并设置位置和旋转。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shotgun : Gun
{
    public int bulletNum = 3; // 发射的子弹数量
    public float bulletAngle = 15; // 每颗子弹之间的夹角

    // 重写基类的 Fire() 函数
    protected override void Fire()
    {
        // 播放开枪动画
        animator.SetTrigger("Shoot");

        int median = bulletNum / 2; // 子弹数量的中位数(整数除法向下取整)
        for (int i = 0; i < bulletNum; i++)
        {
            GameObject bullet = ObjectPool.Instance.GetObject(bulletPrefab); // 从对象池中获取子弹
            bullet.transform.position = muzzlePos.position; // 将子弹位置设置为枪口的位置

            if (bulletNum % 2 == 1) // 如果子弹数量是奇数
            {
                // 计算当前子弹的旋转方向,使用 Quaternion.AngleAxis() 函数
                bullet.GetComponent<Bullet>().SetSpeed(Quaternion.AngleAxis(bulletAngle * (i - median), Vector3.forward) * direction);
            }
            else // 如果子弹数量是偶数
            {
                // 计算当前子弹的旋转方向,使用 Quaternion.AngleAxis() 函数
                bullet.GetComponent<Bullet>().SetSpeed(Quaternion.AngleAxis(bulletAngle * (i - median) + bulletAngle / 2, Vector3.forward) * direction);
            }
        }

        // 从对象池中获取弹壳并设置位置和旋转
        GameObject shell = ObjectPool.Instance.GetObject(shellPrefab);
        shell.transform.position = shellPos.position;
        shell.transform.rotation = shellPos.rotation;
    }
}

在这里插入图片描述

九、 火箭弹、发射火箭

在这里插入图片描述

火箭弹抛物线炸目标点

定义了 Rocket 类,用来控制火箭弹的行为。

定义了 lerp 和 speed 两个公共字段,分别表示插值系数和子弹的速度,以及 explosionPrefab 表示爆炸特效的预制体。

在 Awake() 函数中,获取子弹的刚体组件。

在 SetTarget() 函数中,设置子弹的目标点,并将到达标记重置为 false。

在 FixedUpdate() 函数中,计算子弹的移动方向,根据到达标记判断是否需要插值旋转角度和设置移动速度。如果到达目标点,就将到达标记设置为 true。

在 OnTriggerEnter2D() 函数中,从对象池中获取爆炸特效,设置特效的位置,将子弹的移动速度设置为零,然后使用协程在一定时间后将子弹推回对象池。

这段代码的作用是控制火箭弹的行为。其中,使用插值旋转角度和设置移动速度实现子弹朝着目标点飞行的效果,使用到达标记判断子弹是否到达目标点,使用对象池管理子弹和爆炸特效的创建和销毁,可以有效地减少内存的开销和对象的创建次数,同时使用协程在一定时间后将子弹推回对象池,可以让游戏的操作更加流畅和自然。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rocket : MonoBehaviour
{
    public float lerp;                      // 插值系数
    public float speed = 15;                // 子弹速度
    public GameObject explosionPrefab;      // 爆炸特效预制体
    new private Rigidbody2D rigidbody;     // 刚体组件
    private Vector3 targetPos;              // 目标点
    private Vector3 direction;              // 移动方向
    private bool arrived;                   // 是否到达目标点

    private void Awake()
    {
        rigidbody = GetComponent<Rigidbody2D>(); // 获取刚体组件
    }

    public void SetTarget(Vector2 _target)
    {
        arrived = false;                   // 重置到达标记
        targetPos = _target;               // 设置目标点
    }

    private void FixedUpdate()
    {
        direction = (targetPos - transform.position).normalized; // 计算移动方向

        if (!arrived) // 如果没有到达目标点
        {
            transform.right = Vector3.Slerp(transform.right, direction, lerp / Vector2.Distance(transform.position, targetPos)); // 插值旋转角度
            rigidbody.velocity = transform.right * speed; // 设置移动速度
        }
        if (Vector2.Distance(transform.position, targetPos) < 1f && !arrived) // 如果到达目标点
        {
            arrived = true; // 设置到达标记
        }
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        GameObject exp = ObjectPool.Instance.GetObject(explosionPrefab); // 从对象池中获取爆炸特效
        exp.transform.position = transform.position; // 设置特效位置

        rigidbody.velocity = Vector2.zero; // 停止移动
        StartCoroutine(Push(gameObject, .3f)); // 在一定时间后将子弹推回对象池
    }

    IEnumerator Push(GameObject _object, float time)
    {
        yield return new WaitForSeconds(time); // 等待一段时间
        ObjectPool.Instance.PushObject(_object); // 将子弹推回对象池
    }
}
发射火箭弹
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RocketLauncher : Gun
{
    public int rocketNum = 3;             // 每次发射的子弹数量
    public float rocketAngle = 15;       // 子弹之间的夹角

    protected override void Fire()
    {
        animator.SetTrigger("Shoot");   // 播放射击动画
        StartCoroutine(DelayFire(.2f)); // 延迟一定时间后发射子弹
    }

    IEnumerator DelayFire(float delay)
    {
        yield return new WaitForSeconds(delay); // 等待一定时间

        int median = rocketNum / 2; // 计算中位数
        for (int i = 0; i < rocketNum; i++) // 循环生成子弹
        {
            GameObject bullet = ObjectPool.Instance.GetObject(bulletPrefab); // 从对象池中获取子弹
            bullet.transform.position = muzzlePos.position; // 设置子弹的初始位置

            if (rocketNum % 2 == 1) // 如果子弹数量是奇数
            {
                bullet.transform.right = Quaternion.AngleAxis(rocketAngle * (i - median), Vector3.forward) * direction; // 计算子弹的旋转方向
            }
            else // 如果子弹数量是偶数
            {
                bullet.transform.right = Quaternion.AngleAxis(rocketAngle * (i - median) + rocketAngle / 2, Vector3.forward) * direction; // 计算子弹的旋转方向
            }
            bullet.GetComponent<Rocket>().SetTarget(mousePos); // 设置子弹的目标点
        }
    }
}

定义了 RocketLauncher 类,用来控制火箭发射器的行为。

定义了 rocketNum 和 rocketAngle 两个公共字段,分别表示每次发射的子弹数量和子弹之间的夹角。

在 Fire() 函数中,播放射击动画并调用 DelayFire() 函数延迟一定时间后发射子弹。

在 DelayFire() 函数中,首先计算子弹数量的中位数,然后使用循环来生成子弹。在生成每个子弹时,从对象池中获取子弹,并设置子弹的初始位置和旋转方向。如果子弹数量是奇数,就使用 (i - median) * rocketAngle 计算子弹的旋转方向。如果子弹数量是偶数,就使用 (i - median) * rocketAngle + rocketAngle / 2 计算子弹的旋转方向。最后,调用 bullet.GetComponent().SetTarget(mousePos) 函数设置子弹的目标点,让子弹朝着鼠标指向的方向飞行。

这段代码的作用是控制火箭发射器的行为。其中,使用子弹数量和子弹之间的夹角来决定生成子弹的位置和旋转方向,使用对象池管理子弹的创建和销毁,可以有效地减少内存的开销和对象的创建次数,同时使用协程来实现延迟发射子弹的效果,可以让游戏的操作更加流畅和自然。


十、 下载工程文件

https://wwez.lanzoul.com/izVuU0tyzffe


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

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

相关文章

『python爬虫』10. 数据解析之xpath解析(保姆级图文)

目录 安装库xpath入门怎么快速得到xpath路径xpath节点的关系xpath方法小型实战总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 安装库 pip install lxmlxpath入门 怎么快速得到xpath路径 &#xff08;相对路…

第三十章 Unity角色控制器 Character Controller

在我们之前的章节中&#xff0c;我们已经了解了碰撞体和刚体。但是&#xff0c;对于刚体这个组件来讲&#xff0c;有两种使用方式。其一就是用它来模拟现实世界的移动或碰撞效果&#xff08;例如&#xff0c;门的开关&#xff09;&#xff1b;其二就是使用代码来控制物体移动或…

【网络进阶】HTTP服务器(一)

文章目录 1. HTTP简介2. HTTP工作原理3. HTTP注意事项4. HTTP消息结构5. 客户端请求消息6. 服务器响应消息7. GET传递数据实例8. HTTP请求方法9. HTTP响应头信息 1. HTTP简介 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于传…

Spring Cloud的五大组件你知道多少

前言 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。 Spring Clo…

瑞萨e2studio(25)----电容触摸配置(2)

瑞萨e2studio.24--电容触摸配置1 概述初始配置监控检测电容按键显示和测量标准差显示多个触摸按键曲线 概述 篇文档将在上篇文章基础上修改电容触摸配置。 初始配置 需要进入Debug模式才可以进行电容触摸配置。 监控检测电容按键 从电容触摸主界面&#xff08;QE&#xf…

解决Xshell安装时错误代码-1603的问题

安装流程 官网下载&#xff1a;家庭/学校免费 - NetSarang Website 填写姓名&#xff0c;邮箱&#xff0c;申请下载&#xff0c;就能在邮箱收到下载链接 点击链接即可自动开始下载&#xff1b; 下载完成后进行安装即可 问题描述 安装进行到最后一步时&#xff0c;出现下图…

CCED2000后,中文编程软件再次脱颖而出,系出金山

WPS抗衡微软&#xff0c;CCEDE却被淹没&#xff1f; DOS代&#xff0c;我们用WPS来进行文字编辑&#xff0c;CCED来做表格&#xff0c;两者在那个时代可以称得上是国产办公领域的“必装软件”。 如今&#xff0c;30年过去了&#xff0c;WPS一步一步成长为抗衡微软office的国产…

4d毫米波雷达聚类检测和追踪

待整理和写代码&#xff0c;准备先用dbcan聚类&#xff0c;用激光那一套做做看看效果 流程 4D雷达毫米波聚类跟踪流程如下图&#xff1a; 预处理主要包括标定、坐标转换和动静分离。 标定使用水平仪、角反&#xff0c;采集数据分析&#xff0c;得到水平和俯仰偏角。 坐标转…

nssctf web (3)

[HUBUCTF 2022 新生赛]checkin <?php show_source(__FILE__); #将当前文件的代码显示到页面 $username "this_is_secret"; #给username赋值 $password "this_is_not_known_to_you"; #给password赋值 include("flag.php");//here I ch…

MySQL数据管理

一、MySQL数据库管理 1、库和表 行&#xff08;记录&#xff09;&#xff1a;用来描述一个对象的信息 列&#xff08;字段&#xff09;&#xff1a;用来描述对象的一个属性 2、常用的数据类型 int &#xff1a;整型 float &#xff1a;单精度浮点 4字节32位 double &…

《网络安全审查办法》

1发展历程 2020年4月27日&#xff0c;12部门联合发布《网络安全审查办法》&#xff0c;2020年6月1日起实施。 2021年7月10日&#xff0c;国家互联网信息办公室发布关于《网络安全审查办法&#xff08;修订草案征求意见稿&#xff09;》公开征求意见的通知。11月16日国家互联网信…

【C++入门】你知道为什么C++有函数重载而C语言没有函数重载吗?

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

《最强Android书 架构大剖析》读书笔记

文章目录 第一章 Android 体系结构的变革之路1.2 Android系统源码目录与Linux的异同Android的框架原生二进制可执行文件Android 的原生库核心(core)库用以支持框架的库硬件抽象层Linux内核不带上层 UI界面的Android 第二章 Android 的分区和文件系统2.1 分区架构实验:从设备中获…

ffmpeg学习日记513-源码-configure_filtergraph()函数分析及功能

Date: 12/04/2023 Hours: Details:template_tags 文章目录 源码版本实现文件函数原型参数释义函数功能函数分析filtergraph_is_simple函数 总结参考 源码版本 ffmpeg-4.1.10 实现文件 fftools/ffmpeg_filter.c 函数原型 int configure_filtergraph(FilterGraph *fg)参数释…

重识三只松鼠:“二次创业”的新变革,“深蹲起跳”的新动能

“羚羊明白它必须跑得比狮子快&#xff0c;不然它会被狮子吃掉&#xff1b;每天早晨狮子醒来&#xff0c;狮子也明白它必须赛过跑得最慢的羚羊&#xff0c;不然它会活活饿死。不论你是狮子还是羚羊&#xff0c;都不重要……重要的是每天旭日东升&#xff0c;你就得开始奔跑&…

突破经典网格特征?AutoFocusFormer: Image Segmentation off the Grid 论文阅读笔记

突破经典网格特征&#xff1f;AutoFocusFormer: Image Segmentation off the Grid 论文阅读笔记 一、Abstract二、引言三、相关工作视觉 Transformer Backbones基于聚类的注意力自适应下采样点云网络 四、方法4.1 聚类和区域4.1.1 平衡聚类4.1.2 聚类的区域 写在前面 这一周赶上…

【五一创作】Visual Studio常用调试技巧的温习

当你在编写C程序时&#xff0c;难免会遇到代码出现错误的情况。这时候就需要用调试工具来定位问题并解决它。以下是一些在Visual Studio中使用调试器时常用的技巧&#xff0c;权当作温故总结罢~ 1. 断点 断点是调试中最为基本但也最常用的技巧之一。通过在需要定位的代码行上打…

一文搞懂 x64 IA-64 AMD64 Inte64 IA-32e 架构之间的关系

想要搞清楚 x64、IA64、AMD64 指令集之间的关系&#xff0c;就要先了解 Intel 和 AMD 这两家公司在生产处理器上的发展历史。 x86 处理器 1978年 Intel 生产了它的第一款 16bit 处理器8086&#xff0c;之后几款处理器名字也都以86结尾&#xff0c;包括80186&#xff0c;80286&a…

五一长假暴露了电动爹的真面目,而新能源汽车市场似乎也到了转折点

4月份国内市场汽车销量数据已经出炉&#xff0c;同比来说仍然保持了很高的增长&#xff0c;不过环比数据却显示出新能源汽车市场似乎已到了转折点&#xff0c;繁荣期似乎已经结束&#xff0c;淘汰赛开始了。 一、五一长假再次暴露了电动爹的真面目 新能源汽车长途旅行首先就是怕…

部署LVS-DR集群

引言 一、LVS-DR工作原理 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生产环境中最常用的一 种工作模式。 LVS-DR 模式&#xff0c;Director Server 作为群集的访问入口&#xff0c;不作为网关使用节点 Director Server 与 …