Аэрохоккейный мультиплеер - как я могу постоянно перемещать pictureBox от ввода, поступающего через клиентское приложение. - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь переместить окно изображения на экране хоста (простого сервера) через данные, поступающие с клиентского компьютера.Это простая игра-понг, которая является многопользовательской.Клиент отправляет данные всякий раз, когда нажимаются клавиши.Он в основном отправляет координаты оси Y изображения PictureBox, но я получаю сообщение об ошибке при попытке изменить местоположение окна изображения.Мой клиентский код, который отправляет местоположение оси Y в playerB pictureBox на серверный проигрыватель ..

private void keyisdown(object sender, KeyEventArgs e) {

    if (e.KeyCode == Keys.Up)
    {
        goup = true;


    String s = Convert.ToString(player.Location.Y);

    byte[] byteTime = Encoding.ASCII.GetBytes(s);

    ns.Write(byteTime, 0, byteTime.Length);
}
    if (e.KeyCode == Keys.Down)
    {
        godown = true;

    String s = Convert.ToString(player.Location.Y);

    byte[] byteTime = Encoding.ASCII.GetBytes(s);

    ns.Write(byteTime, 0, byteTime.Length);
}

}

Моя серверная программа, которая получает данные

public partial class Form1 : Form {

delegate void SetTextCallback(string text);

TcpListener listener;

TcpClient client;

NetworkStream ns;

 Thread t = null;


public Form1()
{
InitializeComponent();

listener = new TcpListener(IPAddress.Any, 4545);

listener.Start();

client = listener.AcceptTcpClient();

ns = client.GetStream();

t = new Thread(DoWork);

t.Start();
}

private void button1_Click(object sender, EventArgs e)
{
String s = textBox2.Text;

byte[] byteTime = Encoding.ASCII.GetBytes(s);

ns.Write(byteTime, 0, byteTime.Length);
}
public void DoWork()

{

byte[] bytes = new byte[1024];

while (true)

{

    int bytesRead = ns.Read(bytes, 0, bytes.Length);
    string data;
   this.SetText(Encoding.ASCII.GetString(bytes, 0, bytesRead));

   // data = (Encoding.ASCII.GetString(bytes, 0, bytesRead));

   // int Y = Convert.ToInt32(data);

   // pictureBox1.Location = new Point(769, Y);
    }

  }

  private void SetText(string text)

 {

  // InvokeRequired required compares the thread ID of the

  // calling thread to the thread ID of the creating thread.

  // If these threads are different, it returns true.

 if (this.pictureBox1.InvokeRequired)

  {

    SetTextCallback d = new SetTextCallback(SetText);

    this.Invoke(d, new object[] { text });


  }

  else

    {

    this.pictureBox1.Location = new Point(769, Convert.ToInt32( text));

  }

 }

 private void textBox1_TextChanged(object sender, EventArgs e)
 {

}



}

Я получаю Y-образное изображение клиентского проигрывателя, и оно получает его, но каким-то образом оно не перемещается правильно, оно просто исчезает, когда получает Y-расположение, размер серверной программы n клиента и места одинаковые, поэтому она должна двигаться как зеркало

Это игра, которую я пытаюсь сделать левой - игрок1, а правая - игрок2

Мне также нужна помощь, чтобы узнать, как обновить положение мяча для обоих игроков и как я могу правильнореализовать мультиплеер, сейчас я пытаюсь медленно изменить простой клиентский код чата и получить нужные мне данные.но как я могу получать постоянные обновления игроков каждые 20 или 50 мс, я очень запутался.Заранее спасибо.

...