source: rc/puzzlebox_brainstorms_client_interface.py @ 29

Last change on this file since 29 was 29, checked in by sc, 12 years ago

client_interface:

  • mouse click handling added
  • Property svn:executable set to *
File size: 11.1 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3#
4# Puzzlebox - Brainstorms - Client Interface
5#
6# Copyright Puzzlebox Productions, LLC (2010)
7#
8# Portions of this code have been previously
9# released under the GNU Pulic License (GPL) version 2
10# and is Copyright Steven M. Castellotti (2010)
11# For more information please refer to http://www.gnu.org/copyleft/gpl.htm
12#
13# Last Update: 2010.02.03
14#
15#####################################################################
16
17import os, sys
18
19import pygame
20#import pygame.font
21import pygame.image
22import pygame.locals
23
24from twisted.internet import reactor, protocol, defer
25
26import puzzlebox_brainstorms_configuration as configuration
27import puzzlebox_brainstorms_client as client
28import puzzlebox_brainstorms_client_interface_component as component
29import puzzlebox_brainstorms_client_interface_button as interface_button
30#import puzzlebox_logger
31
32#####################################################################
33# Globals
34#####################################################################
35
36DEBUG = 1
37
38FLIP = 1
39
40SERVER_HOST = configuration.SERVER_HOST
41SERVER_PORT = configuration.SERVER_PORT
42
43DISPLAY_WINDOW_X_COORDINATE = configuration.DISPLAY_WINDOW_X_COORDINATE
44DISPLAY_WINDOW_Y_COORDINATE = configuration.DISPLAY_WINDOW_Y_COORDINATE
45DISPLAY_WINDOW_X_DIMENSION = configuration.DISPLAY_WINDOW_X_DIMENSION
46DISPLAY_WINDOW_Y_DIMENSION = configuration.DISPLAY_WINDOW_Y_DIMENSION
47
48WINDOW_BACKGROUND_COLOR = configuration.WINDOW_BACKGROUND_COLOR
49
50IMAGE_DIRECTORY = configuration.IMAGE_DIRECTORY
51
52BUTTON_LAYOUT = configuration.BUTTON_LAYOUT
53
54#####################################################################
55# Classes
56#####################################################################
57
58class puzzlebox_brainstorms_client_interface( \
59         component.puzzlebox_brainstorms_client_interface_component, \
60         client.puzzlebox_brainstorms_client):
61       
62        def __init__(self, log, \
63                     display_window_x_coordinate, \
64                     display_window_y_coordinate, \
65                     display_window_x_dimension, \
66                     display_window_y_dimension, \
67                     window_background_color, \
68                     DEBUG=DEBUG):
69       
70                self.log = log
71                self.DEBUG = DEBUG
72               
73                self.display_window_x_coordinate = display_window_x_coordinate
74                self.display_window_y_coordinate = display_window_y_coordinate
75                self.display_window_x_dimension = display_window_x_dimension
76                self.display_window_y_dimension = display_window_y_dimension
77                self.window_background_color = window_background_color
78               
79                self.server_host = configuration.SERVER_HOST
80                self.server_port = configuration.SERVER_PORT
81                self.max_connection_attempts = configuration.MAX_CONNECTION_ATTEMPTS
82               
83                if (os.name == "nt") or (os.name == "dos"):
84                        self.operating_system = "windows"
85                else:
86                        self.operating_system = os.name
87               
88                self.pygame = pygame
89                self.screen = None
90                self.FLIP = FLIP
91                self.image_directory = IMAGE_DIRECTORY
92               
93                self.initialize_pygame()
94               
95                self.pygame.FLIP = self.FLIP
96               
97                self.buttons = {}
98                self.match_key_index = {}
99               
100                self.initialize_buttons(BUTTON_LAYOUT)
101               
102                self.update_display()
103       
104       
105        #####################################################################
106       
107        def initialize_pygame(self):
108               
109                if (self.operating_system != "windows"):
110                        os.environ['SDL_VIDEO_WINDOW_POS'] = \
111                           "%i,%i" % (self.display_window_x_coordinate, \
112                                      self.display_window_y_coordinate)
113               
114                self.pygame.init()
115               
116                if (self.FLIP):
117                       
118                        self.screen = self.pygame.display.set_mode((self.display_window_x_dimension, \
119                                                                    self.display_window_y_dimension), \
120                                                                   pygame.HWSURFACE|pygame.DOUBLEBUF)
121               
122                else:
123                       
124                        self.screen = self.pygame.display.set_mode((self.display_window_x_dimension, \
125                                                                    self.display_window_y_dimension), \
126                                                                   pygame.HWSURFACE)
127               
128               
129                if (self.DEBUG >= 2):
130                        print "Display Driver:",
131                        print pygame.display.get_driver()
132                        print "Display Info:",
133                        print pygame.display.Info()
134                        #print "Get Flags:",
135                        #print pygame.display.screen.get_flags()
136               
137               
138                #self.pygame.mouse.set_visible(0)
139                self.pygame.mouse.set_visible(1)
140               
141               
142                self.pygame.display.set_caption('Puzzlebox Brainstorms - Client Interface')
143               
144                # Set Background
145                self.background = pygame.Surface(self.screen.get_size())
146                #self.background.set_alpha(0)
147                self.draw_background()
148       
149       
150        ##################################################################
151
152        def draw_background(self):
153               
154                self.background.fill(self.window_background_color)
155               
156                self.screen.blit(self.background, (0,0))
157       
158       
159        #####################################################################
160       
161        def initialize_buttons(self, button_layout):
162               
163                self.buttons = {}
164                self.match_key_index = {}
165               
166                for each in button_layout.keys():
167                       
168                        button = button_layout[each]
169                       
170                        if ((button['button_image'] != None) and \
171                            (button['button_image'] != '.') and \
172                            (button['button_image'] != '..') and \
173                            (os.path.exists(os.path.join(self.image_directory, button['button_image'])))):
174                               
175                                button_image_path = \
176                                   os.path.join(self.image_directory, button['button_image'])
177                       
178                        else:
179                                if self.DEBUG:
180                                        print "Error: Button image does not exist:"
181                                        print "   %s" % os.path.join(self.image_directory, button['button_image'])
182                                continue
183                       
184                       
185                        if ((button['activated_image'] != None) and \
186                            (button['activated_image'] != '.') and \
187                            (button['activated_image'] != '..') and \
188                            (os.path.exists(os.path.join(self.image_directory, button['activated_image'])))):
189                               
190                                activated_image_path = \
191                                   os.path.join(self.image_directory, button['activated_image'])
192                       
193                        else:
194                                if self.DEBUG:
195                                        print "Error: Activated button image does not exist:"
196                                        print "   %s" % os.path.join(self.image_directory, button['activated_image'])
197                                continue
198                       
199                       
200                        for match in button['match_keys']:
201                                self.match_key_index[match] = button['command']
202                       
203                       
204                        new_button = \
205                           interface_button.puzzlebox_brainstorms_client_interface_button( \
206                                   self.pygame, \
207                                   self.screen, \
208                                   button_image_path, \
209                                   activated_image_path, \
210                                   button['image_x'], \
211                                   button['image_y'], \
212                                   button['command'], \
213                                   button['match_keys'], \
214                                   self.DEBUG)
215                       
216                       
217                        self.buttons[ button['command'] ] = new_button
218       
219       
220        ##################################################################
221       
222        def update_button(self, command, activated):
223               
224                self.buttons[command].activated=activated
225                self.buttons[command].display()
226                self.update_display()
227       
228       
229        ##################################################################
230       
231        def process_mouse_click(self, position, mouse_button):
232               
233                if (mouse_button == 1):
234                        # first mouse button clicked
235                       
236                        postion_rect = self.pygame.Rect(position, (1,1) )
237                       
238                        for each in self.buttons.keys():
239                               
240                                if self.buttons[each].check_collision(postion_rect):
241                                       
242                                        command = self.buttons[each].command
243                                        self.update_button(command, activated=True)
244                                        self.send_command(command)
245       
246       
247        ##################################################################
248       
249        def process_mouse_release(self, position, mouse_button):
250               
251                if (mouse_button == 1):
252                        # first mouse button released
253                       
254                        postion_rect = self.pygame.Rect(position, (1,1) )
255                       
256                        for each in self.buttons.keys():
257                               
258                                if self.buttons[each].check_collision(postion_rect):
259                                       
260                                        command = self.buttons[each].command
261                                        self.update_button(command, activated=False)
262       
263       
264        ##################################################################
265       
266        def release_all_buttons(self):
267               
268                for each in self.buttons.keys():
269                               
270                                command = self.buttons[each].command
271                                self.update_button(command, activated=False)
272       
273       
274        ##################################################################
275       
276        def check_events(self):
277               
278                for event in self.pygame.event.get():
279                       
280                        if (event.type is self.pygame.locals.QUIT):
281                                reactor.stop()
282                       
283                       
284                        elif (event.type == self.pygame.locals.KEYDOWN):
285                               
286                                if 'key' in event.dict.keys():
287                                       
288                                        key_pressed = event.dict['key']
289                                       
290                                        if (key_pressed == self.pygame.K_ESCAPE):
291                                                reactor.stop()
292                                       
293                                       
294                                        elif (key_pressed in self.match_key_index.keys()):
295                                               
296                                                # keypress matches recognized key
297                                                command = self.match_key_index[key_pressed]
298                                                self.update_button(command, activated=True)
299                                                self.send_command(command)
300                       
301                       
302                        elif (event.type == self.pygame.locals.KEYUP):
303                               
304                                if 'key' in event.dict.keys():
305                                       
306                                        key_pressed = event.dict['key']
307                                       
308                                        if (key_pressed in self.match_key_index.keys()):
309                                               
310                                                # keypress matches recognized key
311                                                command = self.match_key_index[key_pressed]
312                                                self.update_button(command, activated=False)
313                       
314                       
315                        elif (event.type == self.pygame.locals.MOUSEBUTTONDOWN):
316                               
317                                position = event.pos
318                                mouse_button = event.button
319                               
320                                self.process_mouse_click(position, mouse_button)
321                       
322                       
323                        elif (event.type == self.pygame.locals.MOUSEBUTTONUP):
324                               
325                                mouse_button = event.button
326                               
327                                if (mouse_button == 1):
328                                        # First mouse button released
329                                        self.release_all_buttons()
330                       
331                       
332                        else:
333                               
334                                if self.DEBUG > 2:
335                                        print "Unrecognized event:",
336                                        print event
337               
338               
339                # Sleep timer provides approximately 33.3 fps
340                reactor.callLater(0.03, self.check_events)
341
342
343#####################################################################
344# Functions
345#####################################################################
346
347#####################################################################
348# Main
349#####################################################################
350
351if __name__ == '__main__':
352       
353        #log = puzzlebox_logger.puzzlebox_logger(logfile='mcc')
354        log = None
355       
356       
357        # Collect default settings and command line parameters
358        server_host = SERVER_HOST
359        server_port = SERVER_PORT
360        display_window_x_coordinate = DISPLAY_WINDOW_X_COORDINATE
361        display_window_y_coordinate = DISPLAY_WINDOW_Y_COORDINATE
362        display_window_x_dimension = DISPLAY_WINDOW_X_DIMENSION
363        display_window_y_dimension = DISPLAY_WINDOW_Y_DIMENSION
364        window_background_color = WINDOW_BACKGROUND_COLOR
365       
366       
367        for each in sys.argv:
368               
369                if each.startswith("--host="):
370                        server_host = each[ len("--host="): ]
371                if each.startswith("--port="):
372                        server_port = each[ len("--port="): ]
373       
374       
375        # Window Defaults
376        try:
377                display_window_x_coordinate = string.atoi(sys.argv[-4])
378                display_window_y_coordinate = string.atoi(sys.argv[-3])
379                display_window_x_dimension = string.atoi(sys.argv[-2])
380                display_window_y_dimension = string.atoi(sys.argv[-1])
381        except:
382                if DEBUG:
383                        print "Using default display coordinates"
384       
385       
386        interface = puzzlebox_brainstorms_client_interface( \
387                                             log, \
388                                             display_window_x_coordinate, \
389                                             display_window_y_coordinate, \
390                                             display_window_x_dimension, \
391                                             display_window_y_dimension, \
392                                             window_background_color, \
393                                             DEBUG=DEBUG)
394       
395        reactor.callWhenRunning(interface.check_events)
396        reactor.run()
397
Note: See TracBrowser for help on using the repository browser.