def renderFrame(self): if not self.screen: self.screen = Screen() self.screen.drawThis( self.titleBGImg ) selectionBox = UIImage("box.png", pos=self.UI[self.selected].pos, size=[(self.res[0]*0.05)*10, self.res[1]*0.05]) selectionBox.center() self.screen.drawThis( selectionBox ) for uiObj in self.UI.values(): # draw the background image firstly self.screen.drawThis( uiObj ) return self
def __init__(self, rect: Rect, color: Optional[Color], sock, connection_list, receive_list, parent_conn, child_conn, send_process, nicks): mod_loader.import_mods() super().__init__(rect, color) fps_font = Font('assets/fonts/arial.ttf', 20) sub_elem = UIElement(Rect(50, 50, 50, 50), None) sub_elem.append_child(FPSCounter(Rect(50, 50, 0, 0), fps_font)) self.append_child(sub_elem) self.sock = sock self.connection_list = connection_list self.receive_list = receive_list self.child_conn = child_conn self.parent_conn = parent_conn self.send_process = send_process self.game = Game(Game.Side.SERVER, mod_loader, self.parent_conn, nicks, -1, connection_list=self.connection_list) self.minimap_elem = UIImage( Rect(0, config['screen']['size'][1] - 388, 0, 0), 'assets/sprite/minimap.png') self.minimap = Minimap(self.game) self.minimap_elem.append_child(self.minimap) self.append_child(self.minimap_elem) self.game.create_unit('warrior', (0, 0)) self.game.create_unit('fortress', (500, 0)) self.game.create_unit('fortress', (-500, 0)) self.game.create_unit('archer', (-25, -25)) self.game.create_unit('archer', (25, -25)) self.game.create_unit('archer', (-25, 25)) self.game.create_unit('archer', (25, 25))
def set_selected(self, unit): i = 0 self.childs.clear() for name in unit.cls_dict['valid_types']: entity = self.game.mod_loader.entities[name] self.units[name] = ProduceMenu.ProduceMenuItem(name, entity, self.game) btn = UIButton(Rect(150, i * 30 + 15, 25, 25), None, self.select, name) btn.append_child(UIImage(Rect((0, 0), btn.relative_bounds.size), None, self.units[name].icon)) self.append_child(btn) i += 1 self.selected_unit = unit.unit_id
def renderFrame(self): """ RenderFrame - Base Class """ Screen().drawThis( self.titleBGImg ) Screen().drawThis( self.entryBox ) Screen().drawThis( self.keysBox ) selectionBox = UIImage("box.png", pos=self.UI[self.selected].pos, size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2]) selectionBox.center() Screen().drawThis( selectionBox ) for uiObj in self.UI.values(): # draw the background image firstly Screen().drawThis( uiObj ) for letter in self.screenKeys.values(): Screen().drawThis( letter ) return self
def __init__(self, rect: Rect, color: Optional[Color], sock, receive_list, socket_process, parent_conn, child_conn, send_process, nicks, team_id): super().__init__(rect, color) self.sock = sock self.receive_list = receive_list self.socket_process = socket_process self.parent_conn = parent_conn self.child_conn = child_conn self.send_process = send_process mod_loader.import_mods() config.reload() fps_font = Font('assets/fonts/arial.ttf', 20) sub_elem = UIElement(Rect(50, 50, 50, 50), None) sub_elem.append_child(FPSCounter(Rect(50, 50, 0, 0), fps_font)) self.append_child(sub_elem) self.game = Game(Game.Side.CLIENT, mod_loader, self.parent_conn, nicks, team_id) self.minimap = Minimap(self.game) self.minimap_elem = UIImage( Rect(0, config['screen']['size'][1] - 388, 0, 0), 'assets/sprite/minimap.png') self.minimap_elem.append_child(self.minimap) self.minimap_elem.append_child( ResourceMenu(self.game.current_player, Rect(45, 108, 0, 0), Font('assets/fonts/arial.ttf', 25))) menu_parent = UIElement(Rect(0, 0, 0, 0), None) self.append_child(menu_parent) menu_parent.append_child(self.minimap_elem) menu_parent.append_child(BuildMenu(self.relative_bounds, self.game)) menu_parent.append_child(ProduceMenu(self.relative_bounds, self.game))
def __init__(self, bounds, game): super().__init__(bounds, None) self.selected = None self.game = game self.buildings = {} i = 0 for name, entity in self.game.mod_loader.entities.items(): if 'buildable' in entity['tags']: self.buildings[name] = BuildMenu.BuildMenuItem(name, entity, game) btn = UIButton(Rect(0, i * 55 + 15, 50, 50), None, self.select, name) btn.append_child(UIImage(Rect((0, 0), btn.relative_bounds.size), None, self.buildings[name].icon)) self.append_child(btn) i += 1
def __init__(self, rect: Rect, color: Optional[Color]): super().__init__(rect, color) self.main = None self.font = Font('assets/fonts/arial.ttf', 20) self.append_child( FPSCounter(Rect(0, 0, 0, 0), self.font, absolute_anchor=Anchor.TOP_RIGHT, relative_anchor=Anchor.TOP_RIGHT)) self.append_child( DialogWindow(Rect(0, 57, 1750, 787), Color('azure'), relative_anchor=Anchor.TOP_CENTER, absolute_anchor=Anchor.TOP_CENTER)) self.append_child( UIImage(self.absolute_bounds.copy(), 'assets/images/screen.png'))
def __init__(self, engine): """ The game determines what is happening on screen based on what state the GameEngine instance has. """ self.engine = engine self.res = self.engine.setsMgr.screenRes res = self.res # get/load the font self.font = FontManager().loadFont( 'Basic' ) self.UI = {} self.UI['waiting'] = UIText("Waiting" , pos=[res[0]*0.5, res[1]*0.3], font=self.font, scale=0.04) self.UI['waiting'].center() self.UI['for'] = UIText("For" , pos=[res[0]*0.5, res[1]*0.5], font=self.font, scale=0.04) self.UI['for'].center() self.UI['players'] = UIText("Players" , pos=[res[0]*0.5, res[1]*0.7], font=self.font, scale=0.04) self.UI['players'].center() self.UI['back'] = UIText("Back"\ , pos=[res[0]*0.5, res[1]*0.9], font=self.font, scale=0.04) self.UI['back'].center() self.selectionBox = UIImage( "box.png"\ , pos=self.UI['back'].pos , size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2] ) self.selectionBox.center() self.titleBGImg = UIImage("TitleScreenBG.png"\ , pos=[0,0], size=res) glutTimerFunc(50, self.engine.on_update, 50)
def renderFrame(self): """ RenderFrame - Base Class """ Screen().drawThis( self.titleBGImg ) playerChoiceBox = UIImage( "box.png"\ , pos=self.UI[self.plChoice].pos , size=[self.res[0]*0.42, self.res[1]*0.42] ) playerChoiceBox.center() Screen().drawThis( playerChoiceBox ) selectionBox = UIImage( "box.png"\ , pos=self.UI[self.selected].pos , size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2] ) selectionBox.center() Screen().drawThis( selectionBox ) for uiObj in self.UI.values(): Screen().drawThis( uiObj ) return self
class ServerGameWindow(UIElement): def __init__(self, rect: Rect, color: Optional[Color], sock, connection_list, receive_list, parent_conn, child_conn, send_process, nicks): mod_loader.import_mods() super().__init__(rect, color) fps_font = Font('assets/fonts/arial.ttf', 20) sub_elem = UIElement(Rect(50, 50, 50, 50), None) sub_elem.append_child(FPSCounter(Rect(50, 50, 0, 0), fps_font)) self.append_child(sub_elem) self.sock = sock self.connection_list = connection_list self.receive_list = receive_list self.child_conn = child_conn self.parent_conn = parent_conn self.send_process = send_process self.game = Game(Game.Side.SERVER, mod_loader, self.parent_conn, nicks, -1, connection_list=self.connection_list) self.minimap_elem = UIImage( Rect(0, config['screen']['size'][1] - 388, 0, 0), 'assets/sprite/minimap.png') self.minimap = Minimap(self.game) self.minimap_elem.append_child(self.minimap) self.append_child(self.minimap_elem) self.game.create_unit('warrior', (0, 0)) self.game.create_unit('fortress', (500, 0)) self.game.create_unit('fortress', (-500, 0)) self.game.create_unit('archer', (-25, -25)) self.game.create_unit('archer', (25, -25)) self.game.create_unit('archer', (-25, 25)) self.game.create_unit('archer', (25, 25)) def update(self, event): self.game.update(event) if event.type == EVENT_UPDATE: while self.receive_list: sender, command = self.receive_list.pop(0) self.game.handle_command(command[0], command[1:], sender=sender) return super().update(event) def draw(self, screen): super().draw(screen) self.game.draw(screen) def shutdown(self): print('Shutdown') self.send_process.terminate() self.parent_conn.close() self.sock.close()
class ClientGameWindow(UIElement): def __init__(self, rect: Rect, color: Optional[Color], sock, receive_list, socket_process, parent_conn, child_conn, send_process, nicks, team_id): super().__init__(rect, color) self.sock = sock self.receive_list = receive_list self.socket_process = socket_process self.parent_conn = parent_conn self.child_conn = child_conn self.send_process = send_process mod_loader.import_mods() config.reload() fps_font = Font('assets/fonts/arial.ttf', 20) sub_elem = UIElement(Rect(50, 50, 50, 50), None) sub_elem.append_child(FPSCounter(Rect(50, 50, 0, 0), fps_font)) self.append_child(sub_elem) self.game = Game(Game.Side.CLIENT, mod_loader, self.parent_conn, nicks, team_id) self.minimap = Minimap(self.game) self.minimap_elem = UIImage( Rect(0, config['screen']['size'][1] - 388, 0, 0), 'assets/sprite/minimap.png') self.minimap_elem.append_child(self.minimap) self.minimap_elem.append_child( ResourceMenu(self.game.current_player, Rect(45, 108, 0, 0), Font('assets/fonts/arial.ttf', 25))) menu_parent = UIElement(Rect(0, 0, 0, 0), None) self.append_child(menu_parent) menu_parent.append_child(self.minimap_elem) menu_parent.append_child(BuildMenu(self.relative_bounds, self.game)) menu_parent.append_child(ProduceMenu(self.relative_bounds, self.game)) def update(self, event): self.game.update(event) if event.type == EVENT_UPDATE: while self.receive_list: args = self.receive_list.pop(0) self.game.handle_command(args[0], args[1:]) return super().update(event) def draw(self, screen): super().draw(screen) self.game.draw(screen) def shutdown(self): self.sock.close() self.send_process.terminate() self.socket_process.terminate() self.parent_conn.close() self.child_conn.close() print('Closed')
class WaitingForPlayersState(EngineState): def __init__(self, engine): """ The game determines what is happening on screen based on what state the GameEngine instance has. """ self.engine = engine self.res = self.engine.setsMgr.screenRes res = self.res # get/load the font self.font = FontManager().loadFont( 'Basic' ) self.UI = {} self.UI['waiting'] = UIText("Waiting" , pos=[res[0]*0.5, res[1]*0.3], font=self.font, scale=0.04) self.UI['waiting'].center() self.UI['for'] = UIText("For" , pos=[res[0]*0.5, res[1]*0.5], font=self.font, scale=0.04) self.UI['for'].center() self.UI['players'] = UIText("Players" , pos=[res[0]*0.5, res[1]*0.7], font=self.font, scale=0.04) self.UI['players'].center() self.UI['back'] = UIText("Back"\ , pos=[res[0]*0.5, res[1]*0.9], font=self.font, scale=0.04) self.UI['back'].center() self.selectionBox = UIImage( "box.png"\ , pos=self.UI['back'].pos , size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2] ) self.selectionBox.center() self.titleBGImg = UIImage("TitleScreenBG.png"\ , pos=[0,0], size=res) glutTimerFunc(50, self.engine.on_update, 50) def renderFrame(self): """ RenderFrame - Base Class """ Screen().drawThis( self.titleBGImg ) Screen().drawThis( self.selectionBox ) for uiObj in self.UI.values(): Screen().drawThis( uiObj ) return self def update(self, elapsed): """ """ # go to the next state if len( self.engine.gameWorld.peers ) > 0: return GameState(self.engine) else: return self def on_key_press(self, key, x, y): """ On key press """ if key == chr(27): # Escape return ChoosePlayerState(self.engine) return self def on_mouse(self, button, state, x, y): """ On mouse press/release """ if self.UI['back'].CollidePoint( (x,y) ): return ChoosePlayerState(self.engine) return self def on_socket(self, elapsed): """ On socket """ return self def Step(self): """ Step """ pass
def __init__(self, engine): """ The game determines what is happening on screen based on what state the GameEngine instance has. """ self.engine = engine self.screen = Screen() self.res = self.engine.setsMgr.screenRes res = self.res # typing 'self.res' was making lines too long. :P # get/load the font self.font = FontManager().loadFont( 'Basic' ) # screen objects self.UI = {} self.UI['title'] = UIText("Start a Server"\ , pos=[res[0]*.01,res[1]*.10], font=self.font, scale=0.05) self.UI['server_name'] = UIText("Server Name"\ , [res[0]*0.3, res[1]*0.2], self.font, 0.034) self.UI['text_entry'] = UIText(self.engine.serverName\ , [res[0]*0.5, res[1]*0.3], self.font, 0.047) self.UI['text_entry'].center() self.UI['backspace'] = UIText("BKSP"\ , [res[0]*0.24, res[1]*0.74], self.font, 0.031) self.UI['space'] = UIText("SPACE"\ , [res[0]*0.6, res[1]*0.74], self.font, 0.031) self.UI['back'] = UIText("Back"\ , pos=[res[0]*0.1, res[1]*0.9], font=self.font, scale=0.031) self.UI['back'].center() self.UI['create'] = UIText("Create"\ , pos=[res[0]*0.9, res[1]*0.9], font=self.font, scale=0.031) self.UI['create'].center() self.selected = 'create' self.titleBGImg = UIImage("TitleScreenBG.png", pos=[0,0], size=res) self.entryBox = UIImage("box.png", pos=[res[0]*0.5, res[1]*0.3], size=[(0.03*res[0])*12, 0.05*res[1]]) self.entryBox.center() # This is the text input that currently has focus; # the default is text_entry self.hasFocus = self.UI['text_entry'] self.ServerNameMax = 12 # Here, a hash is created containing a UIText for each letter # in the alphabet. # They are spaced and stacked on the screen so that they lie # in 3 rows of 8, 9, and 9 letters each. self.screenKeys = {} lettPos = [res[0]*0.32, res[1]*0.45] lettersToAdd = 8 lettScale = 0.04 for letter in map(chr, range(65, 91)): # add the letter to the hash self.screenKeys[letter] = UIText(letter, [lettPos[0], lettPos[1]], self.font, lettScale) # This denotes that the last letter in the row has been added # if lettersToAdd == 1: lettersToAdd = 9 # the subsequent rows all have 9 letters lettPos[0] = res[0]*0.3 # reset the x pos (slightly less ^\ ) lettPos[1] += lettScale+(lettScale*res[0]) # increment the y pos else: lettersToAdd -= 1 # decrement the counter lettPos[0] += lettScale+(lettScale*res[0]) # increment the x pos self.keysBox = UIImage("box.png", pos=self.screenKeys['N'].pos\ , size=[ (lettScale*res[0])*10, (lettScale*res[1])*6 ]) self.keysBox.center()
class CreateServerState(EngineState): def __init__(self, engine): """ The game determines what is happening on screen based on what state the GameEngine instance has. """ self.engine = engine self.screen = Screen() self.res = self.engine.setsMgr.screenRes res = self.res # typing 'self.res' was making lines too long. :P # get/load the font self.font = FontManager().loadFont( 'Basic' ) # screen objects self.UI = {} self.UI['title'] = UIText("Start a Server"\ , pos=[res[0]*.01,res[1]*.10], font=self.font, scale=0.05) self.UI['server_name'] = UIText("Server Name"\ , [res[0]*0.3, res[1]*0.2], self.font, 0.034) self.UI['text_entry'] = UIText(self.engine.serverName\ , [res[0]*0.5, res[1]*0.3], self.font, 0.047) self.UI['text_entry'].center() self.UI['backspace'] = UIText("BKSP"\ , [res[0]*0.24, res[1]*0.74], self.font, 0.031) self.UI['space'] = UIText("SPACE"\ , [res[0]*0.6, res[1]*0.74], self.font, 0.031) self.UI['back'] = UIText("Back"\ , pos=[res[0]*0.1, res[1]*0.9], font=self.font, scale=0.031) self.UI['back'].center() self.UI['create'] = UIText("Create"\ , pos=[res[0]*0.9, res[1]*0.9], font=self.font, scale=0.031) self.UI['create'].center() self.selected = 'create' self.titleBGImg = UIImage("TitleScreenBG.png", pos=[0,0], size=res) self.entryBox = UIImage("box.png", pos=[res[0]*0.5, res[1]*0.3], size=[(0.03*res[0])*12, 0.05*res[1]]) self.entryBox.center() # This is the text input that currently has focus; # the default is text_entry self.hasFocus = self.UI['text_entry'] self.ServerNameMax = 12 # Here, a hash is created containing a UIText for each letter # in the alphabet. # They are spaced and stacked on the screen so that they lie # in 3 rows of 8, 9, and 9 letters each. self.screenKeys = {} lettPos = [res[0]*0.32, res[1]*0.45] lettersToAdd = 8 lettScale = 0.04 for letter in map(chr, range(65, 91)): # add the letter to the hash self.screenKeys[letter] = UIText(letter, [lettPos[0], lettPos[1]], self.font, lettScale) # This denotes that the last letter in the row has been added # if lettersToAdd == 1: lettersToAdd = 9 # the subsequent rows all have 9 letters lettPos[0] = res[0]*0.3 # reset the x pos (slightly less ^\ ) lettPos[1] += lettScale+(lettScale*res[0]) # increment the y pos else: lettersToAdd -= 1 # decrement the counter lettPos[0] += lettScale+(lettScale*res[0]) # increment the x pos self.keysBox = UIImage("box.png", pos=self.screenKeys['N'].pos\ , size=[ (lettScale*res[0])*10, (lettScale*res[1])*6 ]) self.keysBox.center() def createServer( self ): """ for the sake of code reuse """ if system() == "Linux" or system() == "Macintosh": Popen( [r'/usr/bin/python2.7' ,os.path.join( self.engine.setsMgr.home_dir , 'StartServer.py' )] ) elif system() == "Windows": Popen([r'C:\Python27\python.exe' ,os.path.join( self.engine.setsMgr.home_dir , 'StartServer.py' )]) else: print "you are on an unsupported platform for spawning a server" # declare that this game instance is the server owner self.engine.serverOwner = True self.engine.serverName = self.UI['text_entry'].getText() return ChoosePlayerState(self.engine) def renderFrame(self): """ RenderFrame - Base Class """ #screen = Screen() Screen().drawThis( self.titleBGImg ) Screen().drawThis( self.entryBox ) Screen().drawThis( self.keysBox ) selectionBox = UIImage("box.png", pos=self.UI[self.selected].pos, size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2]) selectionBox.center() Screen().drawThis( selectionBox ) for scrObj in self.UI.values(): Screen().drawThis( scrObj ) for letter in self.screenKeys.values(): Screen().drawThis( letter ) return self def on_key_press(self, key, x, y): """ On key press """ # Esc if key == chr(27): # Escape return TitleScreenState(self.engine) # Enter elif key == chr(13): if self.selected == "back": return TitleScreenState(self.engine) elif self.selected == "create": return self.createServer() # Arrow keys elif key >= 100 and key <= 103: if self.selected == "back": self.selected = "create" elif self.selected == "create": self.selected = "back" elif self.hasFocus != None: if key == chr(32): # Space Bar if len(self.hasFocus.getText()) < self.ServerNameMax: self.hasFocus.push(" ") if key == chr(8) or key == chr(127): # BS or Del self.hasFocus.pop() if key.isalpha() or key.isdigit(): # letter/numbers if len(self.hasFocus.getText()) < self.ServerNameMax: self.hasFocus.push(key) return self def on_mouse_motion(self, x, y): """ On mouse motion """ if self.UI['back'].CollidePoint( (x,y) ): self.selected = "back" elif self.UI['create'].CollidePoint( (x,y) ): self.selected = "create" return self def on_mouse(self, button, state, x, y): """ On mouse press """ if button == GLUT_LEFT_BUTTON and state == GLUT_UP: if self.UI['back'].CollidePoint((x,y)): return TitleScreenState(self.engine) if self.UI['create'].CollidePoint((x,y)): return self.createServer() # test for user clicks on the screen keys for letter in self.screenKeys: if self.screenKeys[letter].CollidePoint((x,y)): if len(self.hasFocus.getText()) < self.ServerNameMax: self.UI['text_entry'].push( letter ) if self.UI['backspace'].CollidePoint((x,y)): self.UI['text_entry'].pop() if self.UI['space'].CollidePoint((x,y)): if len(self.hasFocus.getText()) < self.ServerNameMax: self.UI['text_entry'].push(" ") return self
def __init__(self, engine): """ The game determines what is happening on screen based on what state the GameEngine instance has. """ self.engine = engine self.res = self.engine.setsMgr.screenRes res = self.res # get/load the font self.font = FontManager().loadFont( 'Basic' ) self.UI = {} self.UI['title'] = UIText("Join a Server"\ , pos=[res[0]*.01,res[1]*.10], font=self.font, scale=0.05) self.UI['back'] = UIText("Back"\ , pos=[res[0]*0.1, res[1]*0.9], font=self.font, scale=0.03) self.UI['back'].center() self.UI['join'] = UIText("Join"\ , pos=[res[0]*0.9, res[1]*0.9], font=self.font, scale=0.03) self.UI['join'].center() self.UI['backspace'] = UIText("BKSP"\ , [res[0]*0.24, res[1]*0.65], self.font, 0.03) self.UI['space'] = UIText("SPACE"\ , [res[0]*0.6, res[1]*0.65], self.font, 0.03) self.UI['ip_entry'] = UIText(self.engine.host\ , [res[0]*0.5, res[1]*0.3], self.font, 0.03) self.UI['ip_entry'].center() self.selected = 'join' self.entryBox = UIImage("box.png", pos=[res[0]*0.5, res[1]*0.3], size=[(0.03*res[0])*12, 0.05*res[1]]) self.entryBox.center() self.titleBGImg = UIImage("TitleScreenBG.png"\ , pos=[0,0], size=res) # This is the text input that currently has focus; # the default is text_entry self.hasFocus = self.UI['ip_entry'] # Here, a hash is created containing a UIText for each letter # in the alphabet. # They are spaced and stacked on the screen so that they lie # in 3 rows of 8, 9, and 9 letters each. self.screenKeys = {"." : UIText(".", [res[0]*0.5, res[1]*0.65], self.font, 0.06) } self.screenKeys["."].center() self.screenKeys["localhost"] = UIText("localhost", [res[0]*0.33, res[1]*0.48], self.font, 0.04) lettPos = [res[0]*0.3, res[1]*0.56] lettScale = 0.04 for letter in map( str, range(10) ): # add the letter to the hash self.screenKeys[letter] = UIText(letter, [lettPos[0], lettPos[1]], self.font, lettScale) lettPos[0] += lettScale+(lettScale*res[0]) # increment the x pos self.keysBox = UIImage("box.png", pos=list(self.screenKeys["5"].pos), size=[ (lettScale*res[0])*15, (lettScale*res[1])*7 ] ) self.keysBox.center()
class JoinServerState(EngineState): def __init__(self, engine): """ The game determines what is happening on screen based on what state the GameEngine instance has. """ self.engine = engine self.res = self.engine.setsMgr.screenRes res = self.res # get/load the font self.font = FontManager().loadFont( 'Basic' ) self.UI = {} self.UI['title'] = UIText("Join a Server"\ , pos=[res[0]*.01,res[1]*.10], font=self.font, scale=0.05) self.UI['back'] = UIText("Back"\ , pos=[res[0]*0.1, res[1]*0.9], font=self.font, scale=0.03) self.UI['back'].center() self.UI['join'] = UIText("Join"\ , pos=[res[0]*0.9, res[1]*0.9], font=self.font, scale=0.03) self.UI['join'].center() self.UI['backspace'] = UIText("BKSP"\ , [res[0]*0.24, res[1]*0.65], self.font, 0.03) self.UI['space'] = UIText("SPACE"\ , [res[0]*0.6, res[1]*0.65], self.font, 0.03) self.UI['ip_entry'] = UIText(self.engine.host\ , [res[0]*0.5, res[1]*0.3], self.font, 0.03) self.UI['ip_entry'].center() self.selected = 'join' self.entryBox = UIImage("box.png", pos=[res[0]*0.5, res[1]*0.3], size=[(0.03*res[0])*12, 0.05*res[1]]) self.entryBox.center() self.titleBGImg = UIImage("TitleScreenBG.png"\ , pos=[0,0], size=res) # This is the text input that currently has focus; # the default is text_entry self.hasFocus = self.UI['ip_entry'] # Here, a hash is created containing a UIText for each letter # in the alphabet. # They are spaced and stacked on the screen so that they lie # in 3 rows of 8, 9, and 9 letters each. self.screenKeys = {"." : UIText(".", [res[0]*0.5, res[1]*0.65], self.font, 0.06) } self.screenKeys["."].center() self.screenKeys["localhost"] = UIText("localhost", [res[0]*0.33, res[1]*0.48], self.font, 0.04) lettPos = [res[0]*0.3, res[1]*0.56] lettScale = 0.04 for letter in map( str, range(10) ): # add the letter to the hash self.screenKeys[letter] = UIText(letter, [lettPos[0], lettPos[1]], self.font, lettScale) lettPos[0] += lettScale+(lettScale*res[0]) # increment the x pos self.keysBox = UIImage("box.png", pos=list(self.screenKeys["5"].pos), size=[ (lettScale*res[0])*15, (lettScale*res[1])*7 ] ) self.keysBox.center() def renderFrame(self): """ RenderFrame - Base Class """ Screen().drawThis( self.titleBGImg ) Screen().drawThis( self.entryBox ) Screen().drawThis( self.keysBox ) selectionBox = UIImage("box.png", pos=self.UI[self.selected].pos, size=[(self.res[0]*0.03)*5, (self.res[0]*0.03)*2]) selectionBox.center() Screen().drawThis( selectionBox ) for uiObj in self.UI.values(): # draw the background image firstly Screen().drawThis( uiObj ) for letter in self.screenKeys.values(): Screen().drawThis( letter ) return self def on_key_press(self, key, x, y): """ On key press """ # Esc if key == chr(27): return TitleScreenState(self.engine) # Enter elif key == chr(13): if self.selected == "back": return TitleScreenState(self.engine) elif self.selected == "join": self.engine.host = self.UI['ip_entry'].getText() return ChoosePlayerState(self.engine) elif key >= 100 and key <= 103: if self.selected == "back": self.selected = "join" elif self.selected == "join": self.selected = "back" elif self.hasFocus != None: if key == chr(8) or key == chr(127): # BS or Del if self.UI['ip_entry'].getText() == "localhost": self.UI['ip_entry'].setText( "" ) else: self.hasFocus.pop() elif key == ".": self.hasFocus.push(".") elif key.isdigit(): if len( self.UI['ip_entry'].getText() ) < 15: if self.UI['ip_entry'].getText() == "localhost": self.UI['ip_entry'].setText( "" ) self.hasFocus.push(key) return self def on_mouse_motion(self, x, y): """ On mouse motion """ if self.UI['back'].CollidePoint( (x,y) ): self.selected = "back" elif self.UI['join'].CollidePoint( (x,y) ): self.selected = "join" return self def on_mouse(self, button, state, x, y): """ On mouse press """ if button == GLUT_LEFT_BUTTON and state == GLUT_UP: if self.UI['back'].CollidePoint((x,y)): return TitleScreenState(self.engine) if self.UI['join'].CollidePoint((x,y)): self.engine.host = self.UI['ip_entry'].getText() return ChoosePlayerState(self.engine) # test for user clicks on the screen keys if len( self.UI['ip_entry'].getText() ) < 15: for letter in self.screenKeys: if self.screenKeys[letter].CollidePoint((x,y)): if letter == "localhost": self.UI['ip_entry'].setText("localhost") else: if self.UI['ip_entry'].getText().isalpha(): self.UI['ip_entry'].setText( "" ) self.UI['ip_entry'].push( letter ) if self.UI['backspace'].CollidePoint((x,y)): if self.UI['ip_entry'].getText() == "localhost": self.UI['ip_entry'].setText( "" ) else: self.UI['ip_entry'].pop() if self.UI['space'].CollidePoint((x,y)): self.UI['ip_entry'].push(" ") return self