I'm making a pong clone for Windows Phone 7 and I'd love to add a multiplayer option. I've been trying to use this Ricky Tan's tutorial:
The problem is it is designed around the platformer example which has several classes such as Player, Level and Game whereas my game takes place in a single Game class with much less logic for player movements.
I've tried putting my handleInput() inside the Channel_PacketsReceived method but there's still no connection between devices. I've been at this for days and I can't get it. Is there something I'm missing? I'd love some help with this or if anyone knows a more straight forward tutorial with things happening in the same class.
Also if it matters my game includes the gsm example.
//Sockets
private UdpAnySourceMulticastChannel Channel;
private Vector2 oldPosition;
int identifier;
public void HandleInput(int id, Vector2 position)
{
TouchCollection touchCollection = TouchPanel.GetState();
foreach (TouchLocation touchLocation in touchCollection)
{
// upper left corner touche detection
if (touchLocation.Position.Y < 400)
{
if (touchLocation.Position.X < blueBar.X && touchLocation.Position.Y < 400)
{
blueBar.X -= 30;
}
else if (touchLocation.Position.X > blueBar.X + 128 && touchLocation.Position.Y < 400)
{
blueBar.X += 30;
}
else if (touchLocation.Position.X > blueBar.X && touchLocation.Position.X < blueBar.X + 128 && touchLocation.Position.Y < 400)
blueBar.X = (int)touchLocation.Position.X - 64;
}
BlueSaber.X = blueBar.X;
// upper right corner touche detection
if (touchLocation.Position.Y > 400)
{
if (touchLocation.Position.X < redBar.X && touchLocation.Position.Y > 400)
{
redBar.X -= 30;
}
else if (touchLocation.Position.X > redBar.X + 128 && touchLocation.Position.Y > 400)
{
redBar.X += 30;
}
else if (touchLocation.Position.X > redBar.X && touchLocation.Position.X < redBar.X + 128 && touchLocation.Position.Y > 400)
redBar.X = (int)touchLocation.Position.X - 64;
}
RedSaber.X = redBar.X;
if (touchLocation.Position.X > start.X &&
touchLocation.Position.X < start.X + start.Width &&
touchLocation.Position.Y > start.Y &&
touchLocation.Position.Y < start.Y + start.Height)
{
play = true;
touches++;
if (redServe)
{
// default velocity
Random rand = new Random();
// randomize the ball orientation
switch (rand.Next(2))
{
case 0: ballVelocity.Y = -speed1; ballVelocity.X = speed1; break;
case 1: ballVelocity.Y = -speed1; ballVelocity.X = -speed1; break;
}
}
else if (!redServe)
{
// default velocity
Random rand = new Random();
// randomize the ball orientation
switch (rand.Next(2))
{
case 0: ballVelocity.Y = speed1; ballVelocity.X = speed1; break;
case 1: ballVelocity.Y = speed1; ballVelocity.X = -speed1; break;
}
}
}
}
}
// Outside of update method
private void InitializeSockets()
{
this.Channel = new UdpAnySourceMulticastChannel(IPAddress.Parse("224.109.108.107"), 3007);
this.Channel.PacketReceived += new EventHandler<UdpPacketReceivedEventArgs>(Channel_PacketReceived);
this.Channel.Open();
}
void Channel_PacketReceived(object sender, UdpPacketReceivedEventArgs e)
{
string data = e.Message;
Console.WriteLine(data);
string[] pos = data.Split(',');
//Discard packets that do not match
if (pos.Length != 5)
{
return;
}
try
{
if (pos[0] != identifier.ToString()) //if not originated from this phone
{
Vector2 position = new Vector2(float.Parse(pos[1]), float.Parse(pos[2]));
Vector2 velocity = new Vector2(float.Parse(pos[3]), float.Parse(pos[4]));
// UpdateOtherPlayer(int.Parse(pos[0]), position);
HandleInput(int.Parse(pos[0]), position);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine("Caught unexpected exception: " + ex.Message);
}
}
private void SendPosition(string position)
{
if (redBar.X != oldPosition.X)
{
oldPosition.X = redBar.X;
this.Channel.Send(position);
}
}
and i am calling the SendPosition method inside of update