def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(Viewport, cls).__new__(cls, *args, **kwargs) self = cls._instance self.pixelVect = Vect(0, 0) self.levelHeight = None self.hasMoved = False return cls._instance
def update(self, msSinceLast): ''' Overrides Sprite update ''' if Viewport().hasMoved: self.rect.center = Viewport().convertPhysicalToPixelCoords(self.__physicalPosition) self.dirty = 1 if self.hasPhysics: newPhysicalPosition = Vect(self.body.position.x,self.body.position.y) if newPhysicalPosition != self.physicalPosition: self.physicalPosition = newPhysicalPosition getVel = self.body.GetLinearVelocity() self.curVel = (getVel.x, getVel.y) if self.curVel[0] >= -2.0 and self.curVel[0] < 0.0: self.tryStop() self.animstate = Spaceman.STANDING_LEFT elif self.curVel[0] <= 2.0 and self.curVel[0] > 0.0: self.tryStop() self.animstate = Spaceman.STANDING_RIGHT elif self.curVel[0] > 2.0: if self.isOnGround(): self.animstate = Spaceman.WALKING_RIGHT elif self.tryingToJump: self.animstate = Spaceman.JUMPING_RIGHT else: self.animstate = Spaceman.STANDING_RIGHT elif self.curVel[0] < -2.0: if self.isOnGround(): self.animstate = Spaceman.WALKING_LEFT elif self.tryingToJump: self.animstate = Spaceman.JUMPING_LEFT else: self.animstate = Spaceman.STANDING_LEFT self.spriteIndex += (msSinceLast/33.0) if self.animstate == Spaceman.WALKING_RIGHT: self.image = self.spritesRight[int(self.spriteIndex%len(self.spritesRight))] elif self.animstate == Spaceman.WALKING_LEFT: self.image = self.spritesLeft[int(self.spriteIndex%len(self.spritesLeft))] elif self.animstate == Spaceman.JUMPING_RIGHT: index = int(self.spriteIndex%len(self.sprJumpingRight)) if self.spriteIndex>len(self.sprJumpingRight)/2: index = len(self.sprJumpingRight)/2 self.image = self.sprJumpingRight[index] elif self.animstate == Spaceman.JUMPING_LEFT: index = int(self.spriteIndex%len(self.sprJumpingLeft)) if self.spriteIndex>len(self.sprJumpingLeft)/2: index = len(self.sprJumpingLeft)/2 self.image = self.sprJumpingLeft[index] elif self.animstate == Spaceman.STANDING_RIGHT: self.image = ImageHandler()["standingRight"] elif self.animstate == Spaceman.STANDING_LEFT: self.image = ImageHandler()["standingLeft"]
def update(self, msSinceLast): ''' Overrides Sprite update ''' if Viewport().hasMoved: self.rect.center = Viewport().convertPhysicalToPixelCoords(self.__physicalPosition) self.dirty = 1 if self.hasPhysics: newPhysicalPosition = Vect(self.body.position.x,self.body.position.y) if newPhysicalPosition != self.physicalPosition: self.physicalPosition = newPhysicalPosition
def __init__(self,name): self.allObjects = pygame.sprite.LayeredDirty() bgimage = ImageHandler()[name] self.physicalSize = Vect(float(bgimage.get_width())/PIXELS_PER_METER,float(bgimage.get_height())/PIXELS_PER_METER) self.drawDebug = False world_bounds = Box2D.b2AABB() world_bounds.lowerBound = (0,0) world_bounds.upperBound = (self.physicalSize[0],self.physicalSize[1]) doSleep = True self.physicsWorld = Box2D.b2World(world_bounds, GRAVITY, doSleep) self.listener = MyListener() self.listener.test = self self.physicsWorld.SetContactListener(self.listener) self.points=[] self.background = None
def __init__(self,physicalPosition,physicsWorld,imageName,hasPhysics=True,isStatic=False,canRotate=True,userData=""): pygame.sprite.DirtySprite.__init__(self) self.image = ImageHandler()[imageName] # Returns a pygame surface width = self.image.get_width() height = self.image.get_height() self.rect = pygame.Rect(0,0,width,height) if not isinstance(physicalPosition, Vect): physicalPosition = Vect(*physicalPosition) self.physicalPosition = physicalPosition self.physicsWorld = physicsWorld self.hasPhysics = hasPhysics if self.hasPhysics: self._buildPhysics(width,height,canRotate,isStatic) self.body.SetUserData(userData)
def update(self, msSinceLast): ''' Overrides Sprite update ''' if Viewport().hasMoved: self.rect.center = Viewport().convertPhysicalToPixelCoords(self.__physicalPosition) self.dirty = 1 if self.hasPhysics: newPhysicalPosition = Vect(self.body.position.x,self.body.position.y) if newPhysicalPosition != self.physicalPosition: self.physicalPosition = newPhysicalPosition newRotation = self.body.angle if abs(newRotation - self.rotation) > 0.001: self.rotation = newRotation self.dirty = 1 self.image = pygame.transform.rotate(self._image, self.rotation*(180.0/3.14159))
def __init__(self,position,physicsWorld): pygame.sprite.DirtySprite.__init__(self) self.spriteSheetRight = ImageHandler()["walkingRight"] # Returns a pygame surface self.spriteSheetLeft = ImageHandler()["walkingLeft"] # Returns a pygame surface self.spriteSheetJumpR = ImageHandler()["jumpingRight"] # Returns a pygame surface self.spriteSheetJumpL = ImageHandler()["jumpingLeft"] # Returns a pygame surface self.curVel = (0,0) sprite_height = 90 sprite_width = 80 self.rect = pygame.Rect(0,0,sprite_width,sprite_height) if not isinstance(position, Vect): physicalPosition = Vect(*position) self.physicalPosition = position self.physicsWorld = physicsWorld self.spritesRight = list() self.spritesLeft = list() self.sprJumpingRight = list() self.sprJumpingLeft = list() self.sprStandingRight = ImageHandler()["standingRight"] self.sprStandingLeft = ImageHandler()["standingLeft"] for i in xrange(self.spriteSheetRight.get_width() // sprite_width): newSprite = pygame.Surface((sprite_width,sprite_height),pygame.SRCALPHA,32) area = pygame.Rect(i*sprite_width,0,sprite_width,sprite_height) newSprite.blit(self.spriteSheetRight, (0,0), area) newSprite.convert() self.spritesRight.append(newSprite) for i in xrange(self.spriteSheetLeft.get_width() // sprite_width): newSprite = pygame.Surface((sprite_width,sprite_height),pygame.SRCALPHA,32) area = pygame.Rect(i*sprite_width,0,sprite_width,sprite_height) newSprite.blit(self.spriteSheetLeft, (0,0), area) newSprite.convert() self.spritesLeft.append(newSprite) for i in xrange(20): newSprite = pygame.Surface((sprite_width,sprite_height),pygame.SRCALPHA,32) area = pygame.Rect(i*sprite_width,0,sprite_width,sprite_height) newSprite.blit(self.spriteSheetJumpR, (0,0), area) newSprite.convert() self.sprJumpingRight.append(newSprite) for i in xrange(20): newSprite = pygame.Surface((sprite_width,sprite_height),pygame.SRCALPHA,32) area = pygame.Rect(i*sprite_width,0,sprite_width,sprite_height) newSprite.blit(self.spriteSheetJumpL, (0,0), area) newSprite.convert() self.sprJumpingLeft.append(newSprite) self.spriteIndex = 0.0 #self.image = self.spritesRight[int(self.spriteIndex)] self.image = ImageHandler()["standingRight"] self.hasPhysics = True self._buildPhysics(width=sprite_width/2.0,height=sprite_height,canRotate=False,isStatic=False) self.body.SetUserData("spaceman") self.animstate = Spaceman.STANDING_RIGHT self.touchingGround = 0 self.tryingToJump = False
def convertPhysicalToPixelCoords(self, physicalCoords): pixX = physicalCoords[0] * PIXELS_PER_METER - self.pixelVect.x pixY = PIXELS_PER_METER * self.levelHeight - self.pixelVect.y - physicalCoords[ 1] * PIXELS_PER_METER return Vect(int(pixX), int(pixY))
def convertPixelsToPhysicalCoords(self, pixelCoords): physX = (pixelCoords[0] + self.pixelVect.x) / PIXELS_PER_METER physY = (PIXELS_PER_METER * self.levelHeight - pixelCoords[1] - self.pixelVect.y) / PIXELS_PER_METER return Vect(physX, physY)
self.hasMoved = False return cls._instance def convertPixelsToPhysicalCoords(self, pixelCoords): physX = (pixelCoords[0] + self.pixelVect.x) / PIXELS_PER_METER physY = (PIXELS_PER_METER * self.levelHeight - pixelCoords[1] - self.pixelVect.y) / PIXELS_PER_METER return Vect(physX, physY) def convertPhysicalToPixelCoords(self, physicalCoords): pixX = physicalCoords[0] * PIXELS_PER_METER - self.pixelVect.x pixY = PIXELS_PER_METER * self.levelHeight - self.pixelVect.y - physicalCoords[ 1] * PIXELS_PER_METER return Vect(int(pixX), int(pixY)) def move(self, vect): self.pixelVect += vect self.hasMoved = True if __name__ == "__main__": vp = Viewport() vp.levelHeight = 60 vp.pixelVect += Vect(30 * PIXELS_PER_METER, 30 * PIXELS_PER_METER) test = Vect(30, 30) a = vp.convertPhysicalToPixelCoords(test) test2 = vp.convertPixelsToPhysicalCoords(a) print "Test: ", test print "a: ", a print "Test2:", test2