1

私はお気に入りのゲームの 1 つのレベル リーダー アプリケーションを作成しようとしています。

レベル ファイルの最初の 8 バイト:

0100000001000000

メッシュ バージョン = 1 および頂点バージョン = 1 と記載されています。

ツリービューがあり、ツリーにヘッダーがあり、ヘッダーに頂点とメッシュのバージョンがある GUI を作成しました。これらにこのデータを入力したいと思います。

ここで、最初の問題が発生
します。コードをきれいにするためだけに、すべての読み取りを独自のクラス (HeaderData、MaterialData など) で行いたいと考えています。私は別のクラスでこれを行っているため、その
クラスからツリービューにアクセスする方法がわかりません(フォームクラスにいた場合、treeView1.whatever を実行できますが、そこからアクセスする方法がわかりません)。別のクラス

注: Levelreader.Form1.treeView1 を試しましたが、存在しません)。

public void button1_Click(object sender, EventArgs e)
{
    using (OpenFileDialog fileDialog = new OpenFileDialog())
    {
        if (fileDialog.ShowDialog() != DialogResult.Cancel)
        {
            textBox1.Text = fileDialog.FileName;
            using (BinaryReader fileBytes = new BinaryReader(new MemoryStream(File.ReadAllBytes(textBox1.Text))))
            {
                //Get the hex data in bytearray format
                //This won't be displayed
                int length = (int)fileBytes.BaseStream.Length;
                byte[] hex = fileBytes.ReadBytes(length);
                //File.WriteAllBytes(@"c:\temp_file.txt", hex);

                //This is what's displayed.
                //Remember to make changes to the byte array
                //and then update the view.
                string tempStr = BitConverter.ToString(hex).Replace("-", " ");
                richTextBox1.Text = tempStr;
                richTextBox1.ScrollBars = RichTextBoxScrollBars.ForcedVertical;

                //Instantiate the class
                Header temp = new Header();
                temp.HeaderData(hex);
                }
            }
        }

    }

これは、クラス Form1 内の名前空間 LevelReader 内のメソッドで、ファイルを読み取り、クラス Header() をインスタンス化します。次に HeaderData を呼び出し、そのクラス内でメッシュと頂点のバージョンを取得します。

namespace SceneStuff
{
    public class Header
    {

        public void HeaderData(byte[] hex)
        {
            //First 4 Bytes = Mesh Version
            //Second 4 Bytes = Vertex Version
            byte[] meshVersion = hex.Take(4).ToArray();
            byte[] vertexVersion = hex.Skip(4).Take(4).ToArray();

        }

    }
}

このメソッドでは、このデータを使用してツリービューにデータを入力したい場所です。たとえば、メッシュ バージョンを 2 に変更するなど、レベル内のいくつかの情報を変更したとします。(アプリの GUI で) [レベルのコンパイル] を押して TreeView から読み取ると、それが最適だと思います。その方法。ただし、私は c# を初めて使用するので、提案があれば教えてください。

要約すると、ここに私の2つの問題があります:
1)別の名前空間/クラスからツリービューにアクセスするにはどうすればよいですか?
2) コードを改善するための提案はありますか? (そして、レベルをコンパイルする方法は?)

ありがとう!

PS私はテキストの壁をお詫び申し上げます!>_<

編集:

ノードにデータを入力できないように見えるという別の問題があります。

次のように作成されます。

    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Mesh Version");

以下:

        treeNode2.Name = "meshVersion";
        treeNode2.Text = "Mesh Version";

メソッドへの参照として treeNode2 を追加しようとしましたが、うまくいきません。
で選択しようとしましたtreeView1.SelectedNode = treeView1.Nodes[1].Nodes[1];が、それもうまくいかないようです。(これは、私がアクセスしようとしているものを示しているGUIの画像です(メッシュバージョンにアクセスしようとしてい ます
http://i.imgur.com/hahhG.pngする必要があるのは、その PRE EXISTING NODE にアクセスしてそれに子を追加することです.私は、これらの状況でそれを詳述するチュートリアルを見つけることができないようであり、私のニーズに合わせて彼らのチュートリアルを提供するのに十分であることを理解していません. .Nodes[1].Nodes[1]


本当にありがとう。

4

1 に答える 1

1

3 つのソリューション:

  1. TreeView の可視性Form1.Designer.cspublicまたはに変更できますinternal

  2. または、関数内で TreeView ノードを作成してHeaderData()返すこともできます。

  3. または @ Saeid87HeaderData()が言ったように、関数を参照して TreeView を渡すことができます。

例 :

public void HeaderData(byte[] hex, ref TreeView treeview)
{
    //First 4 Bytes = Mesh Version
    //Second 4 Bytes = Vertex Version
    byte[] meshVersion = hex.Take(4).ToArray();
    byte[] vertexVersion = hex.Skip(4).Take(4).ToArray();
    
    //Example: Do something with the Mesh Version Node
    treeView1.Nodes[1].Nodes[0].Nodes[0].Text = "Lorem ipsum";
}

関数を呼び出すときは、参照によって TreeView を渡します (button1_Click関数内) 。

temp.HeaderData(hex, ref treeView1)
于 2012-09-15T13:19:58.597 に答える