日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【grasshopper自定义电池开发】使用Visual Studio 2022借助官方扩展插件开发一个贪吃蛇电池

發布時間:2023/12/10 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【grasshopper自定义电池开发】使用Visual Studio 2022借助官方扩展插件开发一个贪吃蛇电池 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

grasshopper自定義電池開發——貪吃蛇

  • 一、 為什么使用Visual Studio 2022和C#?
  • 二、.如何創建一個空grasshopper項目?
    • a.下載并安裝Visual Studio
    • b.安裝擴展并使用
    • c. 添加依賴
    • d. 添加GH電池目錄
  • 三、貪吃蛇電池
    • a. 功能
    • b.具體代碼
    • c.使用方法及與效果
  • 參考資料

一、 為什么使用Visual Studio 2022和C#?

Visual Studio中擁有官方的grasshopper擴展插件,可以提供一個模板快速開發。
C#是grasshopper的原生語言,該使用語言開發擴展性,兼容性最好。

二、.如何創建一個空grasshopper項目?

a.下載并安裝Visual Studio

  • 如果是第一次使用Visual Studio那選用Community版本(社區版本)就可以,這三個版本中只有Community版本是可以免費使用的;
  • 確保在Visual Studio安裝時,在“工作負載”選項卡下選擇了“桌面應用和移動應用”下的“.NET桌面開發”組件包,其組件包描述中有 .NET Framework 這個詞的出現,因為這個是GH電池的依賴框架;
  • 如果在之前安裝Visual Studio時未選擇安裝上述組件包,隨時可以使用Visual Studio Installer額外加裝上述組件包;
  • b.安裝擴展并使用

  • 打開VS后,先點擊“繼續但無需代碼”。進入編輯界面。
  • 在最頂端的菜單欄中找到“擴展(X)”-“管理擴展(M)”,搜索Grasshopper,安裝該擴展。然后需要重啟VS來應用擴展。
  • 新建一個項目,使用項目模板,搜索Grasshopper的模板并使用,此處使用的C#語言版本的。

    4.添加新項目后,會要求輸入一些電池相關的信息。如下:
  • 1.Add-on display name :決定了這個電池在GH插件加載的時候顯示的名字。
    2.Component class :是C#的類的名字,與GH顯示無關,這里可以使用默認值,任何不能作為C#的類名的字符都不可以出現在這里。
    3.Name :是該電池在GH里會顯示的名字。
    4.Nickname :是該電池在GH里選擇顯示簡稱時的名字。
    5.Category :是該電池在GH里會被放在的大類的名字,比如Params、Math、Sets等。GH如果本身不存在輸入的大類的名字的話,GH會為這個電池單獨創建一個大類。在這里我們可以填入MyComp,并且以后所有的電池都可以填相同的大類,這樣方便我們找到自己創建的電池。
    6.Subcategory:是該電池在GH里會被放在大類下的哪個子類里。
    7.Description :是該電池在GH里顯示的額外描述性信息。

    c. 添加依賴

  • 項目創建完成后,可以發現,引入的包Grasshopper.Kernel、Rhino.Geometry;變紅,說明沒有依賴上。
  • 我們需要手動修改依賴:點擊項目的頂級,會彈出項目的配置文件

    進行修改。
  • //刪除該段,因為無法找到該包<ItemGroup><PackageReference Include="Grasshopper" Version="7.13.21348.13001" IncludeAssets="compile;build" /></ItemGroup>//替換為以下兩段:若Rhino是默認安裝在C盤,則可以直接使用<ItemGroup><Reference Include="Grasshopper"><HintPath>C:\Program Files\Rhino 7\Plug-ins\Grasshopper\Grasshopper.dll</HintPath><Private>False</Private></Reference><Reference Include="RhinoCommon"><HintPath>C:\Program Files\Rhino 7\System\RhinoCommon.dll</HintPath><Private>False</Private></Reference></ItemGroup>

    修改并保存后,可以發現,錯誤已經消失了。此時空項目便做好了,可以正常編譯。

    d. 添加GH電池目錄

    GH的電池需要放置在特定目錄才能被加載,我們將工程目錄添加到GH電池目錄,GH就可以自動加載最新的電池使用。
    首先打開Rhino,在命令欄里輸入GrasshopperDeveloperSettings

    1.把 Memory load *.GHA assemblies using COFF byte arrays 這個復選框前的鉤去掉,該選項會影響我們代碼的斷點調試
    2.點擊 Add Folder
    3.點擊右側的 … , 將我們剛剛的代碼的存儲位置下的 bin 文件夾選中,這樣GH就知道去這個文件夾找到剛剛我們生成的 gha 文件了。

  • 設置完成后,打開GH應該就可以找到我們剛剛創建的空插件了。
  • 三、貪吃蛇電池

    a. 功能

  • 蛇吃食物能增長身體
  • 設定蛇的運動平面,包括邊界
  • 設置x與y軸的格數
  • 蛇能穿越邊界并從另一端回歸
  • 蛇不能原地掉頭
  • b.具體代碼

    類成員變量:

    public sealed class Dir{public static readonly Dir Up = new Dir("Up");public static readonly Dir Down = new Dir("Down");public static readonly Dir Left = new Dir("Left");public static readonly Dir Right = new Dir("Right");private Dir(string value){Name = value;}public string Name { get; private set; }}Point3d headPoint = new Point3d(0, 0, 0);double headXinPlane = 0;double headYinPlane = 0;List<Point3d> bodyPoints = new List<Point3d>() { new Point3d(0, 0, 0) };int seed = 0;Circle lastFood = new Circle(1);List<Curve> lastSnake = new List<Curve>();int nowdirection = 0;

    定義輸入:

    protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager){pManager.AddRectangleParameter("rectangle", "rec", "蛇運動平面", GH_ParamAccess.item);pManager.AddIntegerParameter("xDivideNumber", "xDiv", "x軸分割的塊數", GH_ParamAccess.item);pManager.AddIntegerParameter("yDivideNumber", "yDiv", "y軸分割的塊數", GH_ParamAccess.item);pManager.AddBooleanParameter(Dir.Up.Name, Dir.Up.Name, "連接一個按鈕來讓蛇向+y方向轉", GH_ParamAccess.item);pManager.AddBooleanParameter(Dir.Down.Name, Dir.Down.Name, "連接一個按鈕來讓-y方向轉", GH_ParamAccess.item);pManager.AddBooleanParameter(Dir.Left.Name, Dir.Left.Name, "連接一個按鈕來讓蛇向+x方向轉", GH_ParamAccess.item);pManager.AddBooleanParameter(Dir.Right.Name, Dir.Right.Name, "連接一個按鈕來讓蛇向-x方向轉", GH_ParamAccess.item);pManager.AddBooleanParameter("Reset", "Reset", "連接一個按鈕來重置游戲.", GH_ParamAccess.item);}

    定義輸出:

    protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager){pManager.AddCurveParameter("Snake", "Snake", "蛇身體的曲線", GH_ParamAccess.list);pManager.AddCircleParameter("Food", "Food", "事物的圓", GH_ParamAccess.item);}

    邏輯:

    protected override void SolveInstance(IGH_DataAccess DA){//Inputbool[] dirs = { false, false, false, false };bool zReset = false;int xMax = 0;int yMax = 0;Rectangle3d rec = new Rectangle3d();//為了避免方便設計避免掉頭邏輯,使用上左下右的排列順序bool judge = DA.GetData(Dir.Up.Name, ref dirs[0]);judge &= DA.GetData(Dir.Down.Name, ref dirs[2]);judge &= DA.GetData(Dir.Left.Name, ref dirs[1]);judge &= DA.GetData(Dir.Right.Name, ref dirs[3]);bool judge2 = DA.GetData("Reset", ref zReset);DA.GetData("xDivideNumber", ref xMax);DA.GetData("yDivideNumber", ref yMax);DA.GetData("rectangle", ref rec);Plane plane = rec.Plane;//rec.pointAt()使用的是百分數,故直接除以1double xStep = 1d / xMax;double yStep = 1d / yMax;//間隔double step = 0;//半徑double r = 1;if (xStep > yStep){step = yStep;r = yStep * rec.Height / 2;}else{step = xStep;r = xStep * rec.Width / 2;}AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, r + " " + xStep + " " + yStep + " " + step);if (!judge) AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "請連接一個按鈕來控制方向");if (!judge2) AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "請連接一個按鈕來復原");AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, "記得加上Trigger. 建議間隔:500ms.");List<Curve> bodies = new List<Curve>();Random foodRandomNumber = new Random(seed);//Resetif (zReset){headXinPlane = 0;headYinPlane = 0;headPoint = rec.PointAt((headXinPlane + 0.5) * xStep, (headYinPlane + 0.5) * yStep);bodyPoints = new List<Point3d>() { headPoint };return;}//Directionfor (int i = 0; i < dirs.Length; i++){if (dirs[i]){if (nowdirection != i && (nowdirection + 2) % dirs.Length != i){//只有在往另外一個軸進行移動,才算有效移動nowdirection = i;}//避免在多次輸入的情況下快速刷新,只更新當前方向就返回DA.SetData("Food", lastFood);DA.SetDataList("Snake", lastSnake);//return;}}bodyPoints.Add(headPoint);if (nowdirection % 2 == 0){//此時是上或下if (nowdirection == 0){headYinPlane += 1;}else{headYinPlane -= 1;}//超出邊界,從另一邊回歸if (headYinPlane >= yMax){headYinPlane = 0;}else if (headYinPlane < 0){headYinPlane = yMax - 1;}}else{if (nowdirection == 1){headXinPlane += 1;}else{headXinPlane -= 1;}if (headXinPlane >= xMax){headXinPlane = 0;}else if (headXinPlane < 0){headXinPlane = xMax - 1;}}headPoint = rec.PointAt((headXinPlane + 0.5) * xStep, (headYinPlane + 0.5) * yStep);//Food section belowdouble foodRandomX = foodRandomNumber.Next(0, xMax - 1);double foodRandomY = foodRandomNumber.Next(0, yMax - 1);Point3d foodPoint = rec.PointAt((foodRandomX + 0.5) * xStep, (foodRandomY + 0.5) * yStep);Circle FoodCircle = new Circle(plane, foodPoint, r);//Eating judgeif (foodPoint.DistanceTo(headPoint) <= 2 * r) { seed++; }else{bodyPoints.RemoveRange(0, 1);}foreach (Point3d point in bodyPoints){Circle body = new Circle(plane, point, r);bodies.Add(body.ToNurbsCurve());}Curve[] zSnake = Curve.CreateBooleanUnion(bodies, 1);List<Curve> output = new List<Curve>(zSnake);//OutputDA.SetData("Food", FoodCircle);DA.SetDataList("Snake", output);lastFood = FoodCircle;lastSnake = output;}

    c.使用方法及與效果

  • 使用方法
  • 調整Trigger的間隔可以改變蛇運動的快慢

  • 效果
  • 參考資料

  • 制作Grasshopper電池/二次開發基礎【上篇】
  • 總結

    以上是生活随笔為你收集整理的【grasshopper自定义电池开发】使用Visual Studio 2022借助官方扩展插件开发一个贪吃蛇电池的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。