#!/usr/bin/env python # -*- coding: utf-8 -*- import pygame import Image from api.Vector import CVector from api.Math import distVec from Mouse import CMouse class CSprite(pygame.sprite.Sprite): """ An enhanced Sprite class expects a gameEngine.Scene class as its one parameter Use methods to change image, direction, speed Will automatically travel in direction and speed indicated """ def __init__(self, x = 0, y = 0): pygame.sprite.Sprite.__init__(self) self.mPos = CVector(x, y) self.mVel = CVector(0, 0) self.mOffsetX = 0 self.mOffsetY = 0 self.maxSpeed = 50 self.mactive = False self.mclicked = False self.image = pygame.surface.Surface((0, 0), 0) self.rect = self.image.get_rect() def setRegistrationPointOffset(self, aOffsetX, aOffsetY): self.mOffsetX = aOffsetX self.mOffsetY = aOffsetY def setXY(self, aX, aY): self.mPos.setXY(aX, aY) self.calculatePositionWithOffset() def setVelXY(self, aVelX, aVelY): self.mVel.setXY(aVelX, aVelY) self.mVel.truncate(self.maxSpeed) def setVelVec(self, aVec): self.mVel.setXY(aVec.getX(), aVec.getY()) self.mVel.truncate(self.maxSpeed) def setMaxSpeed(self, aMaxSpeed): self.maxSpeed = aMaxSpeed def update(self): self.mPos.add(self.mVel) self.calculatePositionWithOffset() self.mclicked = False if CMouse().firstPress(): if self.rect.collidepoint(CMouse().getPos()): self.mactive = True if self.mactive: if CMouse().release(): self.mactive = False if self.rect.collidepoint(CMouse().getPos()): self.mclicked = True def loadImage(self, aImageFilename, aIsTransparent=True): self.setImage(Image.loadImage(aImageFilename, aIsTransparent)) def setImage(self, aImage): self.image = aImage self.rect = self.image.get_rect() self.calculatePositionWithOffset() def setPosition(self, position): """ place the sprite directly at the given position expects an vector """ self.mPos.setVec(position) def setPosTuple(self, position): """ place the sprite directly at the given position expects an (x, y) tuple """ self.mPos.setXY(position[0], position[1]) def mouseDown(self): """ boolean function. Returns True if the mouse is clicked over the sprite, False otherwise """ self.pressed = False if CMouse().pressed(): if self.rect.collidepoint(CMouse().getPos()): self.pressed = True return self.pressed def mouseOver(self): if not CMouse().pressed(): if self.rect.collidepoint(CMouse().getPos()): return True else: return False else: return False def clicked(self): """ Boolean function. Returns True only if mouse is pressed and released over sprite """ return self.mclicked def distanceTo(self, point): """ returns distance to any point in pixels can be used in circular collision detection """ return distVec(self.mPos, point) def destroy(self): self.image = None def calculatePositionWithOffset(self): self.rect.x = self.mPos.getX() - self.mOffsetX self.rect.y = self.mPos.getY() - self.mOffsetY def getX(self): return self.mPos.getX() def getY(self): return self.mPos.getY() def getSize(self): return (self.rect[2], self.rect[3])