From 0eb075f87d98e8588fa2d8b8bc5f1513d377d8ba Mon Sep 17 00:00:00 2001 From: Fernando Sansberro Date: Sat, 21 Apr 2012 12:19:39 +0000 Subject: Renamed states folder to game. Some improvements in codebase. --- (limited to 'src/api') diff --git a/src/api/Button.py b/src/api/Button.py index cc26f80..f78cda2 100755 --- a/src/api/Button.py +++ b/src/api/Button.py @@ -4,7 +4,7 @@ import pygame import api.Label from api.Label import CLabel -import Mouse +from Mouse import * class CButton(CLabel): @@ -39,13 +39,18 @@ class CButton(CLabel): #check for mouse input - if Mouse.get_pressed() == (1, 0, 0): - if self.rect.collidepoint(Mouse.get_position()): + if CMouse().firstPress(): + if self.rect.collidepoint(CMouse().getPos()): + print("first press in button") self.mactive = True #check for mouse release if self.mactive == True: - if Mouse.get_pressed() == (0, 0, 0): + if CMouse().release(): self.mactive = False - if self.rect.collidepoint(Mouse.get_position()): + if self.rect.collidepoint(CMouse().getPos()): + print("release in button") self.mclicked = True + + def destroy(self): + pass diff --git a/src/api/Game.py b/src/api/Game.py index b3fe189..b49b3ff 100755 --- a/src/api/Game.py +++ b/src/api/Game.py @@ -15,16 +15,21 @@ import api.MultiLabel from api.MultiLabel import CMultiLabel import gc +from api.Mouse import CMouse + from gettext import gettext as _ +import Image + class CGame(object): mInstance = None mState = None mScreen = None mBackground = None - mSampleSprite = None - mSprites = None + mAllSprites = None + mMousePointerSprite = None + mMouse = None mGroups = None mMainSprites = None mClock = None @@ -49,15 +54,20 @@ class CGame(object): print gc.collect(), " deleted objects" self.mState = aState + self.mState.init() def destroy(self): if (self.mState != None): self.mState.destroy() self.mState = None + self.mMouse.destroy() self.mBackground = None + self.mMousePointerSprite.destroy() + self.mMousePointerSprite = None self.mInstance = None # destroy pygame - pygame.quit() + #pygame.quit() + pygame.mouse.set_visible(True) print "destroy" def init(self): @@ -72,38 +82,22 @@ class CGame(object): self.mBackground = pygame.Surface(self.mScreen.get_size()) self.mBackground.fill((255, 0, 0)) - #self.mBackground = CImage.loadImage("assets/images/back_menu.png", False) - - #self.mSampleSprite = CSuperSprite(self) - #self.mSampleSprite.setSpeed(3) - #self.mSampleSprite.setAngle(0) - #self.mSampleSprite.boundAction = self.mSampleSprite.WRAP - + # Sound system initialization. + pygame.mixer.init() #self.mAllSprites = pygame.sprite.Group() Sprites = [] self.mAllSprites = pygame.sprite.LayeredUpdates(Sprites) - - #self.mGroups = [] - #self.mSprites = [self.mSampleSprite] - #self.mMainSprites = pygame.sprite.OrderedUpdates(self.mSprites) - #self.mGroups.append(self.mMainSprites) - - #self.mS2 = CSprite() - #self.mS2.setDX(10) - #self.mS2.velX = 30 - #self.mS2.velY = 0 - #self.mS2.accelY = 1 - #self.mS2.maxSpeed = 200 + pygame.mouse.set_visible(False) + self.mMouse = CMouse() + self.mMousePointerSprite = CSprite() + self.mMousePointerSprite.setImage(Image.loadImage('assets/images/cursor.png', True)) + self.addChild(self.mMousePointerSprite) self.mScreen.blit(self.mBackground, (0, 0)) self.mClock = pygame.time.Clock() self.mQuit = False - - #self.mAllSprites.add(self.mSampleSprite) - #self.mAllSprites.add(self.mS2) - def gameLoop(self): print "start game loop here" @@ -121,6 +115,9 @@ class CGame(object): self.doEvents(event) + self.mMouse.update() + self.mMousePointerSprite.setXY(self.mMouse.getX(), self.mMouse.getY()) + #self.mState.preUpdate() self.mState.update() @@ -144,15 +141,17 @@ class CGame(object): """ pass - def setSprites(self, aSpritesArray): - self.mSprites = aSpritesArray +# def setSprites(self, aSpritesArray): +# self.mSprites = aSpritesArray #self.mGroups = [] #self.mMainSprites = pygame.sprite.OrderedUpdates(self.mSprites) #self.mGroups.append(self.mMainSprites) # Add a sprite to the sprite list. def addChild(self, aSprite, aLayer=0): + self.mAllSprites.remove(self.mMousePointerSprite) self.mAllSprites.add(aSprite, layer=aLayer) + self.mAllSprites.add(self.mMousePointerSprite) def removeChild(self, aSprite): self.mAllSprites.remove(aSprite) @@ -160,4 +159,7 @@ class CGame(object): def setBackground(self, aBackgroundImage): self.mBackground = None self.mBackground = aBackgroundImage - self.mScreen.blit(self.mBackground, (0, 0)) + self.blitBackground(self.mBackground) + + def blitBackground(self, aBackgroundImage): + self.mScreen.blit(aBackgroundImage, (0, 0)) \ No newline at end of file diff --git a/src/api/GameState.py b/src/api/GameState.py new file mode 100644 index 0000000..42c09c7 --- /dev/null +++ b/src/api/GameState.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +class CGameState(object): + + def init(self): + print "CGameState init" + + def update(self): + pass + #print "CGameState update" + + #def render(self): + # print "CGameState render" + + def destroy(self): + print "CGameState destroy" diff --git a/src/api/Math.py b/src/api/Math.py index e87a08c..196a736 100755 --- a/src/api/Math.py +++ b/src/api/Math.py @@ -30,6 +30,8 @@ def toStandardAngle(aAngle): #------------------------------------------------------------------------------- def radToDeg(aAngle): return aAngle * 180 / math.pi + #return aAngle * 180 / 3.1415927 + #------------------------------------------------------------------------------- # degToRad(). @@ -42,8 +44,8 @@ def radToDeg(aAngle): #------------------------------------------------------------------------------- def degToRad(aAngle): return aAngle * math.pi / 180 + #return aAngle * 3.1415927 / 180 def dist(ax1, ay1, ax2, ay2): return math.sqrt((ax2-ax1)**2 + (ay2-ay1)**2) - diff --git a/src/api/Mouse.py b/src/api/Mouse.py index c487c56..bf0e0c8 100755 --- a/src/api/Mouse.py +++ b/src/api/Mouse.py @@ -2,10 +2,60 @@ import pygame +class CMouse(object): + mInstance = None + mInitialized = False + mPressed = False + #mPressedLeastThanOneFrame = False + mPrevPressed = False -def get_position(): - return pygame.mouse.get_pos() + def __new__(self, *args, **kargs): + if (self.mInstance is None): + self.mInstance = object.__new__(self, *args, **kargs) + self.init(self.mInstance) + #else: + # print "Warning: CMouse(): You are not allowed to instantiate it more than once." + return self.mInstance -def get_pressed(): - return pygame.mouse.get_pressed() + def inst(self): + return self.mInstance + + def init(self): + if (self.mInitialized): + return + self.mInitialized = True + + self.mPressed = False + #self.mPressedLeastThanOneFrame = False + self.mPrevPressed = False + + def getPos(self): + return pygame.mouse.get_pos() + + def getX(self): + return pygame.mouse.get_pos()[0] + + def getY(self): + return pygame.mouse.get_pos()[1] + + def pressed(self): + return self.mPressed + + def firstPress(self): + return self.pressed() and not self.mPrevPressed + + def release(self): + return not self.pressed() and self.mPrevPressed + + def update(self): + #print("mouse update") + #print("x=" + str(self.getX())) + #print("y=" + str(self.getY())) + + self.mPrevPressed = self.mPressed; + self.mPressed = (pygame.mouse.get_pressed() == (1, 0, 0)) + + def destroy(self): + self.mInstance = None + print "destroy" diff --git a/src/api/Sprite.py b/src/api/Sprite.py index 456e45f..201f9a3 100644 --- a/src/api/Sprite.py +++ b/src/api/Sprite.py @@ -9,7 +9,7 @@ import api.Math as CMath import api.Vector from api.Vector import CVector -import api.Mouse as Mouse +from Mouse import * # TODO: Cambiar las conversiones de grados a radianes y viceversa usando las funciones. @@ -26,6 +26,13 @@ class CSprite(pygame.sprite.Sprite): Automatically rotates to point in indicated direction Five kinds of boundary collision """ + + mPos = None + + mOffsetX = 0 + mOffsetY = 0 + + mTimeState = 0 def __init__(self): pygame.sprite.Sprite.__init__(self) @@ -36,10 +43,14 @@ class CSprite(pygame.sprite.Sprite): self.mVel = CVector(0.0, 0.0) self.mAccel = CVector(0.0, 0.0) + # Registration point offset. + self.mOffsetX = 0 + self.mOffsetY = 0 + # Speed of the sprite. self.mSpeed = 0 - - self.maxSpeed = 30 + + self.maxSpeed = 50 self.minSpeed = -3 # TODO: Take this values from a constants class. @@ -55,6 +66,8 @@ class CSprite(pygame.sprite.Sprite): # Action for the sprite when it reaches a border. self.mBoundAction = CSprite.WRAP + + #create a default text image as a placeholder #This will usually be changed by a setImage call #self.font = pygame.font.Font("freesansbold.ttf", 30) @@ -68,8 +81,10 @@ class CSprite(pygame.sprite.Sprite): # Set the position of the image. # oldCenter is used to draw the trace in drawTrace(). # oldCenter is the position of the sprite in the previous frame. - self.oldCenter = (self.mPos.getX(), self.mPos.getY()) - self.rect.center = (self.mPos.getX(), self.mPos.getY()) + #self.oldCenter = (self.mPos.getX(), self.mPos.getY()) + #self.rect.center = (self.mPos.getX(), self.mPos.getY()) + + self.calculatePositionWithOffset() # Angle of rotation in degrees used for movement calculations. self.mAngle = 0 @@ -79,16 +94,24 @@ class CSprite(pygame.sprite.Sprite): self.pressed = False self.states = {} self.currentState = "default" + + self.mTimeState = 0 + + def setRegistrationPointOffset(self, aOffsetX, aOffsetY): + self.mOffsetX = aOffsetX + self.mOffsetY = aOffsetY def setXY(self, aX, aY): #print 'alan', dir(self.mPos) - self.mPos.setX(aX) - self.mPos.setY(aY) - self.rect.center = (self.mPos.getX(), self.mPos.getY()) + self.mPos.setXY(aX, aY) + #self.rect.center = (self.mPos.getX(), self.mPos.getY()) + 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()) def setAccelXY(self, aAccelX, aAccelY): self.mAccel.setXY(aAccelX, aAccelY) @@ -97,7 +120,10 @@ class CSprite(pygame.sprite.Sprite): self.maxSpeed = aMaxSpeed def update(self): - self.oldCenter = self.rect.center + + self.mTimeState += 1 + + #self.oldCenter = self.rect.center # Run the logic for the sprite. self.updateLogic() # Calculate next position based on angle and velocity. @@ -106,7 +132,8 @@ class CSprite(pygame.sprite.Sprite): self.__rotateSpriteImage() self.checkBounds() - self.rect.center = (self.mPos.getX(), self.mPos.getY()) + #self.rect.center = (self.mPos.getX(), self.mPos.getY()) + # TODO: Test this. Need to pass a reference to background to draw. # self.drawTrace((255,0,0)) @@ -118,8 +145,9 @@ class CSprite(pygame.sprite.Sprite): if (self.mVel.getY() > self.maxSpeed): self.mVel.setY(self.maxSpeed) - self.mPos.add(self.mVel) - + self.mPos.add(self.mVel) + + self.calculatePositionWithOffset() #--------------------------------------------------------------------------- # updateLogic(). @@ -226,24 +254,30 @@ class CSprite(pygame.sprite.Sprite): if self.mRotation < 0: self.mRotation = 360 - amt - #--------------------------------------------------------------------------- + #---------------------------------------------------------------------------------------------------------- # setImage(). # Loads the given file name as the master image that then is rotated. - # The sprite must be facing east (angle 0). In the main loop the sprite is - # rotated automatically. + # The sprite must be facing east (angle 0). In the main loop the sprite is rotated automatically. # # Parameters: # aImageFilename: File path of the sprite image to be loaded. # aIsTransparent: If the image is transparent (True) or not (True, by default). # # Returns: Nothing. - #--------------------------------------------------------------------------- - def setImage(self, aImageFilename, aIsTransparent=True): - #TODO: loadImage esta en la clase CImage. + #---------------------------------------------------------------------------------------------------------- + def loadImage(self, aImageFilename, aIsTransparent=True): self.mImageMaster = Image.loadImage(aImageFilename, aIsTransparent) - #self.mImageMaster = self.mImageMaster.convert() - self.image = self.mImageMaster + self.setImage(self.mImageMaster) + #self.image = self.mImageMaster + #self.rect = self.image.get_rect() + #self.rect.center = (self.mPos.getX(), self.mPos.getY()) + + def setImage(self, aImage): + self.mImageMaster = aImage + self.image = aImage self.rect = self.image.get_rect() + #self.rect.center = (self.mPos.getX(), self.mPos.getY()) + self.calculatePositionWithOffset() def setDX(self, dx): """ changes dx value and updates vector """ @@ -363,28 +397,28 @@ class CSprite(pygame.sprite.Sprite): clicked over the sprite, False otherwise """ self.pressed = False - if Mouse.get_pressed() == (1, 0, 0): - if self.rect.collidepoint(Mouse.get_position()): + if CMouse().pressed(): + if self.rect.collidepoint(CMouse().getPos()): self.pressed = True return self.pressed - + def mouseOver(self): - if pygame.mouse.get_pressed() == (0, 0, 0): - if self.rect.collidepoint(pygame.mouse.get_pos()): + 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 """ released = False if self.pressed: - if pygame.mouse.get_pressed() == (0, 0, 0): - if self.rect.collidepoint(pygame.mouse.get_pos()): + if (not CMouse().pressed()): + if self.rect.collidepoint(CMouse().getPos()): released = True return released @@ -551,3 +585,22 @@ class CSprite(pygame.sprite.Sprite): # assume it's continue - keep going forever pass + def destroy(self): + pass + + def calculatePositionWithOffset(self): + self.rect = self.image.get_rect() + 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 setTimeState(self, aTimeState): + self.mTimeState = aTimeState + + def getTimeState(self): + return self.mTimeState \ No newline at end of file diff --git a/src/api/Vector.py b/src/api/Vector.py index bd89b9c..e474541 100755 --- a/src/api/Vector.py +++ b/src/api/Vector.py @@ -3,12 +3,12 @@ import math from math import * -EPSILON = 0.000001 - class CVector(object): - #x = 0.0 - #y = 0.0 + x = 0.0 + y = 0.0 + + EPSILON = 0.000001 def __init__(self, aX = 0.0, aY = 0.0): self.x = aX @@ -80,7 +80,7 @@ class CVector(object): self.m = self.magnitude(); # Check division by zero. - if (self.m > EPSILON): + if (self.m > self.EPSILON): self.x /= self.m; self.y /= self.m; -- cgit v0.9.1