1

悲しいことに、私はこの質問をするのは 3 回目で、私が尋ねるたびに意味がないと思いますが、もう一度単語/コード、写真、簡単なテストを試してみましょう。2 つのクラスがあり、1 つはパケットを受け取り、値を取得しますそれらと他の値はこれらの値を使用する必要がありますが、このクラスからそれらを取得できませんでした注:この値は新しいスレッドで使用されるため、コードを表示します

namespace ProxyParadise.Network.Packets
{

    public class PacketHandler
    {
        public PacketHandler() // takes no parameters using get/set , failed take 1
        {
            Console.WriteLine("defining an object to get x,y take 1, value now is (" + actualX + "," + actualY + ")");
        }
        public void getxy(ushort Actualx, ushort Actualy) //using get and set with parameters failed take 2
        {
            Console.WriteLine("defining an object to get x,y take 2, value now is (" + actualX + "," + actualY + ")");
            actualX = actualX; Actualy = actualY;
        }
        public ushort actualX { get; set; }
        public ushort actualY { get; set; }
public unsafe void HandleServer(byte[] data)
        {
            try
            {
                    var type = *((ushort*)(ptr + 2));
                    switch (type)
                    {
                        case 10010:
                            {
                                if (BitConverter.ToUInt16(data, 24) != 0)
                                {
                                    actualX = BitConverter.ToUInt16(data, 24);
                                    actualY = BitConverter.ToUInt16(data, 26);
                                    Console.WriteLine("account coords updated to (" + actualX + "," + actualY + ")");
                                }
                                break;
                            }
                    }

そして、これはこれをテストする写真です。このパケットを受信すると、更新されるたびにコンソールに書き込みます。 テスト1 今、他のクラスでこれらの値を取得しようとしているので、それらを使用していくつかのことを行い、サーバーにもパケットを送信します。これが他のクラスです(クラス全体なので、重要な部分を投稿しないでくださいと言う人には意味があります)

public class ClientBase
{
    GameUser role2;
    PacketHandler ph = new PacketHandler();
        public ushort X, Y;
        PacketHandler ph2 = new PacketHandler();

    public ClientBase(GameUser role)
    {
        role2 = role;
        Thread T = new Thread(HuntThread) { Name = "Hunt Thread" };
        T.Start(this);
        Console.WriteLine("with name : " +T.Name +  " with execution context : "+T.ExecutionContext +" with state : "+ T.IsAlive + " with id : " + T.ManagedThreadId);
       T.Join();
    }
    Monster GetNextkill()
    {
       // byte Range = 18;
        Monster CurrentTarget = null;
        foreach (KeyValuePair<uint, Monster> Pair in Dictionary.Clone(Dictionary.Monsters))
        {
          //  if (Math.Max(Math.Abs( - Pair.Value.X), Math.Abs(pp.Y - Pair.Value.Y)) > 18)
          //  {
          //      Dictionary.Monsters.Remove(Pair.Key);
          //  }
           // else if (Math.Max(Math.Abs( - Pair.Value.X), Math.Abs(pp.Y - Pair.Value.Y)) <= Range)
           // {
           //     Range = (byte)Math.Max(Math.Abs(this.X - Pair.Value.X), Math.Abs(this.Y - Pair.Value.Y));
                CurrentTarget = Pair.Value;
             //   Console.WriteLine("there is " + Dictionary.Monsters.Count + " monster around you");
          //  }
        }
        return CurrentTarget;
    }
    public void HuntThread(object Sender)
    {
        try
        {
            ClientBase Client = Sender as ClientBase;
            while (true)
            {
                Monster Target = GetNextkill();
                if (Target != null)
                {
                    Thread.Sleep(1000);
                    ProxyParadise.Network.Packets.PacketStructure ps = new ProxyParadise.Network.Packets.PacketStructure();
                    //       ps.__Packet1022XP(Target.UID, Target.X, Target.Y); 
                    int xxx = Target.X - 1;
                    int yyy = Target.Y - 1;
                    ph2.getxy(X, Y);
                    Console.WriteLine("x and y in the thread is " + X + Y);
                    ps.__Packet10010(Target.X, Target.Y, role2, "normal", "server", ph.actualX, ph.actualY);
                    Thread.Sleep(1000);
                    ps.__Packet10010(Target.X, Target.Y, role2, "sdasdsa", "client", role2.X, role2.Y);
                    Thread.Sleep(1000);
                    ps.__Packet1022NONEXP(Target.UID, Target.X , Target.Y, role2);
                    //if fatal strike is on attack the monster 
                    //else
                    //jump next to the target and attack
                    Dictionary.Monsters.SafeRemove(Target.UID);

                }
                return;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("expection error : " + ex);
        }
    }
    public uint UID;

}

したがって、問題は、値を取得するためのオブジェクトの設定/取得と定義の両方の方法です(メソッドから構造体でも取得しようとして2回実行しましたが、両方のケースで失敗しました)

これがテスト画像です ここに画像の説明を入力

なぜそれがゼロなのか疑問に思っています。新しいオブジェクトが原因だと思うこともあれば、スレッドが原因だと思うこともあります

今回は本当に助けてもらいたいと思っています。同じことを4日間試みて、聞いたことがたくさんありました(ロックではありません)。これを読んで時間を割いてくれて本当にありがとうそして、私はこれを高く評価しました:)また、私のスペルと文法を修正するmodにも感謝します

4

1 に答える 1

0

ここに表示されているパラメーターとプロパティの名前の大文字/小文字は、実行しているコードとまったく同じですか?

public void getxy(ushort Actualx, ushort Actualy) //using get and set with parameters failed take 2
{
    Console.WriteLine("defining an object to get x,y take 2, value now is (" + actualX + "," + actualY + ")");
    actualX = actualX; Actualy = actualY;
}

パラメータの名前を変更すると、なぜこれが間違っているのかがわかるはずです。

public void getxy(ushort inputx, ushort inputy) //using get and set with parameters failed take 2
{
    Console.WriteLine("defining an object to get x,y take 2, value now is (" + actualX + "," + actualY + ")");
    actualX = actualX; inputy = actualY;
}

これは確かにそれらが常にゼロである理由を説明します、それらは決して変更されません。

コードにブレークポイントを設定し、デバッグでコードをステップ実行してみましたか?特にgetxyメソッドを使用して、毎回入力値と出力値を正確に確認しましたか?

于 2012-09-13T14:18:31.940 に答える