class EffectRender(object): mEffects = None def __init__(self, camera): self.mEffects = [] self.mCamera = camera self.blood = Animation(Resources.getInstance().mBlood, 5, 1, 0, self.mCamera.getScaledSize(1,1), False, False) def render(self, delta): remove = [] for fx in self.mEffects: if fx.isAlive(): for particle in fx.particles: if particle.alive: viewpos = self.mCamera.getViewCoords(particle.position) random.seed(particle.mSize.x) self.blood.freeze(random.randint(0, 4), 0) self.blood.setSize(self.mCamera.getScaledSize(particle.mSize.x, particle.mSize.y)) self.blood.draw(delta, viewpos) else: remove.append(fx) for fx in remove: self.mEffects.remove(fx) def addFx(self, fx): self.mEffects.append(fx)
class SwirlRender(object): __swirlActivation = None def __init__(self, camera, level): self.__swirlActivation = False self.mLevel = level self.mCamera = camera self.swirl = Animation(Resources.getInstance().mSwirlSheet, 3, 2, 0.45, self.mCamera.getScaledSize(1,1)) self.swirl.setLooping(False) def render(self, delta): if self.mCamera.isInFrustum(self.mLevel.mEndPos.x, self.mLevel.mEndPos.y): viewpos = self.mCamera.getViewCoords(self.mLevel.mEndPos) if not self.mLevel.mSwirlActive: self.swirl.freeze(0, 0) else: if not self.__swirlActivation: self.swirl.continueAnimation() if self.swirl.isAnimationDone(): self.__swirlActivation = True self.swirl.setLooping(True) self.swirl.gotoRow(1) self.swirl.draw(delta, viewpos) def levelUpdate(self): self.__swirlActivation = False self.swirl.setLooping(False) self.swirl.reset()
class LevelTimeScreen(BaseMenuScreen): def __init__(self, game, levelInt, currentTime = None): Id.getInstance().resetId() self.__mCrypt = Crypt() self.mCurrentTime = currentTime self.mLevelInt = levelInt self.mButtons = [] self.mTime = Time(self.__readPlayerTime()) if currentTime != None: super(LevelTimeScreen, self).__init__(game, False) self.__initializeFromGame() else: super(LevelTimeScreen, self).__init__(game) self.__initializeFromMenu() self.medallions = Animation(Resources.getInstance().mMedallions, 3, 3, 0, self.mCamera.getScaledSize(3, 3), False, False) self.mLevelTimes = [Time(x) for x in self.__readLevelTimes()] self.mButtons.append(Button("back", 0.5, 8.5, b2Vec2(2,1), lambda: self.mGame.setScreen(screen.LevelScreen.LevelScreen(self.mGame)))) self.achivedMedallion = self.__calculateMedallion() def __initializeFromMenu(self): self.mButtons.append(Button("play", 13.5, 8.5, b2Vec2(2,1), lambda: self.mGame.setScreen(screen.GameScreen.GameScreen(self.mGame, self.mLevelInt)))) def __initializeFromGame(self): if self.mLevelInt < Level.Level.countLevels(): self.mButtons.append(Button("next", 13.5, 8.5, b2Vec2(2,1), lambda: self.mGame.setScreen(screen.GameScreen.GameScreen(self.mGame, self.mLevelInt+1)))) else: self.mButtons.append(Button("end", 13.5, 8.5, b2Vec2(2,1), lambda: self.mGame.setScreen(screen.EndScreen.EndScreen(self.mGame)))) self.mButtons.append(Button("retry", 11, 8.5, b2Vec2(2,1), lambda: self.mGame.setScreen(screen.GameScreen.GameScreen(self.mGame, self.mLevelInt)))) if self.mCurrentTime.isFaster(self.mTime): self.mTime = self.mCurrentTime found = False data = None try: with open(Resources.getInstance().resource_path("assets/state/time.json"), "rb") as readstate: decryptedData = self.__mCrypt.decrypt(readstate.read()) data = json.loads(decryptedData) for time in data: if time["ID"] == str(self.mLevelInt): found = True time["TIME"] = self.mCurrentTime.toString() if not found: data.append({"ID":"%s" % str(self.mLevelInt), "TIME":"%s" % self.mCurrentTime.toString()}) except Exception: pass if data == None: data = '[{"ID":"%s", "TIME":"%s"}]' % (str(self.mLevelInt), self.mCurrentTime.toString()) with open(Resources.getInstance().resource_path("assets/state/time.json"), "wb+") as writestate: writestate.write(self.__mCrypt.encrypt(json.dumps(data))) def __calculateMedallion(self): if self.mTime.isFaster(self.mLevelTimes[0]): return b2Vec2(0,0) elif self.mTime.isFaster(self.mLevelTimes[1]): return b2Vec2(1,0) elif self.mTime.isFaster(self.mLevelTimes[2]): return b2Vec2(2,0) else: return b2Vec2(0,2) def __readPlayerTime(self): pTime = None found = False try: with open(Resources.getInstance().resource_path("assets/state/time.json"), "rb") as state: decryptedData = self.__mCrypt.decrypt(state.read()) pTime = json.loads(decryptedData) for time in pTime: if time["ID"] == str(self.mLevelInt): pTime = time["TIME"] found = True break except Exception: with open(Resources.getInstance().resource_path("assets/state/time.json"), "wb+") as writer: writer.write(self.__mCrypt.encrypt("[]")) if not found: pTime = "00:00:00" return pTime def __readLevelTimes(self): times = [] parser = self.__mCrypt.dectryptParser(self.mLevelInt) times.append(parser.get("time", "gold")) times.append(parser.get("time", "silver")) times.append(parser.get("time", "bronze")) return times def update(self, delta): BaseMenuScreen.update(self, delta) def render(self, delta): Pgl.app.surface.fill((67,80,129)) #header title = self.titleFont.render("level %s" % str(self.mLevelInt), 0, (255,255,255)) size = self.titleFont.size("level %s" % str(self.mLevelInt)) titlepos = self.mCamera.getViewCoords(b2Vec2(self.modelsize.x / 2.0, self.modelsize.y / 6)) Pgl.app.surface.blit(title, (titlepos.x - size[0] / 2.0, titlepos.y - size[1] / 2.0)) #current runningtime (if comming from gamescreen) if self.mCurrentTime != None: current = Resources.getInstance().getScaledFont(self.mCamera.mScale.x / 1.5).render("Current time:", 0, (255, 255, 255)) currentsize = Resources.getInstance().getScaledFont(self.mCamera.scale.x / 1.5).size("Current time:") ctime = Resources.getInstance().getScaledFont(self.mCamera.scale.x / 1.5).render(self.mCurrentTime.toString(), 0, (255,74,20)) currentpos = self.mCamera.getViewCoords(b2Vec2(5, 3.3)) ctimepos = self.mCamera.getViewCoords(b2Vec2(5.5, 3.3)) Pgl.app.surface.blit(current, currentpos) Pgl.app.surface.blit(ctime, (ctimepos.x + currentsize[0], ctimepos.y)) #besttime best = Resources.getInstance().getScaledFont(self.mCamera.scale.x / 1.5).render("Best time:", 0, (255, 255, 255)) bestsize = Resources.getInstance().getScaledFont(self.mCamera.scale.x / 1.5).size("Best time:") time = Resources.getInstance().getScaledFont(self.mCamera.scale.x / 1.5).render(self.mTime.toString(), 0, (255,74,20)) bestpos = self.mCamera.getViewCoords(b2Vec2(5, 3.8)) timepos = self.mCamera.getViewCoords(b2Vec2(5.5, 3.8)) Pgl.app.surface.blit(best, bestpos) Pgl.app.surface.blit(time, (timepos.x + bestsize[0], timepos.y)) #buttons btnToDraw = self.menubutton for btn in self.mButtons: viewpos = self.mCamera.getViewCoords(b2Vec2(btn.x, btn.y)) btnToDraw.setSize(self.mCamera.getScaledSize(btn.size.x, btn.size.y)) color = None if btn.mActive: btnToDraw.freeze(1, 0) color = (255,255,255) else: btnToDraw.freeze(0, 0) color = (141,60,1) btnToDraw.draw(delta, viewpos) btntxt = self.screenFont.render(str(btn.mText), 0, color) size = self.screenFont.size(str(btn.mText)) txtpos = self.mCamera.getViewCoords(b2Vec2(btn.x + btn.size.x / 2 - (size[0] / self.mCamera.scale.x) / 2.0, btn.y + btn.size.y / 2 - (size[1] / self.mCamera.scale.y) / 2.0)) Pgl.app.surface.blit(btntxt, (txtpos.x, txtpos.y)) #small medallions for x in range(len(self.mLevelTimes)): self.medallions.freeze(x, 1) timetxt = self.infoFont.render(self.mLevelTimes[x].toString(), 0 , (255,255,255)) pos = self.mCamera.getViewCoords(b2Vec2(9, 5+x)) Pgl.app.surface.blit(timetxt, (pos.x, pos.y)) self.medallions.setSize(self.mCamera.getScaledSize(1,1)) self.medallions.draw(delta, self.mCamera.getViewCoords(b2Vec2(8,4.6+x))) self.medallions.freeze(self.achivedMedallion.x, self.achivedMedallion.y) self.medallions.setSize(self.mCamera.getScaledSize(3,3)) self.medallions.draw(delta, self.mCamera.getViewCoords(b2Vec2(4.9,4.6))) self.arrow.draw() def mouseClick(self, pos): xy = self.mCamera.getModelCoords(b2Vec2(pos[0], pos[1])) for btn in self.mButtons: if btn.rect.collidepoint(xy): btn.mAction() def mouseOver(self, pos): xy = self.mCamera.getModelCoords(b2Vec2(pos[0], pos[1])) for btn in self.mButtons: btn.mActive = False if btn.rect.collidepoint(xy): btn.mActive = True def keyInput(self, key): if key == pygame.K_r: self.__quickRetry() elif key == pygame.K_SPACE: self.__quickGame() def __quickRetry(self): if self.mCurrentTime != None: self.mGame.setScreen(screen.GameScreen.GameScreen(self.mGame, self.mLevelInt)) def __quickGame(self): if self.mCurrentTime == None: self.mGame.setScreen(screen.GameScreen.GameScreen(self.mGame, self.mLevelInt)) else: if self.mLevelInt < Level.Level.countLevels(): self.mGame.setScreen(screen.GameScreen.GameScreen(self.mGame, self.mLevelInt+1)) else: self.mGame.setScreen(screen.EndScreen.EndScreen(self.mGame))
class InstructionScreen(BaseMenuScreen): #crystal __crystalPos = None __crystalTimer = None __crystalDirection = None __crystalBlingTimer = None #player walking __walkPos = None __walkTimer = None __walkDirection = None #player jumping __jumpPos = None __jumpWaitTimer = None __jumpDirection = None #player gravity __gravityPos = None __gravityTimer = None __gravityDirection = None def __init__(self, game): super(InstructionScreen, self).__init__(game) self.__mMenuItems = [] self.__mMenuItems.append(Button("back", 0.5, 8.5, b2Vec2(2,1), lambda: self.mGame.setScreen(screen.MenuScreen.MenuScreen(self.mGame)))) self.__crystalPos = b2Vec2(9.5,5.8) self.__crystalDirection = b2Vec2(0,1) self.__crystalBlingTimer = 4.0 self.__crystalTimer = 1.0 self.crystal = Animation(Resources.getInstance().mCrystal, 5, 1, 0.6, self.mCamera.getScaledSize(0.6,0.6), False, True) self.portal = Animation(Resources.getInstance().mSwirlSheet, 3, 2, 0.6, self.mCamera.getScaledSize(1.5,1.5), False, True) self.__walkPos = b2Vec2(1,3) self.__walkTimer = 2.0 self.__walkDirection = b2Vec2(1,0) self.playerWalk = Animation(Resources.getInstance().mPxl, 4, 2, 0.4, self.mCamera.getScaledSize(1, 1), True, True) self.__jumpPos = b2Vec2(9.5,3) self.__jumpStartPos = self.__jumpPos.copy() self.__jumpTimer = 0.5 self.__jumpWaitTimer = 0.2 self.__jumpDirection = b2Vec2(0,-1) self.playerjump = Animation(Resources.getInstance().mPxl, 4, 2, 0.4, self.mCamera.getScaledSize(1, 1), False, False) self.__gravityPos = b2Vec2(3, 6) self.__gravityTimer = 1.0 self.__gravityDirection = b2Vec2(0,-1) self.playergravity = Animation(Resources.getInstance().mPxl, 4, 2, 0.4, self.mCamera.getScaledSize(1, 1), False, False) def mouseClick(self, pos): mmp = self.mCamera.getModelCoords(b2Vec2(pos[0], pos[1])) for btn in self.__mMenuItems: if btn.rect.collidepoint(mmp): btn.mAction() def mouseOver(self, pos): mmp = self.mCamera.getModelCoords(b2Vec2(pos[0], pos[1])) for btn in self.__mMenuItems: btn.mActive = False if btn.rect.collidepoint(mmp): btn.mActive = True def keyInput(self, key): pass def update(self, delta): BaseMenuScreen.update(self, delta) #crystal self.__crystalTimer -= delta if self.__crystalTimer < 0: self.__crystalTimer = 1.0 self.__crystalDirection *= -1 self.__crystalPos.y = self.__crystalPos.copy().y + (self.__crystalDirection.y * 0.01 / 2) if self.crystal.isAnimationDone(): self.__crystalBlingTimer -= delta if self.__crystalBlingTimer < 0: self.__crystalBlingTimer = 4.0 self.crystal.reset() #portal if self.portal.isAnimationDone(): self.portal.gotoRow(1) self.portal.continueAnimation() #playerwalk self.__walkTimer -= delta if self.__walkTimer < 0: self.__walkTimer = 2.0 self.__walkDirection *= -1 self.playerWalk.flipX() self.__walkPos.x = self.__walkPos.copy().x + (self.__walkDirection.x * 0.03) #playerjump if self.__jumpWaitTimer > 0: self.__jumpWaitTimer -= delta self.playerjump.freeze(0, 0) else: self.playerjump.freeze(0,1) self.__jumpPos.y = self.__jumpPos.copy().y + (self.__jumpDirection.y * 0.05) if self.__jumpPos.y <= self.__jumpStartPos.y - 0.8: self.__jumpDirection.Set(0,1) if self.__jumpPos.y > self.__jumpStartPos.y: self.__jumpWaitTimer = 0.4 self.__jumpPos = self.__jumpStartPos.copy() self.__jumpDirection *= -1 #playergravity if self.__gravityTimer > 0: self.__gravityTimer -= delta self.playergravity.freeze(0,0) else: self.playergravity.freeze(0,1) if self.__gravityDirection.y < 0: self.playergravity.rotate(180) if self.playergravity.flippedX() == False: self.playergravity.flipX() elif self.__gravityDirection.y > 0: if self.playergravity.flippedX(): self.playergravity.flipX() self.playergravity.rotate(0) self.__gravityPos.y = self.__gravityPos.copy().y + (self.__gravityDirection.y * 0.05) if self.__gravityPos.y <= 4.3: self.__gravityDirection.Set(0,1) self.__gravityTimer = 1.0 if self.__gravityPos.y > 6: self.__gravityPos.y = 6 self.__gravityDirection.Set(0,-1) self.__gravityTimer = 1.0 def render(self, delta): Pgl.app.surface.fill((67,80,129)) btnToDraw = self.menubutton for btn in self.__mMenuItems: viewpos = self.mCamera.getViewCoords(b2Vec2(btn.x, btn.y)) btnToDraw.setSize(self.mCamera.getScaledSize(btn.size.x, btn.size.y)) color = None if btn.mActive: btnToDraw.freeze(1, 0) color = (255,255,255) else: btnToDraw.freeze(0, 0) color = (141,60,1) btnToDraw.draw(delta, viewpos) btntxt = self.screenFont.render(str(btn.mText), 0, color) size = self.screenFont.size(str(btn.mText)) txtpos = self.mCamera.getViewCoords(b2Vec2(btn.x + btn.size.x / 2 - (size[0] / self.mCamera.scale.x) / 2.0, btn.y + btn.size.y / 2 - (size[1] / self.mCamera.scale.y) / 2.0)) Pgl.app.surface.blit(btntxt, (txtpos.x, txtpos.y)) #texts and animations title = self.titleFont.render("instructions", 0, (255,255,255)) size = self.titleFont.size("instructions") titlepos = self.mCamera.getViewCoords(b2Vec2(self.modelsize.x / 2.0, self.modelsize.y / 6)) Pgl.app.surface.blit(title, (titlepos.x - size[0] / 2.0, titlepos.y - size[1] / 2.0)) self.crystal.draw(delta, self.mCamera.getViewCoords(self.__crystalPos)) crystalinfo = Resources.getInstance().getScaledFont(self.mCamera.scale.x).render("=", 0, (255,255,255)) Pgl.app.surface.blit(crystalinfo, self.mCamera.getViewCoords(b2Vec2(11, 5.8))) self.portal.draw(delta, self.mCamera.getViewCoords(b2Vec2(12.5, 5.3))) portalinfo = self.infoFont.render("collect crystals to open portals", 0, (255,255,255)) Pgl.app.surface.blit(portalinfo, self.mCamera.getViewCoords(b2Vec2(8,7))) self.playerWalk.draw(delta, self.mCamera.getViewCoords(self.__walkPos)) moveinfo = self.infoFont.render("w,a,s,d - to move around!", 0, (255,255,255)) Pgl.app.surface.blit(moveinfo, self.mCamera.getViewCoords(b2Vec2(1,4))) self.playerjump.draw(delta, self.mCamera.getViewCoords(self.__jumpPos)) jumpinfo = self.infoFont.render("spacebar to jump!", 0, (255,255,255)) Pgl.app.surface.blit(jumpinfo, self.mCamera.getViewCoords(b2Vec2(8,4))) self.playergravity.draw(delta, self.mCamera.getViewCoords(self.__gravityPos)) gravinfo = self.infoFont.render("arrowkeys to shift gravity!", 0, (255,255,255)) Pgl.app.surface.blit(gravinfo, self.mCamera.getViewCoords(b2Vec2(1,7))) self.arrow.draw()
class TileRender(object): def __init__(self, camera, level): self.mCamera = camera self.levelUpdate(level) self.level = level def render(self, delta): x = self.mCamera.displacement.x * self.mCamera.scale.x y = self.mCamera.displacement.y * self.mCamera.scale.y w = self.mCamera.CAMERA_WIDTH * self.mCamera.scale.x h = self.mCamera.CAMERA_HEIGHT * self.mCamera.scale.y rect = Rect(x, y, w, h) Pgl.app.surface.blit(self.sf, (0, 0), rect) def levelUpdate(self, level): self.mTiles = level.mAllTiles self.mTileSprite = Animation(pygame.image.load("assets/gfx/tiles/%s" % level.mCurrentTileset).convert_alpha(), 3, 11, 0, self.mCamera.getScaledSize(1,1)) width = int(level.mWidth * self.mCamera.scale.x) height = int(level.mHeight * self.mCamera.scale.y) scale = self.mCamera.getScaledSize(1,1) self.sf = pygame.Surface((width, height), flags=pygame.SRCALPHA); self.mCamera.displacement = b2Vec2(0,0); for tile in self.mTiles: viewpos = self.mCamera.getViewCoords(b2Vec2(tile.position.x - 0.5, tile.position.y - 0.5)) #walls if tile.tiletype == TileType.TL: self.mTileSprite.freeze(0,0) elif tile.tiletype == TileType.T: self.mTileSprite.freeze(1,0) elif tile.tiletype == TileType.TR: self.mTileSprite.freeze(2,0) elif tile.tiletype == TileType.L: self.mTileSprite.freeze(0,1) elif tile.tiletype == TileType.M: random.seed(tile.position.x / tile.position.y) if random.randint(0,9) > 3: self.mTileSprite.freeze(1,1) else: self.mTileSprite.freeze(2,7) elif tile.tiletype == TileType.R: self.mTileSprite.freeze(2,1) elif tile.tiletype == TileType.BL: self.mTileSprite.freeze(0,2) elif tile.tiletype == TileType.B: self.mTileSprite.freeze(1,2) elif tile.tiletype == TileType.BR: self.mTileSprite.freeze(2,2) #grass elif tile.tiletype == TileType.GL: self.mTileSprite.freeze(0,3) elif tile.tiletype == TileType.GM: self.mTileSprite.freeze(1,3) elif tile.tiletype == TileType.GR: self.mTileSprite.freeze(2,3) #edge elif tile.tiletype == TileType.ETL: self.mTileSprite.freeze(0,4) elif tile.tiletype == TileType.ET: self.mTileSprite.freeze(1,4) elif tile.tiletype == TileType.ETR: self.mTileSprite.freeze(2,4) elif tile.tiletype == TileType.EL: self.mTileSprite.freeze(0,5) elif tile.tiletype == TileType.EM: self.mTileSprite.freeze(1,5) elif tile.tiletype == TileType.ER: self.mTileSprite.freeze(2,5) elif tile.tiletype == TileType.EBL: self.mTileSprite.freeze(0,6) elif tile.tiletype == TileType.EB: self.mTileSprite.freeze(1,6) elif tile.tiletype == TileType.EBR: self.mTileSprite.freeze(2,6) #single elif tile.tiletype == TileType.S: self.mTileSprite.freeze(1,5) elif tile.tiletype == TileType.SG: self.mTileSprite.freeze(1,7) elif tile.tiletype == TileType.SL: self.mTileSprite.freeze(0,8) elif tile.tiletype == TileType.SM: self.mTileSprite.freeze(1,8) elif tile.tiletype == TileType.SR: self.mTileSprite.freeze(2,8) elif tile.tiletype == TileType.SGL: self.mTileSprite.freeze(0,9) elif tile.tiletype == TileType.SGM: self.mTileSprite.freeze(1,9) elif tile.tiletype == TileType.SGR: self.mTileSprite.freeze(2,9) elif tile.tiletype == TileType.SVB: self.mTileSprite.freeze(0,10) elif tile.tiletype == TileType.SVM: self.mTileSprite.freeze(1,10) elif tile.tiletype == TileType.SVT: self.mTileSprite.freeze(2,10) elif tile.tiletype == TileType.GRAVITYZONE: self.mTileSprite.freeze(2,7) area = self.mTileSprite.getRect() toDraw = self.mTileSprite.image.subsurface(area) toDraw = pygame.transform.scale(toDraw, (int(scale.x), int(scale.y))) self.sf.blit(toDraw, (viewpos.x, viewpos.y))
class PlayerRender(object): def __init__(self, camera, player): self.mCamera = camera self.mPlayer = player self.playerAnimation = Animation(Resources.getInstance().mPxl, 4, 2, 0.5, self.mCamera.getScaledSize(1,1)) def render(self, delta): if self.mPlayer.alive: size = self.mPlayer.size viewpos = self.mCamera.getViewCoords(b2Vec2(self.mPlayer.position.x - self.mPlayer.size.x/2.0, self.mPlayer.position.y - self.mPlayer.size.y/2.0)) self.playerAnimation.setSize(self.mCamera.getScaledSize(size.x, size.y)) if self.mPlayer.mPlayerState == PlayerState.IDLE: self.playerAnimation.freeze(0) elif self.mPlayer.mPlayerState == PlayerState.FALLING: self.playerAnimation.freeze(0, 1) else: self.playerAnimation.gotoRow(0) self.playerAnimation.continueAnimation() self.__flipAndRotate() self.playerAnimation.draw(delta, viewpos) def __flipAndRotate(self): #Down if self.mPlayer.mBodyDirection == GravityDirection.DOWN: self.playerAnimation.rotate(0) if self.mPlayer.mFacing == Facing.RIGHT: if self.playerAnimation.flippedX() == True: self.playerAnimation.flipX() else: if self.playerAnimation.flippedX() == False: self.playerAnimation.flipX() #Up if self.mPlayer.mBodyDirection == GravityDirection.UP: self.playerAnimation.rotate(180) if self.mPlayer.mFacing == Facing.RIGHT: if self.playerAnimation.flippedX() == False: self.playerAnimation.flipX() else: if self.playerAnimation.flippedX() == True: self.playerAnimation.flipX() #Right if self.mPlayer.mBodyDirection == GravityDirection.RIGHT: self.playerAnimation.rotate(90) if self.mPlayer.mFacing == Facing.RIGHT: if self.playerAnimation.flippedX() == True: self.playerAnimation.flipX() else: if self.playerAnimation.flippedX() == False: self.playerAnimation.flipX() #Left if self.mPlayer.mBodyDirection == GravityDirection.LEFT: self.playerAnimation.rotate(270) if self.mPlayer.mFacing == Facing.RIGHT: if self.playerAnimation.flippedX() == True: self.playerAnimation.flipX() else: if self.playerAnimation.flippedX() == False: self.playerAnimation.flipX()