# -*- coding: utf-8 -*- import pygame from api.Sprite2 import CSprite from api.Button import CButton from api.Points import CPoints from api.Label import CLabel from api.Mouse import CMouse from api.Globe import Globe import api.Math as Math import api.Image as Image from api.Vector import CVector from api.Game import CGame from api.GameState import CGameState import MenuState from gettext import gettext as _ STATE_STALE = 0 STATE_STALE_UP = 1 STATE_DRAG = 2 STATE_ADJUST = 3 STATE_RETURN = 4 STATE_OK = 5 class Piece(CSprite): MIN_DISTANCE = 40 TIME_RETURN = 15.0 TIME_ADJUST = 8.0 RADIUS_COLLISION = 50 mState = None def __init__(self, aParent, aNum, aOrigin, aDestine): CSprite.__init__(self) # assign variables self.mNum = aNum self.mParent = aParent self.mOrigin = CVector(aOrigin[0], aOrigin[1]) self.setXY(self.mOrigin.getX(), self.mOrigin.getY()) self.mDest = CVector(aDestine[0], aDestine[1]) self.setState(STATE_STALE) def update(self): CSprite.update(self) if (self.mState == STATE_STALE): if not(self.mParent.mAlphaSet): if self.mouseDown() and (self.mParent.mActivePiece == None): self.mParent.mActivePiece = self.mNum #p = self.mParent.mListPieces[self.mNum] #CGame().removeChild(p) #CGame().addChild(p) self.setState(STATE_STALE_UP) elif (self.mState == STATE_STALE_UP): if self.mouseDown(): # and (self.mParent.mActivePiece == None): self.mParent.mActivePiece = self.mNum p = self.mParent.mListPieces[self.mNum] CGame().removeChild(p) CGame().addChild(p) self.setState(STATE_DRAG) elif (self.mState == STATE_DRAG): x, y = CMouse().getPos() self.setXY(x, y) if self.clicked(): d = Math.dist(self.mPos.getX() , self.mPos.getY(), self.mDest.getX(), self.mDest.getY()) if (d < self.MIN_DISTANCE): self.setState(STATE_ADJUST) else: print 'set return' self.setState(STATE_RETURN) self.mParent.mActivePiece = None elif (self.mState == STATE_ADJUST): if (Math.dist(self.mPos.getX() , self.mPos.getY(), self.mDest.getX(), self.mDest.getY()) < self.RADIUS_COLLISION): self.setState(STATE_OK) self.mParent.mGood = self.mParent.mGood + 1 self.mParent.mPoints.set_goods(self.mParent.mGood) elif (self.mState == STATE_RETURN): dist = Math.dist(self.mPos.getX() , self.mPos.getY(), self.mOrigin.getX(), self.mOrigin.getY()) if (dist < self.RADIUS_COLLISION): #play(Sonido mal) self.setState(STATE_STALE) self.mParent.mBad = self.mParent.mBad+ 1 self.mParent.mPoints.set_bads(self.mParent.mBad) elif (self.mState == STATE_OK): pass def setState(self, aState): if (aState == STATE_STALE): #o = CVector(self.mOrigin.getX(), self.mOrigin.getY()) self.setPosition(self.mOrigin) #self.setXY(100, 200) self.mVel = CVector(0.0, 0.0) if (aState == STATE_STALE_UP): #o = CVector(self.mOrigin.getX(), self.mOrigin.getY()) #self.setPosition(self.mOrigin) CGame().addChild(self.mParent.mListOptions[self.mNum]) self.setXY(600, 500) self.mVel = CVector(0.0, 0.0) if (aState == STATE_DRAG): self.mVel = CVector(0.0, 0.0) #CGame().addChild(self.mParent.mListOptions[self.mNum]) if (aState == STATE_ADJUST): self.setVelXY((self.mDest.getX() - self.mPos.getX()) / self.TIME_ADJUST, (self.mDest.getY() - self.mPos.getY()) / self.TIME_ADJUST) CGame().removeChild(self.mParent.mListOptions[self.mNum]) if (aState == STATE_RETURN): vec = CVector(self.mOrigin.getX() - self.mPos.getX(), self.mOrigin.getY() - self.mPos.getY()) vec.normalize() dist = Math.dist(self.mOrigin.getX(), self.mOrigin.getY(), self.mPos.getX(), self.mPos.getY()) vec.mul(dist/self.TIME_ADJUST) self.setVelXY(vec.getX(), vec.getY()) CGame().removeChild(self.mParent.mListOptions[self.mNum]) if (aState == STATE_OK): self.setPosition(self.mDest) self.mVel = CVector(0.0, 0.0) #play(Sonido OK) self.mState = aState def getState(self): return self.mState class CArea1Game1(CGameState): def __init__(self): CGameState.__init__(self) self.mBackground = None self.mInstructions = None self.mButtonPlay = None self.mListOptions = [] self.mListPieces = [] self.mActivePiece = None self.mBad = 0 self.mGood = 0 self.mDialog = None self.mBsetted = False self.mNsetted = True self.mBackground = Image.loadImage('assets/images/a1g1/A1G1-back.jpg', False) CGame().setBackground(self.mBackground) self.mBox = CSprite() self.mBox.setXY(420, 600) self.mBox.loadImage('assets/images/a1g1/A1G1-caja.png') CGame().addChild(self.mBox) self.mElisa = CSprite() self.mElisa.setXY(12, 110) self.mElisa.loadImage('assets/images/a1g1/A1G1-silueta-elisa.png') CGame().addChild(self.mElisa) self.mJuan = CSprite() self.mJuan.setXY(670, 75) self.mJuan.loadImage('assets/images/a1g1/A1G1-silueta-juan.png') CGame().addChild(self.mJuan) self.mBackImageN = Image.loadImage('assets/images/back.png') self.mBackImageB = Image.loadImage('assets/images/back_big.png') self.mButtonBackA1G1 = CSprite() self.mButtonBackA1G1.setRegistrationPointOffset(22, 22) self.mButtonBackA1G1.setXY(1170, 30) self.mButtonBackA1G1.setImage(self.mBackImageN) CGame().addChild(self.mButtonBackA1G1) # load the pieces # parameters: aParent, aNum, aOrigin, aDestine #mujer piece = Piece(self, 0, (600.0, 655.0), (260.0, 460.0)) piece.loadImage('assets/images/a1g1/A1G1-mamas.png') self.mListPieces.append(piece) piece = Piece(self, 1, (630.0, 655.0), (254.0, 549.0)) piece.loadImage('assets/images/a1g1/A1G1-ovarios.png') self.mListPieces.append(piece) piece = Piece(self, 2, (600.0, 655.0), (254.0, 559.0)) piece.loadImage('assets/images/a1g1/A1G1-utero.png') self.mListPieces.append(piece) piece = Piece(self, 3, (630.0, 655.0), (258.0, 630.0)) piece.loadImage('assets/images/a1g1/A1G1-vagina.png') self.mListPieces.append(piece) #hombre piece = Piece(self, 4, (600.0, 665.0), (927.0, 650.0)) piece.loadImage('assets/images/a1g1/A1G1-pene.png') self.mListPieces.append(piece) piece = Piece(self, 5, (630.0, 665.0), (927.0, 588.0)) piece.loadImage('assets/images/a1g1/A1G1-prostata.png') self.mListPieces.append(piece) piece = Piece(self, 6, (600.0, 665.0), (927.0, 656.0)) piece.loadImage('assets/images/a1g1/A1G1-testiculos.png') self.mListPieces.append(piece) piece = Piece(self, 7, (630.0, 665.0), (927.0, 606.0)) piece.loadImage('assets/images/a1g1/A1G1-vesiculas.png') self.mListPieces.append(piece) for p in self.mListPieces: size = p.getSize() p.setRegistrationPointOffset(size[0] / 2 , size[1] / 2) CGame().addChild(p) # load the options pieces = [_('Mamas'), _('Ovarios'), _('Utero'), _('Vagina')] pieces = pieces + [_('Pene'), _('Próstata'), _('Testículos'), _('Vesículas')] for name in pieces: op = CLabel() op.bgColor = (0x99, 0x99, 0x66) op.fgColor = (0xFF, 0xFF, 0xFF) op.font = pygame.font.Font('assets/fonts/DejaVuSans.ttf', 28) op.set_center((600, 400)) op.set_size((200, 40)) op.set_text(unicode(name, 'UTF-8')) self.mListOptions.append(op) self.mPoints = CPoints() self.mPoints.setXY(250, 10) #self.mPoints.set_bads(55) #self.mPoints.set_goods(55) CGame().addChild(self.mPoints) alphasurface = pygame.Surface((1200,900)) alphasurface.convert() alphasurface.fill((100,100,100)) alphasurface.set_alpha(200) self.mAlpha = CSprite() self.mAlpha.setXY(0, 0) self.mAlpha.setImage(alphasurface) self.mAlphaSet = False self.mButtonAccept = CButton() self.mButtonAccept.set_bgColor((125, 255, 125)) self.mButtonAccept.font = pygame.font.Font('assets/fonts/DejaVuSans.ttf', 28) self.mButtonAccept.set_center((600, 400)) self.mButtonAccept.set_size((200, 40)) self.mButtonAccept.set_text(_('Aceptar')) def update(self): #print "menu update" CGameState.update(self) if not(self.mAlphaSet): if self.mButtonBackA1G1.mouseOver(): if not(self.mBsetted): self.mBsetted = True self.mNsetted = False self.mButtonBackA1G1.setRegistrationPointOffset(27, 27) self.mButtonBackA1G1.setImage(self.mBackImageB) else: if not(self.mNsetted): self.mBsetted = False self.mNSetted = True self.mButtonBackA1G1.setRegistrationPointOffset(22, 22) self.mButtonBackA1G1.setImage(self.mBackImageN) if self.mButtonBackA1G1.clicked(): #print "clicked clicked back of a1g1" #cs = CHelpState() ms = MenuState.CMenuState() CGame().setState(ms) return if (self.mGood == 8) or (self.mBad > 4): self.mAlphaSet = True CGame().addChild(self.mAlpha) msg = _('Has terminado con %s respuestas bien') % self.mGood self.mDialog = Globe((450, 100), text=unicode(msg, 'UTF-8'), pico=None) self.mDialog.set_center((600, 300)) CGame().addChild(self.mDialog) CGame().addChild(self.mButtonAccept) else: if self.mButtonAccept.clicked(): ms = MenuState.CMenuState() CGame().setState(ms) return def destroy(self): CGameState.destroy(self) #self.mInstructions.destroy() self.mInstructions = None CGame().removeChild(self.mButtonBackA1G1) CGame().removeChild(self.mPoints) CGame().removeChild(self.mBox) CGame().removeChild(self.mElisa) CGame().removeChild(self.mJuan) self.mPoints = None for p in self.mListPieces: CGame().removeChild(p) for o in self.mListOptions: CGame().removeChild(o) #self.mButtonPlay.destroy() self.mButtonBack = None self.mBackground = None CGame().removeChild(self.mAlpha) CGame().removeChild(self.mDialog) CGame().removeChild(self.mButtonAccept) print "CArea1Game1 destroy" def doEvents(self, aEvent): print aEvent.type