用QFramework来重构 祖玛游戏

news2024/11/28 8:37:41

资料

Unity - 祖玛游戏
GitHub

说明

用QF一个场景就够了,在UIRoot下切换预制体达到面板切换。
但测试中当然要有一个直接跳到测试面板的 测试脚本,保留测试Scene(不然初学者也不知道怎么恢复测试Scene),所以全文按Scene划分
在这里插入图片描述
在这里插入图片描述

----------------------------------------------------

01 Scene 开始进入(面板脚本,主要是 动(功能)静(UI引用)分离)

01 先创建一个UIRoot(QF里面有的)

在这里插入图片描述

02 做好UI,给需要引用的UI加 Bind脚本(默认设置看图)

在这里插入图片描述

03 拖出来做预制体,并且 CreateUICode,会生成两个脚本(自动生成位置是上一级目录的Scripts/UI),一个管UI引用(xxx.Designer),一个管功能(xxx),管功能的会自动加到预制体上

在这里插入图片描述

在这里插入图片描述

xxxPanelData 、xxxPanel(不叫Panel,叫xxxWindow,xxxUI随便)

using UnityEngine;
using UnityEngine.UI;
using QFramework;
using UnityEngine.SceneManagement;

namespace QFramework.Example
{
	public class StartGamePanelData : UIPanelData
	{
	}
	public partial class StartGamePanel : UIPanel
	{
		protected override void OnInit(IUIData uiData = null)
		{
			mData = uiData as StartGamePanelData ?? new StartGamePanelData();
			// please add init code here

			Screen.SetResolution(640, 1136, false);//宽,高,不可修改
			BtnStart.onClick.AddListener(() => {


				Debug.Log("StartGamePanel");
                SceneManager.LoadScene("01 SelectLevel");
            });
		}
		
		protected override void OnOpen(IUIData uiData = null)
		{
		}
		
		protected override void OnShow()
		{
		}
		
		protected override void OnHide()
		{
		}
		
		protected override void OnClose()
		{
		}
	}
}

xxxPanel.Designer

using System;
using UnityEngine;
using UnityEngine.UI;
using QFramework;

namespace QFramework.Example
{
	// Generate Id:29cfe4a1-ad1e-4350-a490-3bdf8cf34278
	public partial class StartGamePanel
	{
		public const string Name = "StartGamePanel";
		
		[SerializeField]
		public UnityEngine.UI.Button BtnStart;
		
		private StartGamePanelData mPrivateData = null;
		
		protected override void ClearUIComponents()
		{
			BtnStart = null;
			
			mData = null;
		}
		
		public StartGamePanelData Data
		{
			get
			{
				return mData;
			}
		}
		
		StartGamePanelData mData
		{
			get
			{
				return mPrivateData ?? (mPrivateData = new StartGamePanelData());
			}
			set
			{
				mUIData = value;
				mPrivateData = value;
			}
		}
	}
}

04 调用,RrsKit.Init();必须调用

/****************************************************
    文件:GameStart.cs
	作者:lenovo
    邮箱: 
    日期:2023/7/2 22:59:41
	功能:
*****************************************************/

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Random = UnityEngine.Random;


namespace QFramework.Example
{
    public class GameStart : MonoBehaviour
    {

        #region 生命

        /// <summary>首次载入</summary>
        void Awake()
        {
            ResKit.Init();
            UIKit.OpenPanel<StartGamePanel>();
            GameObject.DontDestroyOnLoad(gameObject);
        }
        

        #endregion 


    }

}




06 写包名,标记(ResKit才有它在打包的列表中),做AB包(QF有个相关示例中不打包运行不了;剪辑了,实际没那么快)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

06 效果

在这里插入图片描述

---------------------------------------------------------------

02 Scene 选择

世界选择

关卡选择

stars Plugins文件夹名

unity中,Plugins文件夹下,会被变成firstpass程序集

--------------------------------------------------------

03 Scene 游戏界面

modify 拆分Enum

对初学者有好点。但实际Unity的内置脚本,有枚举写在类内部的
在这里插入图片描述

GameUI拆成 Pass面板、Fail面板

Pass面板

using UnityEngine;
using UnityEngine.UI;
using QFramework;
using UnityEngine.SceneManagement;

namespace QFramework.Example
{
	public class SuccPanelData : UIPanelData
	{
	}
	public partial class SuccPanel : UIPanel
	{
		protected override void OnInit(IUIData uiData = null)
		{
			mData = uiData as SuccPanelData ?? new SuccPanelData();
			// please add init code here


			BtnNext.onClick.AddListener(() => { 
                GameData.LevelIndex++;
                SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);			
			});
        }
		
		protected override void OnOpen(IUIData uiData = null)
		{
		}
		
		protected override void OnShow()
		{
		}
		
		protected override void OnHide()
		{
		}
		
		protected override void OnClose()
		{
		}
	}
}

Fail面板

using UnityEngine;
using UnityEngine.UI;
using QFramework;
using UnityEngine.SceneManagement;

namespace QFramework.Example
{
	public class GameOverPanelData : UIPanelData
	{
	}
	public partial class GameOverPanel : UIPanel
	{
		protected override void OnInit(IUIData uiData = null)
		{
			mData = uiData as GameOverPanelData ?? new GameOverPanelData();
			// please add init code here

			BtnReset.onClick.AddListener(()=>{
                GameManager.Instance.StartBack();
				CloseSelf();
            });

            BtnReplay.onClick.AddListener(() => {
                SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
            });

			BtnHome.onClick.AddListener(() => {
				UIKit.OpenPanel<StartGamePanel>();
                CloseSelf();
            });
        }
		
		protected override void OnOpen(IUIData uiData = null)
		{
		}
		
		protected override void OnShow()
		{
		}
		
		protected override void OnHide()
		{
		}
		
		protected override void OnClose()
		{
		}
	}
}

watch QF中获取一个资源

new ResLoader()这种过时了
爆炸特效
球的预制体

			//在扫雷案例中测试的,用到WhiteChess
			ResKit.Init();
            ResLoader loader = ResLoader.Allocate();
			GameObject prefab = loader.LoadSync<GameObject>("WhiteChess");
			Instantiate(prefab , transform);

处理GameManager成GamePanel

01 首先将子节点的所有脚本上提到父节点 GamePanel
02 将脚本中引用的节点 进行提取,重命名(和节点名字相同),添加Bind脚本。到脚本最上面,方便看
03 因为用到UI,SpriteRenderer该改成Image

watch Awake的特点

脚本中只用Awake方法,前面就不会有勾选选项
在这里插入图片描述

bug AB资源不存在

明明有,重新打

bug 3D转UGUI

SpriteRenderer转Image后(想要用QF的调用面板的方式),球移动很小。
方法 生成地图文件之前用同样用UIRoot,也就是UGUI,而不是原来的世界坐标。此时小心注意父节点的Scale、预制体小球Ball的RectTranfrom的Scale都调为1,不然球与球之间的距离会有问题(问题就是要么球之间的距离有问题,要么轨道不重合)

modify 转UGUI Image

3000是球沿着曲线移动的平滑度
0.3也相当于球的直径,这个直径就是你要实例的那个球预制体的直径
在这里插入图片描述

方法 生成地图文件之前用同样用UIRoot,也就是UGUI,而不是原来的世界坐标。同时需要乘以倍率(试230合适)

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

public class MapConfig : ScriptableObject
{
    public float EndPoint { get; private set; }

    public List<Vector3> pathPointList = new List<Vector3>();

    public void InitMapConfig()
    {
        EndPoint = pathPointList.Count - 2;
    }

    public Vector3 GetPosition(float progress)
    {
        Camera ui=Camera.main.gameObject.FindComponentWithTag<Camera>("UI");
        int index = Mathf.FloorToInt(progress);
         //return Vector3.Lerp(pathPointList[index], pathPointList[index + 1], progress - index);

        Vector3 v1 = Vector3.Lerp(pathPointList[index], pathPointList[index + 1], progress - index);

        return v1*230f;
    }

}

效果 轨道球

在这里插入图片描述

-------------------------------------

modify 发射球的发射位置、速度和终点超界判定

发射球的位置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

速度

在这里插入图片描述

超界的判定

就是把Canvas上的 球 ,拖到Canvas的边界,看坐标
在这里插入图片描述

效果

在这里插入图片描述

-------------------------------------------

bug 销毁特效的大小和位置

using QFramework;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using ResLoader = QFramework.ResLoader;

public class FXManager :MonoSingleton<FXManager>
{
       Transform FXs;
   //
    GameObject destroyFXPrefab;
    ObjectPool<GameObject> destroyFXPool;
 

                                                                
    public void Init(Transform FXs)
    {
        this.FXs = FXs;
        //
        ResKit.Init();
        QFramework.ResLoader loader =  QFramework.ResLoader.Allocate();
        destroyFXPrefab = loader.LoadSync<GameObject>("DestroyFX"); 
        destroyFXPool = new ObjectPool<GameObject>(InstantiateFX, 10);
    }


    private GameObject InstantiateFX()
    {
        GameObject go = Instantiate(destroyFXPrefab, FXs);
        go.Hide();
        return go;
    }


    public void ShowDestroyFX(Vector3 pos)
    {
        GameObject go = destroyFXPool.GetObject();
        go.Show();
        go.transform.localPosition = pos;

        //延时0.5f执行回收操作
        ScheduleOnce.Start(this, () =>
         {
             go.Hide();
             destroyFXPool.AddObject(go);
         }, 0.5f);
    }
}

bug 发射器旋转一次就固定朝向左下方

后面又自动好了,可能改掉了循环调用打开GamePanel,导致存在多个GamePanel?
在这里插入图片描述

bug 自动刷新

点了几下没反应,因为原来没加自动刷新
在这里插入图片描述

bug 三个mapConfig不能放Resources,生成时空白

不放Resources,又会
GameManager.Instance.mapConfig运行后为空。这是因为
public class GameSceneConfig : MonoSingleton中的mapconfigArr有的为空

bug 抬起发射时不灵敏

关掉这个
在这里插入图片描述

watch 消球后不回退

小球后回退需要
小球后还能存在继续消球的情况在

bug 复活后回退太狠

modify SoundManager

看了示例,不需要类似于UIkit的ResKit.Init()的初始化
AudioKit.PlaySound(“resources://Sound/”+clipName );
AudioKit.PlayMusic(“resources://Sound/”+name,volume:volume);

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

public class SoundManager : MonoSingleton<SoundManager>
{
    static AudioSource bgAudio;


    public void Init()
    {
        bgAudio = gameObject.GetOrAddComponent<AudioSource>();
    }


    private static void PlaySound(string clipName)
    {
      //  AudioSource.PlayClipAtPoint(GetAudioClip(clipName), Vector3.zero);
        AudioKit.PlaySound("resources://Sound/"+clipName );
    }


    public static AudioClip GetAudioClip(string clipName)
    {
        return Resources.Load("Sound/" + clipName, typeof(AudioClip)) as AudioClip;
    }


    public static void PlayDestroy() { PlaySound("Eliminate");  }
    public static void PlayShoot()   { PlaySound("Shoot"); }
    public static void PlayInsert()  { PlaySound("BallEnter"); }
    public static void PlayBomb()    { PlaySound("Bomb"); }
    public static void PlayFail()    { PlaySound("Fail"); }
    public static void PlayFastMove(){ PlaySound("FastMove"); }
    public static void PlayMusic(string name,float volume=0.3f) 
    {                                                   
        //bgAudio.clip = SoundManager.GetAudioClip(name);//*-
        //bgAudio.volume = volume;
        //bgAudio.loop = true;
        //bgAudio.Play();
        AudioKit.PlayMusic("resources://Sound/"+name,volume:volume);
    }



}

bug shooterSO数据丢失

发生里面的Vector3丢失的情况,所以用了以下。暂时不知道管不管用

        EditorUtility.SetDirty(fromAsset);

在这里插入图片描述

bug Object的AB包命名

原本我命名AB为 0_mapconfig,打包出也有这个ABbao1
但是右面自动出现了 0_asset,并且自动把 文件标记为 0)_asset,导致后面打包出现 0_asset
在这里插入图片描述

bug 通关下一关球没被销毁,只是progress==0

这是开始初始化的一段小球,不动是因为此时的GmaeState==Succ。重新进入游戏,需要重置 GameState
在这里插入图片描述

modify Manager拆分

将Manager从GamePanel中拆分出来
在这里插入图片描述

--------------------------------------------------------

Panel两个面板说明

也是采用QF的UI脚本自动生成,往里面填代码
。。。。
复活时回退得太多了(3D转UGUI的原因),需要调数值(里面有个回退时间是3秒)
。。。。
两个面板的效果在文章最后

Panel 成功

using UnityEngine;
using UnityEngine.UI;
using QFramework;
using UnityEngine.SceneManagement;
using QFramework.PointGame;


namespace QFramework.Example
{
	public class SuccPanelData : UIPanelData
	{
	}
	public partial class SuccPanel : UIPanel
	{
		protected override void OnInit(IUIData uiData = null)
		{
			mData = uiData as SuccPanelData ?? new SuccPanelData();
			// please add init code here


			BtnNext.onClick.AddListener(() => {
				
				UIKit.OpenPanel<GamePanel>(
					new GamePanelData() { LevelCount=GameData.GetLevelIndex() }
				);
				CloseSelf();
			});

			BtnHome.onClick.AddListener(() => {
                UIKit.OpenPanel<StartGamePanel>();
                CloseSelf();
            });
        }
		
		protected override void OnOpen(IUIData uiData = null)
		{
		}
		
		protected override void OnShow()
		{
		}
		
		protected override void OnHide()
		{
		}
		
		protected override void OnClose()
		{
		}
	}
}

Panel 失败

主要是复活,不能Close,所以失败后先Hide,后面
01 复活,就Show
02 再来一次,就Close,在Open
03 回主页

using UnityEngine;
using UnityEngine.UI;
using QFramework;
using UnityEngine.SceneManagement;

namespace QFramework.Example
{
	public class GameOverPanelData : UIPanelData
	{
	}


	public partial class GameOverPanel : UIPanel
	{
		protected override void OnInit(IUIData uiData = null)
		{
			mData = uiData as GameOverPanelData ?? new GameOverPanelData();
			// please add init code here

			BtnReset.onClick.AddListener(()=>{ //复活
                GameManager.Instance.GameRevive();
                CloseSelf();

            });

            BtnReplay.onClick.AddListener(() => { //再来一次
                UIKit.ClosePanel<GamePanel>();
                UIKit.OpenPanel<GamePanel>( new GamePanelData() { LevelCount=GameData.GetLevelIndex() });
                CloseSelf();
            });

			BtnHome.onClick.AddListener(() => {	 //主页
                UIKit.ClosePanel<GamePanel>();
                UIKit.OpenPanel<StartGamePanel>();
                CloseSelf();
            });
        }
		
		protected override void OnOpen(IUIData uiData = null)
		{
		}
		
		protected override void OnShow()
		{
		}
		
		protected override void OnHide()
		{
		}
		
		protected override void OnClose()
		{
		}
	}
}

---------------------------------------------------------

Tool 轨道制作

modify BezierPathController

制作Ball预制体(我用了红球(可以用别的)的sprite(UGUI),原本的是MeshRender(3D世界中))
节点“Map”是BezierPathController.Awake()中用到的,是演示蓝色球坐标的,可以注释掉

01 拖一个到“1”节点(带有BezierPathController脚本)下
01 不断Ctrl+D复制节点下的预制体(每4个(基本2个控制弯曲度,2个在轨道上)红球预制体就有生成一段蓝色球)
02 Control Point List里面就是红球的坐标数据(世界坐标)
06 每4个红色球后,Scene中会生成一段蓝色球
03 04 全部做完,点击“生成地图文件”,“Path Point List”里面就是蓝色球的位置(世界坐标)
05 Map文件夹下也保存了一份坐标数据

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using UnityEditor;
using System;
using UnityEngine.UI;

public class BezierPathController : MonoBehaviour
{

    #region 字属



    public int segmentsPerCurve = 3000;
    /// <summary>连线上求和球之间的举例,也就是比直径大一点</summary>
    public float BallAndBallDis = 0.3f;
    public bool Debug = true;
    public GameObject ballPrefab;

    /// <summary>贝塞尔曲线的节点。控制弯曲度的白球</summary>
    public List<GameObject> ControlPointList = new List<GameObject>();
    /// <summary>贝塞尔曲线的的线段。连线的蓝球的坐标</summary>
    public List<Vector3> pathPointList = new List<Vector3>();
    #endregion


    //private void Awake()
    //{
    //    Debug = true;
    //    foreach (var item in pathPointList)
    //    {
    //        GameObject ball = Instantiate(ballPrefab, GameObject.Find("Map").transform);
    //        ball.transform.position = item;
    //    }
    //}


    private void OnDrawGizmos()
    {
        //节点
        ControlPointList.Clear();
        foreach (Transform item in transform)//没错,就是遍历子节点
        {
            ControlPointList.Add(item.gameObject);
        }


        //线段
        List<Vector3> controlPointPos 
            = ControlPointList.Select(point => point.transform.position).ToList();
        var points = GetDrawingPoints(controlPointPos, segmentsPerCurve);

        Vector3 startPos = points[0];
        pathPointList.Clear();
        pathPointList.Add(startPos);
        for (int i = 1; i < points.Count; i++)
        {
            if (Vector3.Distance(startPos, points[i]) >= BallAndBallDis)
            {
                startPos = points[i];
                pathPointList.Add(startPos);
            }
        }

        foreach (var item in ControlPointList)
        {
            item.GetComponent<Image>().enabled = Debug;//相当于将物体隐身,并不会影响物体的脚本运行,物体的碰撞体也依然存在。
        }

        if (Debug == false)
        { 
            return;
        } 


        //01 画连线球的球
        Gizmos.color = Color.blue;
        foreach (var pos in pathPointList)
        {
            Gizmos.DrawSphere(pos, BallAndBallDis / 2);
        }

        //02 画连线球的线
        Gizmos.color = Color.yellow;
        for (int i = 0; i < points.Count - 1; i++)
        {
            Gizmos.DrawLine(points[i], points[i + 1]);
        }

        //03 画连线球的的弯曲度控制线
        //绘制贝塞尔曲线控制点连线,红,色
        Gizmos.color = Color.red;
        for (int i = 0; i < controlPointPos.Count - 1; i++)
        {
            Gizmos.DrawLine(controlPointPos[i], controlPointPos[i + 1]);
        }

    }



    #region 辅助


    /// <summary>贝塞尔线段</summary>
    List<Vector3> GetDrawingPoints(List<Vector3> controlPoints, int segmentsPerCurve)
    {
        List<Vector3> points = new List<Vector3>();
        for (int i = 0; i < controlPoints.Count - 3; i += 3)
        {
            var p0 = controlPoints[i];
            var p1 = controlPoints[i + 1];
            var p2 = controlPoints[i + 2];
            var p3 = controlPoints[i + 3];

            for (int j = 0; j <= segmentsPerCurve; j++)
            {
                var t = j / (float)segmentsPerCurve;
                points.Add(CalculateBezierPoint(t, p0, p1, p2, p3));
            }
        }
        return points;
    }

    /// <summary>
    /// <summary>贝塞尔曲线的三次方公式</summary>
    /// </summary>
    /// <param name="t"></param>
    /// <param name="p0">起点</param>
    /// <param name="p1">一侧的平滑度调节点</param>
    /// <param name="p2">另一侧的平滑度调节点</param>
    /// <param name="p3">终点</param>
    /// <returns></returns>
    Vector3 CalculateBezierPoint(float t
        , Vector3 p0
        , Vector3 p1, Vector3 p2
        , Vector3 p3)
    {
        var x   = 1 - t;
        var xx  = x * x;
        var xxx = x * x * x;
        var tt  = t * t;
        var ttt = t * t * t;
        return p0 * xxx 
            +   3 * p1 * t * xx 
            +   3 * p2 * tt * x 
            +  p3 * ttt;
    }


#if UNITY_EDITOR
    /// <summary>
    /// pathPointList写入"Assets/Map/map.asset"
    /// 但没有覆盖功能,删掉再创建就看得见效果了
    /// </summary> 
    public void CreateMapAsset()
    {
        string assetPath =String.Format(  "Assets/Map/{0}.asset",gameObject.name);  //写这Vector3数据的
        MapConfig mapConfig = new MapConfig();
        foreach (Vector3 item in pathPointList)
        {
            mapConfig.pathPointList.Add(item);
        }
        AssetDatabase.CreateAsset(mapConfig, assetPath);
        AssetDatabase.SaveAssets();
    }
#endif


    #endregion


}


#if UNITY_EDITOR
[CustomEditor(typeof(BezierPathController))]
public class BezierEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        if (GUILayout.Button("生成地图文件"))//详情面板下的按钮
        {
            (target as BezierPathController).CreateMapAsset();
        }
        AssetDatabase.Refresh();
    }
}
#endif



modify 保存位置,文件命名

保存位置放在Resources会报错
文件命名改为gameObject.name,不写死

string assetPath =String.Format( “Assets/Map/{0}.asset”, gameObject.name); //写这Vector3数据的

watch 遍历子节点

Transform 内部实现了迭代器,所以就可以这样写

        //节点
        ControlPointList.Clear();
        foreach (Transform item in transform)//没错,就是遍历子节点
        {
            ControlPointList.Add(item.gameObject);
        }

Tool 青蛙Shooter的位置

GameMapConfig来控制,里面有个Vector3数组

modify 修改图片的名字(-1),方便对应

在这里插入图片描述

modify 制作Shooter位置的一个工具

/****************************************************
    文件:MakeShooterPos.cs
	作者:lenovo
    邮箱: 
    日期:2023/7/19 15:37:17
	功能:
*****************************************************/

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using Random = UnityEngine.Random;
 

public class MakeShooterPos : MonoBehaviour
{
#if UNITY_EDITOR
    /// <summary>
    /// pathPointList写入"Assets/Map/map.asset"
    /// 但没有覆盖功能,删掉再创建就看得见效果了
    /// </summary> 
    public void RecordeShooterPos()
    {
        MapConfig fromAsset= AssetDatabase.LoadAssetAtPath<MapConfig>("Assets/Map/shooter.asset");
        int idx = int.Parse( gameObject.name);
        Transform shooter = GameObject.Find("ShooterTrans").transform;
        fromAsset.pathPointList[idx] = shooter.localPosition;
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }
#endif

}

#if UNITY_EDITOR
[CustomEditor(typeof(MakeShooterPos))]
public class MakeShooterPosEditor : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        if (GUILayout.Button("生成Shooter位置"))//详情面板下的按钮
        {
            (target as MakeShooterPos).RecordeShooterPos();
        }
        AssetDatabase.Refresh();
    }
}
#endif





效果

在这里插入图片描述

---------------------------------------------------------

总的效果

01 主要按 S(Success)键,快速通关,进行测试。
02 主要按F(Fail)键,快速失败,进行测试
地图数据只做了三关,所以最后报空错误了
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

SpringBoot整合Spring Security实现权限控制

文章目录 Spring Security介绍Spring Security案例1、快速搭建一个springboot工程2、导入SpringSecurity整合springboot工程3、认证3.1、登录流程校验3.2、入门案例的原理3.3、实现思路3.4、实现认证流程&#xff08;自定义&#xff09;3.5、正式实现3.5.1 实现数据库的校验3.5…

Linux 内核 ASoC 基本数据结构

Linux 内核 ASoC 框架建立了新的抽象&#xff0c;并通过一些中间层&#xff0c;将这些抽象接入 ALSA 音频框架。 Linux 内核 ASoC 设备驱动的结构如下图&#xff1a; Linux 内核 ASoC 设备驱动程序在 Linux 内核中扮演多个角色。 Linux 内核 ASoC 设备驱动程序在初始化阶段向…

MATLAB遗传算法求解带容量约束的物流配送选址问题实例

MATLAB遗传算法求解带容量约束的物流配送选址问题实例 作者&#xff1a;麦哥爱西芹 MATLAB遗传算法求解带容量约束物流配送中心选址问题代码实例 遗传算法编程问题实例&#xff1a; 在经度范围为(116, 118)&#xff0c;纬度范围为(38, 40)的矩形区域内&#xff0c;散布着37个需…

第116天:免杀对抗-EDRSyscall-hookDLL反射注入白加黑隐写分离加载器

知识点 #知识点&#xff1a; 1、DLL劫持-自写&导入 2、DLL劫持-重写&分离 3、syscall-底层&项目#章节点&#xff1a; 编译代码面-ShellCode-混淆 编译代码面-编辑执行器-编写 编译代码面-分离加载器-编写 程序文件面-特征码定位-修改 程序文件面-加壳花指令-资源 …

常微分方程建模R包ecode(一)——构建常微分方程系统

常微分方程在诸多研究领域中有着广泛应用&#xff0c;本文希望向大家介绍笔者于近期开发的R包ecode&#xff0c;该包采用简洁易懂的语法帮助大家在R环境中构建常微分方程&#xff0c;并便利地调用R图形接口&#xff0c;研究常微分方程系统的相速矢量场、平衡点、稳定点等解析性…

基于linux下的高并发服务器开发(第二章)- 2.20 kill、raise、abort函数

03 / 信号的5种默认处理动作 当程序运行的过程中异常终止或崩溃&#xff0c;操作系统会将程序当时的内存状态记录下来&#xff0c;保存在一个文件中&#xff0c;这种行为就叫做Core Dump&#xff08;中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”&#…

X86设备启动过程

文章目录 一、电源自检二、BIOS自检三、引导设备选择四、主引导记录4.1 0x7c0 五、加载操作系统 x86计算机启动过程&#xff0c;主要分为这几个阶段&#xff1a;电源自检、BIOS自检、引导设备的选择、主引导记录、加载操作系统。 一、电源自检 当我们按下开关键后&#xff0c;…

消息队列总结(3)- RabbitMQ Kafka RocketMQ高可用方案

目录 1. 什么是高可用&#xff1f; 1.1 常见的高可用方法 1.2 消息队列的高可用 2. RabbitMQ的高可用方案 2.1 镜像队列 2.2 消息生产的确认机制 2.3 消息的持久化 3. Kafka的高可用方案 3.1 消息备份 3.2 ISR & IEO & HW 3.3 消息生产的确认机制 4. Rocke…

在虚拟机中安装anaconda和pytorch

首先我用的是VMware&#xff0c;ubuntu16.04. 首先建议安装anaconda,登录官网Free Download | Anaconda 下载完成后&#xff0c;来到安装文件目录处&#xff0c;打开终端&#xff0c; 然后在终端输入bash <anaconda文件名> 然后就一直enter和yes到底&#xff0c;直到安…

【后端面经】微服务构架 (1-3) | 熔断:熔断-恢复-熔断-恢复,抖来抖去怎么办?

文章目录 一、前置知识1、什么是熔断?2、什么是限流?3、什么是降级?4、怎么判断微服务出现了问题?A、指标有哪些?B、阈值如何选择?C、超过阈值之后,要不要持续一段时间才触发熔断?5、服务恢复正常二、面试环节1、面试准备2、面试基本思路三、总结 在微服务构架中…

【OC总结 面向对象 + 内存管理 + runtime】

文章目录 前言面向对象1.1 一个NSObject对象占用多少内存&#xff1f;1.2 iOS的继承链 & 对象的指针指向了哪里&#xff1f;1.3 OC的类的信息存放在哪里&#xff1f;-isa指针1.4 isMemberOfClass & isKindOfClass Runtime1.4 讲一下OC的消息机制1.5 消息转发机制流程1.…

React 中 {} 的应用

列表渲染&#xff1a; 1.使用数组的 map 方法&#xff08;因为map 可以映射&#xff09; 2、列表要添加 key 属性&#xff0c;值要唯一 // 导入 // 用来获取 dom元素 import { createRoot } from "react-dom/client";// 内容 const contentArr [{ id: 1, name: &…

Spring Cloud【分布式配置中心(Spring Cloud Config 、Config配置总控中心搭建、Config配置读取规则)】(九)

目录 服务网关Gateway实现用户鉴权_网关全局过滤器加入JWT 鉴权 分布式配置中心_Spring Cloud Config 分布式配置中心_Config配置总控中心搭建 分布式配置中心_Config配置读取规则 服务网关Gateway实现用户鉴权_网关全局过滤器加入JWT 鉴权 配置跳过验证路由 org:my:jwt…

C++笔记之函数对象functors与可调用对象

C笔记之函数对象functors与可调用对象 code review! 文章目录 C笔记之函数对象functors与可调用对象0.函数对象&#xff08;Function Objects&#xff09;&#xff0c;也称为functors1.函数对象与可调用对象的关系2.可调用对象几种形式2.1. 使用函数对象2.2. 使用普通函数指针…

Linux 打包Qt程序到无Qt环境Linux系统下运行,问题记录

Linux 环境下Qt开发的摄像头程序用到了opencv的库&#xff0c;需要跟Qt环境一起打包。 1.打包所有关联库用的是脚本程序。 #!/bin/bashLibDir$PWD"/lib" Target$1lib_array($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))$(m…

谈谈跨域?!

1.什么是跨域 跨域是一个网页脚本访问另外一个网页的内容&#xff0c;如果这两个网页的协议、端口&#xff0c;域名有一个不同就会产生跨域问题&#xff0c;浏览器具有一个同源策略&#xff0c;是一个安全策略&#xff0c;为了避免被恶意修改数据或者操作dom。 2.如何解决跨域…

为什么学习SpringSpring框架核心与设计思想(IOC与DI)?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 目录 文章目录 一、Spring是什么&#xff1f; 二、为什么要学习框架&#xff1f; 三、Spring核心概念 3.1 什么是容器&#xff1f; 3.2 什么是IOC&#xff1f; 四、再谈Spring中的 IOC 五…

高阶SQL语句

创建一个表一、按关键字排序1.1 单字段排序1.1.1 按分数排序&#xff0c;默认不指定是升序排列1.1.2 分数按降序排列1.1.3 结合where进行条件过滤&#xff0c;筛选地址是nanjing的学生按分数升序排列 1.2 多字段排序1.2.1 查询学生信息先按兴趣id降序排列&#xff0c;相同分数的…

C# List 详解三

目录 11.Equals(Object) 12.Exists(Predicate) 13.Find(Predicate) 14.FindAll(Predicate) 15.FindIndex(Int32, Int32, Predicate) 16.FindIndex(Int32, Predicate) 17.FindIndex(Predicate) C# List 详解一 1.Add(T)&#xff0c;2.AddRa…

信息管理系统---Servlet+javaBean+Druid+DButil

这里是学习了Servlet后结合数据库进行增删查改–登录等作为练手项目非常适合 准备工作&#xff1a; 1.数据准备 这张表是用户表&#xff0c;用于登录 CREATE TABLE users (id int NOT NULL AUTO_INCREMENT,username varchar(25) DEFAULT NULL,password varchar(20) DEFAULT…