nanoCADでの移動、同志.NET、またはリバーシ

少し前に、nanoCAD 3.5リリースのリリースという素晴らしいイベントがありました。 このバージョンの重要な革新は、この記事で説明するオープンAPIでした。



ご存知のように、何かを学ぶ最良の方法はそれをすることです。 私はスクリプトでnanoCADの下でリバーシを書いたことがあります。 今、私は.NETでリバーシを書くことにしました。

nanoCAD_MgdReversi

その結果、nanoCADだけでなく機能するクロスCADプラットフォームアプリケーションが完成しました。 これが行われた方法-カットの下を見てください。



以前はnanoCADでプログラムすることが可能でした。 スクリプトで、 ダウシェルピンスキー曲線を書き、私はリバーシを書きました、私たちのフォーラムから他の例がありました。 これはもちろんすべて良いことですが、十分ではありません。 したがって、私の次の動きは.NETです。



エントリーレベル。



最初に行うことは、nanoCADで実行されるコードを含むアセンブリを作成することでした:



コマンドとして登録されるメソッドには、パブリック修飾子があり、特別な属性CommandMethodでマークされている必要があります。



たとえば、HelloWorldは次のようになります。

[CommandMethod("HelloWorld")] public void HelloWorld () { Editor ed = Platform.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; //      ed.WriteMessage("     nanoCAD!"); }
      
      





そしてすべて!

これについては、nanoCAD SDKで読むことができるので、これ以上詳しく説明しません。 入手先 nanoCAD Developer Clubでは、登録が可能です。



構造。



ゲームをいくつかのクラスに分けました:ゲームクラス、ゲームボードクラス、情報パネルクラス、ゲームチップクラス:

各クラスはできるだけ独立している必要があります。

次に、オブジェクトの作成方法、変更方法、ユーザーとのコミュニケーション方法を学ぶ必要がありました。



オブジェクトの作成。 マット 一部。



逆を描く前に、何をすべきか、何をすべきかを理解する必要がありました。

オブジェクトを作成するには、ドキュメントの構造について少し知る必要があります。 各ドキュメントにはデータベースがあります。 データベースには、図面に含まれるオブジェクトとそれらの相互関係が保存されます。 データベースには、アーク、モデル空間、テキストスタイルなどのすべてが格納されます。 図面に新しいオブジェクトを追加する場合、データベースに追加する必要があります。 また、データベースがある場合は、トランザクションもあります。



ドキュメントを保護するためにトランザクションが必要です。コード実行の結果としてエラーが発生した場合-このコードによって追加されたオブジェクトはドキュメントに入りません-トランザクションはキャンセルされます。 すべてが成功すると、トランザクションが確認され、オブジェクトが追加されます。



 Database db = Application.DocumentManager.MdiActiveDocument.Database; TransactionManager tm = db.TransactionManager; using (Transaction tr = tm.StartTransaction()) { ... tr.Commit(); }
      
      





オブジェクトを作成するだけでは十分ではありません。 彼は繋がれず、「宙に浮いている」ままです。 オブジェクトはどこかに配置する必要があります。 通常、これはモデル空間です。 スクリプトには似たようなものがありました-彼はモデル空間に「線を作る」と言いました-それはそこに現れるでしょう。 .NETでは、少し異なります-作成されたオブジェクトをモデル空間とトランザクションに追加する必要があります。



 using (Transaction tr = tm.StartTransaction()) { BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead, false) as BlockTable; BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false) as BlockTableRecord; Line line = new Line(); ObjectId lid = ms.AppendEntity(line); //     tr.AddNewlyCreatedDBObject(line, true); //    tr.Commit(); //   }
      
      





データベースに追加された各オブジェクトは、その個人コード-ObjectIdによって一意に識別されます。 ObjectIdを使用すると、読み取りまたは書き込み用にオブジェクトを開くことができます。



オブジェクトの作成2.全速力で前進します。



素晴らしい。 ドキュメントの内部キッチンに関する知識を身に付けて、ゲームボードのクラスの開発を最終的に開始できます。 ボードなし-パーティーなし。 したがって、私が始めた最初のことは、ドキュメントスペースにセルを描画することでした。



私はhatch化から細胞を作りました。 NCadSDK.chmでHatchオブジェクトの説明を開いた後(ドキュメントはDevelopers ClubのメンバーアクセスできるSDKに含まれています)、必要な知識が得られました。 3番目の段落は、ハッチングがループで構成されていることをすぐに通知し、ハッチングオブジェクトのメソッドのリストから、魔法の言葉AppendLoop()が提案されました。 それが必要だと思った。



そのため、各セルは、シェーディングが塗りつぶされた正方形のポリラインから構築しました。 すべてのハッチングは、8 x 8セルの正方形を形成しました。



さらに-親指では、すべてが前回のようです:3Dmeshオブジェクトから境界線とチップを作成します。 境界は、2〜2個のピークを持つ多角形です。 頂点の座標を計算し、それらを作成し、ネットワークに追加し、モデルにネットワークを追加します。



 using (Transaction tr = tm.StartTransaction()) { //   PolygonMesh mesh = new PolygonMesh(); mesh.NSize = 2; mesh.MSize = 2; ms.AppendEntity(mesh); tr.AddNewlyCreatedDBObject(mesh, true); //     AddVertexToMesh(mesh, new Point3d(col*gridstep, 0,-linehight), tr); AddVertexToMesh(mesh, new Point3d(col*gridstep, 0, linehight), tr); AddVertexToMesh(mesh, new Point3d(col*gridstep,8*gridstep,-linehight), tr); AddVertexToMesh(mesh, new Point3d(col*gridstep,8*gridstep,linehight), tr); tr.Commit(); } //    private void AddVertexToMesh(PolygonMesh PolyMesh, Point3d Pt3d, Transaction Trans) { PolygonMeshVertex PMeshVer = new PolygonMeshVertex(Pt3d); PolyMesh.AppendVertex(PMeshVer); Trans.AddNewlyCreatedDBObject(PMeshVer, true); }
      
      





素晴らしい。 セルがあり、仕切りがあります。 チップの描画も難しくありません。 ゲームのスクリプトバージョンからボールの頂点の座標を計算するための式を取りました。 確かに、オブジェクトがリバースゲームチップのように見えるように修正しました。



結果は次のとおりです。

ゲーム盤



「私は53歳です。広場に出ます。」



次に、ユーザーのアクションに応答する方法を学習する必要があります。



ここでも、マットに言及する必要があります。 一部。 データベースに加えて、ドキュメント自体ではなく、アプリケーション全体に関連するオブジェクトがさらにいくつかあります。 これは、たとえば、DocumentCollectionアプリケーションで開かれたすべてのドキュメントのコレクションであるApplicationオブジェクトです。 そして、これがユーザーインタラクションのオブジェクト-エディターです。 他にもありますが、今は触れません。



Editorオブジェクトには、ユーザーと対話するための多くのメソッドがあります:オブジェクトのクエリ、文字列、数値、エリアのクエリ。 オブジェクトの要求は、GetEntityメソッド(PromptEntityOptions)によって実行されます。 PromptEntityOptionsオブジェクトはオプションのパラメーターです。 このオブジェクトを通じて、招待ラインが設定され、キーワード(必要な場合)、オブジェクトの選択に関する制限が設定されます。 すべてのインプットメソッドは同様のオブジェクトを受け入れます。



移動の原理は同じままです-ユーザーが行きたいセルを選択します。 セルはハッチングオブジェクトです。 したがって-私は、ハッチングオブジェクトのみを入力として受け入れることを示します。空の選択は禁止することであり、オブジェクトが必要です。 そしてプロンプト行を書きます。



 Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ObjectId selectObj = ObjectId.Null; PromptEntityOptions opts = new PromptEntityOptions(" . "); opts.SetRejectMessage("\n    ."); opts.AddAllowedClass(typeof(Hatch), false); PromptEntityResult pr = ed.GetEntity(opts);
      
      





セルは、ユーザーがチップを置きたい場所を正確に決定します。 次に、アルゴリズムはこれが実行できるかどうかを確認し、実行できる場合はプレーヤーが移動し、必要なチップが裏返されます。



既存のチップの再塗装。



すでに書いたように、すべてのオブジェクトはデータベース内に存在します。 つまり、オブジェクトのプロパティを読み取ったり変更したりするには、このオブジェクトを開く必要があります。 オブジェクトは、GetObject()トランザクションメソッドを使用して開きます。 変更が完了すると、トランザクションが確認されます。



 using (Transaction myT = db.TransactionManager.StartTransaction()) { // pieceId –  id     //   pieceId   - OpenMode.ForWrite PolygonMesh piece = myT.GetObject(this.pieceId, OpenMode.ForWrite) as PolygonMesh; //         piece.Color = (player == ePlayer.Human) ? Constants.HumanColor: Constants.PcColor; //   myT.Commit(); }
      
      





スナック。



ゲームボードをメモリに格納するための2つのデータ構造を作成しました。配列と辞書です。

配列には8 x 8ボードの画像が格納され、セル要素の対応の辞書はObjectIdのハッチングです。 両方のデータ構造には、ゲームボードオブジェクトへの参照が格納されます。 このアプローチでは、同期について心配する必要はありません。 ピース要素のみが変更されます。 そして、あなたはいつでもここでそれを手に入れることができます。 配列や辞書に関係ありません。

 Dictionary<ObjectId, Piece> GameDesc = new Dictionary<ObjectId, Piece>(); Piece[,] GameDesc_xy = new Piece[8, 8];
      
      





スクリプトとは異なり、.NETでは、多くのものをより美しくシンプルにすることができました。 フレームワークの機能には、快適な利点がありました。 たとえば、LINQを使用すると、データ構造はほとんど単独で処理されました。 1行のユーザーチップの数をカウントします。 コンピューターの移動用のセルを選択することは、1つの要求です。 美人

 int GetCounterCount(ePlayer player) { //    player return gamedesk.GameDesc.Where(x => x.Value.Player == player).Count(); }
      
      





ゲームプレイ



ゲームのコンパイルと実行



ゲームのソースはここで取ることができます 。 Visual StudioまたはSharpDeveloperでプロジェクトを開いてコンパイルする必要があります。 プロジェクトパスは、nanoCADが標準ディレクトリにインストールされることを期待して設定されます。

ソースは必要ないが、逆を見るだけなら、私たちが組み立てたモジュールをダウンロードできます。



ゲームを開始するには、NETLOADチームがnanoCADにアセンブリMgdReversi.dllをロードする必要があります。 これで、PLAYチームでゲームを開始できます。



何もする時間がなかった。



ファイル形式は両方のシステムで同じであるため、ゲームの途中で停止し、nanoCADでファイルとしてゲームを保存し、AutoCADでファイルを開いて再生すると面白いでしょう。



ただし、このためにアプリケーションアーキテクチャをやり直す必要があります。ゲームの状態に関する情報はチームのメモリに保存されますが、ファイルに保存される描画オブジェクト(フィールド、チップ)に保存する必要があります。 将来のために残しましょう。



それまでは、ゲームの最初から最後まで、AutoCADの下、nanoCADの下で、停止することなくReversiをプレイできます。ゲームは同じように動作します。 SDK、ObjectARXを使用して、AutoCADでReversiを再構築するだけで十分です。難しくはありません。



All Articles