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 __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 __init__(self, game): super(EndScreen, self).__init__(game, False) SoundManager.getInstance().playEndMusic() #fonts self.textFont = Resources.getInstance().getScaledFont(self.mCamera.scale.x * 0.6) self.headerFont = Resources.getInstance().getScaledFont(self.mCamera.scale.x) self.titleFont = Resources.getInstance().getScaledFont(self.mCamera.scale.x * 2.0) self.modelsize = self.mCamera.getModelCoords(b2Vec2(Pgl.width, Pgl.height)) self.mDone = False self.mTimer = 0 texts = [ [self.titleFont, (200,160,160), "pxlgrvty", 0], [self.headerFont, (170,170,170), "Programming:", 25], [self.textFont, (255,255,255), "Rickard Hansson", 0], [self.headerFont, (170,170,170), "Graphics:", 25], [self.textFont, (255,255,255), "Rickard Hansson", 0], [self.headerFont, (170,170,170), "Audio/FX:", 25], [self.textFont, (255,255,255), "Rickard Hansson", 0], [self.headerFont, (170,170,170), "Music:", 25], [self.textFont, (255,255,255), "anamanaguchi - helix nebula", 0], [self.textFont, (255,255,255), "anamanaguchi - video challenge", 0], [self.textFont, (255,255,255), "electric children - spring retrospective", 0], [self.textFont, (255,255,255), "teknoaxe - chiptune does dubstep", 0], [self.textFont, (255,255,255), "roccow - chipho instrumental", 0], [self.textFont, (255,255,255), "sycamore drive - kicks", 0]] self.titlepos = self.mCamera.getViewCoords(b2Vec2(self.modelsize.x / 2.0, self.modelsize.y)) self.text = Text(texts, self.titlepos, 1, Pgl.app.surface) self.endtext = self.headerFont.render("thanks for playing!", 1, (170,170,170)) self.endsize = self.headerFont.size("thanks for playeing!") self.endpos = self.mCamera.getViewCoords(b2Vec2(self.modelsize.x/2.0, self.modelsize.y/2.0))
def __init__(self, camera, world): self.mCamera = camera self.mWorld = world self.mUI = Sprite(Resources.getInstance().mUI, self.mCamera.getScaledSize(4,1)) self.timefont = Resources.getInstance().getScaledFont(self.mCamera.scale.x) self.timesize = self.timefont.size("00:00:00")
def __updateLevelLockState(self): with open(Resources.getInstance().resource_path("assets/state/state.json"), "rb") as state: decryptedData = self.__mCrypt.decrypt(state.read()) lvldata = json.loads(decryptedData) if int(lvldata["LVL"]) <= self.mCurrentLevel: with open(Resources.getInstance().resource_path("assets/state/state.json"), "wb") as data: lvl = min(self.mCurrentLevel+1, self.mMaxLevels) data.write(self.__mCrypt.encrypt('{"LVL":"%s"}' % (str(lvl))))
def __init__(self, game, playMusic=True): self.mGame = game Pgl.app.setUpdaterate(int(Updaterate.FAST)) pygame.mouse.set_visible(False) if playMusic: SoundManager.getInstance().playMenuMusic() #set input & camera self.mGame.input = MenuInput(self) self.mCamera = Camera(Pgl.width, Pgl.height) self.modelsize = self.mCamera.getModelCoords(b2Vec2(Pgl.width, Pgl.height)) #fonts self.screenFont = Resources.getInstance().getScaledFont(self.mCamera.scale.x / 3.0) self.titleFont = Resources.getInstance().getScaledFont(self.mCamera.scale.x * 2.0) self.infoFont = Resources.getInstance().getScaledFont(self.mCamera.scale.x / 2) #graphics self.arrow = Sprite(Resources.getInstance().mArrow) self.arrow.setSize(self.mCamera.getScaledSize((self.arrow.getWidth()/float(self.arrow.getHeight())) * 0.5, 0.5)) self.menubutton = Animation(Resources.getInstance().mMenuButton, 2, 1, 0, self.mCamera.getScaledSize(1, 1), False, False) self.levelbutton = Animation(Resources.getInstance().mLevelButton, 2, 1, 0, self.mCamera.getScaledSize(1, 1), False, False) self.checkbutton = Animation(Resources.getInstance().mCheckButton, 2, 1, 0, self.mCamera.getScaledSize(1, 1), False, False) self.lock = Sprite(Resources.getInstance().mLock) self.lock.setSize(self.mCamera.getScaledSize((self.lock.getWidth()/float(self.lock.getHeight())) * 0.2, 0.2))
def countLevels(self): lvls = 0 for filename in os.listdir(Resources.getInstance().resource_path("assets/levels")): if filename.endswith(".lvl"): lvls += 1 return lvls
def __readLevelLockState(self): lvldata = None try: with open(Resources.getInstance().resource_path("assets/state/state.json"), "rb") as state: decryptedData = self.__mCrypt.decrypt(state.read()) lvldata = json.loads(decryptedData) try: return lvldata["LVL"] except: raise IOError except (IOError): with open(Resources.getInstance().resource_path("assets/state/state.json"), "wb+") as state: data = self.__mCrypt.encrypt('{"LVL":"1"}') state.write(data) return 1
def playMusic(self, seed = 0): if Pgl.options.music: if self.MUSIC_PLAYING == MusicID.BG: return seed = 1 if seed > self.NUMBER_OF_SONGS else seed song = "bg%s" % str(seed) self.MUSIC_PLAYING = MusicID.BG self.CURRENTSONG = seed print(Resources.getInstance()) pygame.mixer.music.set_volume(Pgl.options.musicvolume / 100.0) pygame.mixer.music.load(Resources.getInstance().resource_path("assets/audio/music/bg/%s.ogg" % song)) pygame.mixer.music.set_endevent(pygame.constants.USEREVENT) pygame.event.set_allowed(pygame.constants.USEREVENT) pygame.mixer.music.play() else: self.stopMusic()
def playMenuMusic(self): if Pgl.options.music: if self.MUSIC_PLAYING == MusicID.MENU: return pygame.mixer.music.set_volume(int(Pgl.options.musicvolume) / 100.0) pygame.mixer.music.load(Resources.getInstance().resource_path("assets/audio/music/menu.ogg")) pygame.mixer.music.play(-1) self.MUSIC_PLAYING = MusicID.MENU else: self.stopMusic()
def __readLevel(self): parser = self.__mCrypt.dectryptParser(self.mCurrentLevel) self.mCurrentTileset = parser.get("level", "tileset") self.mBackground = parser.get("level", "bg") bgcolor = pygame.image.load(Resources.getInstance().resource_path("assets/gfx/%s" % self.mBackground)) self.mBackgroundcolor = bgcolor.get_at((0, 0)) self.mPickupData = parser.get("objects", "pickups") self.mEnemyData = parser.get("objects", "enemies") self.mBoxData = parser.get("objects", "boxes") #Mapcollision #check for pictures first if os.path.exists(Resources.getInstance().resource_path("assets/levels/level%d.png" % self.mCurrentLevel)): self.mMap = pygame.image.load(Resources.getInstance().resource_path("assets/levels/level%d.png" % self.mCurrentLevel)) self.mWidth, self.mHeight = self.mMap.get_size() self.mMapType = MapType.PICTURE else: #check for lvl-file self.mMap = parser.get("level", "map").replace(" ", "").split("\n") self.mWidth = len(self.mMap[0]) self.mHeight = len(self.mMap) self.mMapType = MapType.TEXT
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 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()
def dectryptParser(self, lvlid): parser = configparser.ConfigParser() #create temp-file # fd, temp_path = tempfile.mkstemp(suffix=".lvl", dir="assets/levels/") #open crypted file, write the decrypted data to tempfile # with open(temp_path, "w+") as w: # with open("assets/levels/decrypted/level%d.lvl" % lvlid, "rb") as reader: # w.write(self.decrypt(reader.read())) #parse the decrypted file # parser.read(temp_path) parser.read(Resources.getInstance().resource_path("assets/levels/decrypted/level%d.lvl" % lvlid)) #close/remove # os.close(fd) # os.remove(temp_path) return parser
def __init__(self, world, camera): self.mWorld = world self.mCamera = camera #debugrender only self.debug = DebugDraw(self.mCamera) self.mWorld.physWorld.renderer = self.debug self.debug.AppendFlags(self.debug.e_shapeBit) #font self.fpsfont = Resources.getInstance().getScaledFont(20) #renders self.objectRender = ObjectRender(self.mCamera, self.mWorld.level.mObjects) self.playerRender = PlayerRender(self.mCamera, self.mWorld.player) self.tileRender = TileRender(self.mCamera, self.mWorld.level) self.enemyRender = EnemyRender(self.mCamera, self.mWorld.level.mEnemies) self.swirlRender = SwirlRender(self.mCamera, self.mWorld.level) self.fxRender = EffectRender(self.mCamera) self.bgRender = BackgroundRender(self.mCamera, self.mWorld.level) self.uiRender = UIRender(self.mCamera, self.mWorld)
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 playEndMusic(self): pygame.mixer.music.set_volume(int(Pgl.options.musicvolume) / 100.0) pygame.mixer.music.load(Resources.getInstance().resource_path("assets/audio/music/end.ogg")) pygame.mixer.music.play() self.MUSIC_PLAYING = MusicID.END
def initialize(self): self.SOUNDS = [Resources.getInstance().mJump, Resources.getInstance().mFleshExplosion, Resources.getInstance().mPickup] self.MUSIC_PLAYING = -1
def __init__(self): if self.INSTANCE is not None: raise ValueError("already instantiated") self.NUMBER_OF_SONGS = len([file for file in os.listdir(Resources.getInstance().resource_path("assets/audio/music/bg/")) if file.endswith(".ogg")])
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): 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 __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 levelUpdate(self, level): self.mTiles = level.mAllTiles self.mTileSprite = Animation(pygame.image.load(Resources.getInstance().resource_path("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))