# Filename: A08_multiplayer_demo_client.py
# Written by: James D. Miller
import sys, os
import pygame
# PyGame Constants
from pygame.locals import *
from pygame.color import THECOLORS
# Network stuff. Note "connection" is a single instantiation.
from PodSixNet.Connection import connection, ConnectionListener
# Argument parsing...
import argparse
#=======================================================================
# Classes
#=======================================================================
class NetworkListener(ConnectionListener):
def __init__(self, (host, port)):
self.Connect((host, port))
self.client_colors = {'C1': THECOLORS["green"], 'C2': THECOLORS["tan"],'C3': THECOLORS["black"],'C4': THECOLORS["blue"],
'C5': THECOLORS["pink"], 'C6': THECOLORS["red"],'C7': THECOLORS["coral"],'C8': THECOLORS["orangered1"],
'C9': THECOLORS["grey80"],'C10': THECOLORS["rosybrown3"]}
self.background_color = THECOLORS["white"]
self.client_name = 'C0'
self.client_color = THECOLORS["black"]
def Network_hello(self, data):
global Player_ID, user_state
print "Network_hello:", data
Player_ID = data['P_ID']
self.client_name = 'C' + str(Player_ID)
self.background_color = THECOLORS["yellow"]
self.client_color = self.client_colors[self.client_name]
# Initialize user state dictionary.
user_state = {'action': 'CN',
'ID': Player_ID,
'mouseXY':(0,0), 'mouseB1':'U',
'a':'U', 's':'U',
'd':'U', 'w':'U'}
pygame.display.set_caption("Client: GamePad #" + str(Player_ID))
#=======================================================================
# Functions
#=======================================================================
def signoff(user_state):
sys.exit()
def checkforUserInput(user_state):
# Check the button status.
(button1, button2, button3) = pygame.mouse.get_pressed()
# Get all the events since the last call to get().
for event in pygame.event.get():
if (event.type == pygame.QUIT):
signoff(user_state)
elif (event.type == pygame.KEYDOWN):
if (event.key == K_ESCAPE):
signoff(user_state)
elif (event.key==K_c):
client_display.fill(THECOLORS["blue"])
elif (event.key==K_1):
return 1
elif (event.key==K_2):
return 2
elif (event.key==K_3):
return 3
elif (event.key==K_a):
user_state['a'] = 'D'
elif (event.key==K_s):
user_state['s'] = 'D'
elif (event.key==K_d):
user_state['d'] = 'D'
elif (event.key==K_w):
user_state['w'] = 'D'
elif (event.type == pygame.KEYUP):
if (event.key==K_a):
user_state['a'] = 'U'
elif (event.key==K_s):
user_state['s'] = 'U'
elif (event.key==K_d):
user_state['d'] = 'U'
elif (event.key==K_w):
user_state['w'] = 'U'
elif event.type == pygame.MOUSEBUTTONDOWN:
user_state['mouseB1'] = 'D'
elif event.type == pygame.MOUSEBUTTONUP:
user_state['mouseB1'] = 'U'
# cursor x,y
user_state['mouseXY'] = pygame.mouse.get_pos()
#=======================================================================
# Main program statements
#=======================================================================
pygame.init()
client_display = pygame.display.set_mode((600,400))
# Instantiate clock to help control the framerate.
client_clock = pygame.time.Clock()
# Background color of the game pad.
client_display.fill(THECOLORS["grey"])
# Font object for rendering text onto display surface.
fnt = pygame.font.SysFont("Arial", 14)
Player_ID = 0
parser = argparse.ArgumentParser(description='Input client parameters.')
# Example IP address used here; edit this line.
parser.add_argument('serverIP', type=str, nargs='?', default="138.236.65.69")
args = parser.parse_args()
print "args:", args.serverIP
# Initialize the state dictionary
user_state = {}
# Note, the connection can take place in the NetworkListener or here.
# This "connection" is an instatiation of the EndPoint class that is done in the Connection.py file.
# Note, if you do this here, you have to call the "DoConnect" method, not the "Connect" method that
# is indicated on the web site.
#connection.DoConnect((args.serverIP, 4330))
network_listener = NetworkListener((args.serverIP, 4330))
framerate_limit = 100
flip_timer = 0.0
while True:
dt_s = float(client_clock.tick(framerate_limit) * 1e-3)
#client_clock.tick(framerate_limit)
connection.Pump()
network_listener.Pump()
checkforUserInput(user_state)
if Player_ID != 0:
#print "user_state", user_state
connection.Send(user_state)
flip_timer += dt_s
if (flip_timer > 0.2):
# Background
client_display.fill( network_listener.background_color)
# Small rectangle to illustrate the client color that will appear on the server screen.
pygame.draw.rect(client_display, network_listener.client_color, pygame.Rect(50, 50, 60, 20), 3)
# Small background rectangle for text
pygame.draw.rect(client_display, THECOLORS["black"], pygame.Rect(150, 50, 35, 20))
# Text to be displayed
fps_string = "%.0f" % client_clock.get_fps()
txt_surface = fnt.render(fps_string, True, THECOLORS["white"])
client_display.blit(txt_surface, [158, 51])
pygame.display.flip()
flip_timer = 0.0