#!/usr/bin/perl -w
use strict;
use Socket;
use IO::Socket;
use Tk;
#This program sends UDP packets on port 9628 which the astute will not
+ice
#spells out "WMBT" on any common telephone keypad.
my $y=0; #Y position of the paddle.
my $dir=0; #Direction the paddle should move.
my @ballstat= (0,0,0,0); #(X,Y,dx,dy)
my $ball = <<'END_OF_BALL_DATA';
/* XPM */
static char * BALL_xpm[] = {
"10 10 1 1",
"W c #FFFFFFFFFFFF",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW"};
END_OF_BALL_DATA
my $paddle = <<'END_OF_PIXMAP_DATA';
/* XPM */d
static char * PADDLE_xpm[] = {
"10 80 1 1",
"W c #FFFFFFFFFFFF",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW",
"WWWWWWWWWW"};
END_OF_PIXMAP_DATA
my ($him, $width, $height, $multiplier, $left, $player);
#Set this to 0 for the left/starting side, 1 for the right, receiving
+side.
$left = 0;
#CHANGE this if the monitors have different resolutions. Multiplier s
+hould
#be (Height of this monitor) / (Height of other monitor) For me, on th
+is
#machine, that's 1.36. The other machine should be set to 1.0.
$multiplier = 1.0;
#Set this to the IP address of the other machine.
$player = "192.168.0.1";
socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname("udp"));
my $server = IO::Socket::INET->new(LocalPort => 9628,
Proto => "udp")
or die "Couldn't be a udp server on port 9628 : $@\n";
my $pw = MainWindow->new(-background=>"#FFFFFF");
my $bw = MainWindow->new(-background=>"#FFFFFF");
$width = $pw->screenwidth;
$height = $pw->screenheight;
print("I read a resolution of $width x $height\n");
$pw->Label(-image => $pw->Pixmap(-data => $paddle))->pack;
$bw->Label(-image => $bw->Pixmap(-data => $ball))->pack;
$pw->overrideredirect(1);
$bw->overrideredirect(1);
if ($left) {$bw->withdraw();}
else {
@ballstat=($width/2,$height/2,5,3);
}
while(1){
select(undef,undef,undef,.02); #The poor man's HiRes sleep timer.
if($y==0) {$dir++;$y+=3;}
if($y==$height-40) {$dir--;$y-=3;}
if($ballstat[1]+5>$y+40) {$y+=3;} else {$y-=3;}
if($ballstat[1]<=0){$ballstat[3]*=-1;}
if($ballstat[1]>=$height-20){$ballstat[3]*=-1;}
if(($left)&&($ballstat[0]<=0)) {
&send_and_receive();
}
if(!($left)&&($ballstat[0]>=$width-10)) {
&send_and_receive();
}
if (($left) && ($ballstat[0]>=$width-10)){$ballstat[2]*=-1;}
if (!($left) && ($ballstat[0]<=0)){$ballstat[2]*=-1;}
$ballstat[0]+=$ballstat[2];
$ballstat[1]+=$ballstat[3];
$pw->geometry("+".(($width-10)*$left)."+$y");
$bw->geometry("+".$ballstat[0]."+".$ballstat[1]);
$pw->update;
$bw->update;
}
sub send_and_receive {
$ballstat[1] /= $multiplier; #Differences in resolution;
$ballstat[1]%=$height;
if ($ballstat[3]<0) {
$ballstat[1]-=(2*$ballstat[1]);
}
send(SOCKET, $ballstat[1], 0, sockaddr_in(9628,inet_aton("$player"))
+) == length (
$ballstat[1])
or die "Can't send the UDP packet!\n$!\n";
$bw->withdraw();
$ballstat[2] = 0;
$ballstat[3] = 0;
while ($him = $server->recv($ballstat[1], 4, 0)) {
print "@ballstat $ballstat[1] received!\n";
$ballstat[1]*=$multiplier; #Because of differences in resolution.
+ :-P
if ($ballstat[1] > $height) {
$ballstat[1] = $height;
}
if ($left) {$ballstat[2]=5;}
else {$ballstat[2]=-5;}
$ballstat[3]=3;
if ($ballstat[1]<0) {
$ballstat[1]-=(2*$ballstat[1]);
$ballstat[3]*=-1;
}
$ballstat[1]%=$height;
$bw->deiconify();
$bw->raise();
last;
}
}
|