def __init__(self, Tetris3d): self.Tetris3d = Tetris3d self.data = Tetris3d.data self.time = glutGet(GLUT_ELAPSED_TIME) self.state = 'mainMenu' self.menuitem = 'start' self.texture = Textures() self.tstring = TextureString(Tetris3d.data) self.playername = '' self.planes = {} self.skins = {} self.stringPlane = {} self.textureWidthRatio = 512.0 / 640.0 self.textureHeightRatio = 512.0 / 480.0 self.generateStringTexture('mainMenu') self.generateStringTexture('gameoverMenu') self.generateStringTexture('enterName') self.generateStringTexture('pause') self.generateStringTexture('play') self.generateStringTexture('highscore') self.backgroundTexture = self.texture.createTex(self.data.get('texture/menu/menu.jpg')) self.stringTexture = self.texture.createTex(self.stringPlane['mainMenu']) self.planes['0_background'] = {'texture': self.backgroundTexture, 'coord': [16.7, 12.525, 16.6]} self.planes['1_strings'] = {'texture': self.stringTexture, 'coord': [16.7, 12.525, 16.59]} self.cubePos = {'mainMenu': { 'start': [4,4.6,0], 'highscore': [10,0.2,0], 'exit': [3,-4,0] }, 'gameoverMenu': { 'start': [10.5,2.4,0], 'highscore': [10,-2,0], 'exit': [3,-6.2,0] }} self.cube = TetrisCube(1, self.cubePos[self.state][self.menuitem])
class TetrisHUD(GameObject): def __init__(self, Tetris3d): self.Tetris3d = Tetris3d self.data = Tetris3d.data self.time = glutGet(GLUT_ELAPSED_TIME) self.state = 'mainMenu' self.menuitem = 'start' self.texture = Textures() self.tstring = TextureString(Tetris3d.data) self.playername = '' self.planes = {} self.skins = {} self.stringPlane = {} self.textureWidthRatio = 512.0 / 640.0 self.textureHeightRatio = 512.0 / 480.0 self.generateStringTexture('mainMenu') self.generateStringTexture('gameoverMenu') self.generateStringTexture('enterName') self.generateStringTexture('pause') self.generateStringTexture('play') self.generateStringTexture('highscore') self.backgroundTexture = self.texture.createTex(self.data.get('texture/menu/menu.jpg')) self.stringTexture = self.texture.createTex(self.stringPlane['mainMenu']) self.planes['0_background'] = {'texture': self.backgroundTexture, 'coord': [16.7, 12.525, 16.6]} self.planes['1_strings'] = {'texture': self.stringTexture, 'coord': [16.7, 12.525, 16.59]} self.cubePos = {'mainMenu': { 'start': [4,4.6,0], 'highscore': [10,0.2,0], 'exit': [3,-4,0] }, 'gameoverMenu': { 'start': [10.5,2.4,0], 'highscore': [10,-2,0], 'exit': [3,-6.2,0] }} self.cube = TetrisCube(1, self.cubePos[self.state][self.menuitem]) def generateStringTexture(self, name): if self.stringPlane.has_key(name): del self.stringPlane[name] if name == 'mainMenu': self.registerString('mainMenu', self.tstring.create('Cubix'), 320, 20, 'center', 1) self.registerString('mainMenu', self.tstring.create('Start'), 320, 145, 'center', 0.8) self.registerString('mainMenu', self.tstring.create('Highscores'), 320, 215, 'center', 0.8) self.registerString('mainMenu', self.tstring.create('Exit'), 320, 290, 'center', 0.8) elif name == 'gameoverMenu': self.registerString('gameoverMenu', self.tstring.create('Game Over'), 320, 20, 'center', 1) self.registerString('gameoverMenu', self.tstring.create('Your Score: ' + str(self.Tetris3d.objects['mainGrid'].score.value)), 320, 120, 'center', 0.35) self.registerString('gameoverMenu', self.tstring.create('Try Again!'), 320, 180, 'center', 0.8) self.registerString('gameoverMenu', self.tstring.create('Highscores'), 320, 250, 'center', 0.8) self.registerString('gameoverMenu', self.tstring.create('Exit'), 320, 320, 'center', 0.8) elif name == 'enterName': self.registerString('enterName', self.tstring.create('Game Over'), 320, 20, 'center', 1) self.registerString('enterName', self.tstring.create('Enter Your Name:'), 320, 120, 'center', 0.4) self.registerString('enterName', self.tstring.create(self.playername), 320, 215, 'center', 0.5) elif name == 'pause': self.registerString('pause', self.tstring.create('Pause'), 320, 180, 'center', 1) elif name == 'highscore' or name == 'highscoreHighlight': if name == 'highscoreHighlight' and self.stringPlane.has_key('highscore'): del self.stringPlane['highscore'] self.registerString('highscore', self.tstring.create('Highscores'), 320, 20, 'center', 1) self.registerString('highscore', self.tstring.create('Press escape to go back to menu'), 320, 110, 'center', 0.32) id = self.Tetris3d.objects['mainGrid'].db.getNewestId() extraSpace = 0 i = 1 for score in self.Tetris3d.objects['mainGrid'].db.getToTen(): if score[2] == id and name == 'highscoreHighlight': size = 0.5 else: size = 0.35 nameString = self.tstring.create(score[0]) scoreString = self.tstring.create(str(score[1])) # To prevent that the name and score overlap each other in the list if int((nameString.size[0] + scoreString.size[0]) * size) > 540: ratio = 540.0 / ((nameString.size[0] + scoreString.size[0]) * size) size *= ratio self.registerString('highscore', nameString, 50, 120 + 30 * i + extraSpace, 'left', size) self.registerString('highscore', scoreString, 590, 120 + 30 * i + extraSpace, 'right', size) if score[2] == id and name == 'highscoreHighlight': extraSpace = 8 i += 1 elif name == 'play': self.registerString('play', self.tstring.create('Cubix'), 320, 30, 'left', 1) self.registerString('play', self.tstring.create('Score:'), 320, 365, 'left', 0.33) self.registerString('play', self.tstring.create('Level:'), 320, 423, 'left', 0.33) def registerString(self, skin, image, x, y, align, size): x = int(x * self.textureWidthRatio) y = int(y * self.textureHeightRatio) if not self.stringPlane.has_key(skin): self.stringPlane[skin] = new('RGBA', (512, 512)) width = int(image.size[0] * size * self.textureWidthRatio) height = int(image.size[1] * size * self.textureHeightRatio) image = image.resize((width, height), ANTIALIAS) posY = y if align == 'left': posX = x elif align == 'right': posX = x - width elif align == 'center': posX = x - (width / 2) else: posX = 0 self.stringPlane[skin].paste(image, (posX, posY)) def setState(self, state): if state == 'mainMenu': self.state = 'mainMenu' self.texture.createTex(self.stringPlane['mainMenu'], self.stringTexture) self.menuitem = 'start' self.cube.renderPos = self.cubePos[self.state][self.menuitem] elif state == 'gameoverMenu': self.state = 'gameoverMenu' self.generateStringTexture('gameoverMenu') self.texture.createTex(self.data.get('texture/menu/menu.jpg'), self.backgroundTexture) self.texture.createTex(self.stringPlane['gameoverMenu'], self.stringTexture) self.menuitem = 'start' self.cube.renderPos = self.cubePos[self.state][self.menuitem] elif state == 'play': self.state = 'play' self.Tetris3d.objects['mainGrid'].run = True self.texture.createTex(self.data.get('texture/menu/front.jpg'), self.backgroundTexture) self.texture.createTex(self.stringPlane['play'], self.stringTexture) if self.Tetris3d.objects['mainGrid'].gameover: self.Tetris3d.objects['mainGrid'].gameover = 0 self.Tetris3d.objects['mainGrid'].clearGrid() elif state == 'pause': self.state = 'pause' self.Tetris3d.objects['mainGrid'].run = None self.texture.createTex(self.data.get('texture/menu/menu.jpg'), self.backgroundTexture) self.texture.createTex(self.stringPlane['pause'], self.stringTexture) elif state == 'highscore': if self.state == 'enterName': self.generateStringTexture('highscoreHighlight') else: self.generateStringTexture('highscore') self.state = 'highscore' self.texture.createTex(self.data.get('texture/menu/highscore.jpg'), self.backgroundTexture) self.texture.createTex(self.stringPlane['highscore'], self.stringTexture) elif state == 'enterName': self.state = 'enterName' self.generateStringTexture('enterName') self.texture.createTex(self.data.get('texture/menu/menu.jpg'), self.backgroundTexture) self.texture.createTex(self.stringPlane['enterName'], self.stringTexture) def keyboardSpecial(self, key, x, y): if self.state == 'mainMenu' or self.state == 'gameoverMenu': if key == 101: # up arrow key if self.menuitem == 'start': self.menuitem = 'exit' elif self.menuitem == 'exit': self.menuitem = 'highscore' elif self.menuitem == 'highscore': self.menuitem = 'start' elif key == 103: # down arrow key if self.menuitem == 'start': self.menuitem = 'highscore' elif self.menuitem == 'highscore': self.menuitem = 'exit' elif self.menuitem == 'exit': self.menuitem = 'start' self.cube.renderPos = self.cubePos[self.state][self.menuitem] def keyboard(self, key, x, y): if self.state == 'mainMenu' or self.state == 'gameoverMenu': if ord(key) == 27: # key = esc sys.exit() if ord(key) == 13: # key = enter if self.menuitem == 'start': self.setState('play') elif self.menuitem == 'highscore': self.setState('highscore') elif self.menuitem == 'exit': sys.exit() elif self.state == 'highscore': if ord(key) == 27: # key = esc self.setState('mainMenu') elif self.state == 'enterName': if self.tstring.data.has_key(key) and len(self.playername) < 13: self.playername += key elif ord(key) == 8: # key = backspace self.playername = self.playername[:-1] self.generateStringTexture('enterName') self.texture.createTex(self.stringPlane['enterName'], self.stringTexture) if ord(key) == 13 and len(self.playername) != 0: # key = enter self.Tetris3d.objects['mainGrid'].db.addScore(unicode(self.playername), self.Tetris3d.objects['mainGrid'].score.getValue()) self.setState('highscore') elif ord(key) == 27: # key = esc self.setState('mainMenu') elif self.state == 'pause': if key == 'p': self.setState('play') if ord(key) == 27: # key = esc self.Tetris3d.objects['mainGrid'].gameOver() elif self.state == 'play': if key == 'p': self.setState('pause') if ord(key) == 27: # key = esc self.Tetris3d.objects['mainGrid'].gameOver() def display(self): for name, plane in self.planes.iteritems(): x = plane['coord'][0] y = plane['coord'][1] z = plane['coord'][2] glEnable (GL_BLEND) glBlendFunc (GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, plane['texture']) glBegin(GL_QUADS) glTexCoord2f(1.0, 0.0); glVertex3f(-x, -y, z) # Bottom Right glTexCoord2f(0.0, 0.0); glVertex3f( x, -y, z) # Bottom Left glTexCoord2f(0.0, 1.0); glVertex3f( x, y, z) # Top Left glTexCoord2f(1.0, 1.0); glVertex3f(-x, y, z) # Top Right glEnd() glDisable(GL_TEXTURE_2D) glDisable(GL_BLEND) if self.state == 'mainMenu' or self.state == 'gameoverMenu': glPushMatrix() glScaled(0.2,0.2,0.2) glTranslated(0,0,-0.2) self.cube.display() glPopMatrix() def update(self, delay): if self.time + 1000 < glutGet(GLUT_ELAPSED_TIME) and (self.state == 'mainMenu' or self.state == 'gameoverMenu'): new = randrange(0,6) if new >= self.cube.type: self.cube.setType(new + 1) else: self.cube.setType(new) if self.cube.type == 0: for pos in self.cube.position: pos[0] += 0.5 elif self.cube.type == 2: for pos in self.cube.position: pos[1] += 0.5 elif self.cube.type == 3 or self.cube.type == 4: for pos in self.cube.position: pos[0] -= 0.5 elif self.cube.type == 5 or self.cube.type == 6: for pos in self.cube.position: pos[1] -= 0.5 self.time = glutGet(GLUT_ELAPSED_TIME)