# -*- coding: utf-8 -*- import pygame from api.Sprite2 import CSprite from api.Points import CPoints from api.MultiLabel import CMultiLabel from api.Mouse import CMouse import api.Math as CMath import api.Image as Image from api.Vector import CVector from api.Game import CGame from api.GameState import CGameState from api.Button import CButton from api.Globe import Globe import HallState from gettext import gettext as _ from assets.data import area1game6_data STATE_STALE = 0 STATE_DRAG = 1 STATE_ADJUST = 2 STATE_RETURN = 3 STATE_OK = 4 DX = 50 DY = 50 WORD1 = [(DX + 400, DY + 0), (DX + 800, DY + 50)] WORD2a = [(DX + 150, DY + 100), (DX + 350, DY + 150)] WORD2b = [(DX + 400, DY + 100), (DX + 600, DY + 150)] WORD3a = [(DX + 0, DY + 200), (DX + 350, DY + 250)] WORD3b = [(DX + 400, DY + 200), (DX + 800, DY + 250)] WORD4a = [(DX + 250, DY + 300), (DX + 350, DY + 350)] WORD4b = [(DX + 400, DY + 300), (DX + 500, DY + 350)] WORD5a = [(DX + 200, DY + 350), (DX + 350, DY + 400)] WORD5b = [(DX + 400, DY + 350), (DX + 600, DY + 400)] WORD6 = [(DX + 150, DY + 500), (DX + 350, DY + 550)] WORD7 = [(DX + 350, DY + 0), (DX + 400, DY + 600)] OVER_COLOR = (255, 0, 0) NORMAL_COLOR = (255, 125, 50) GOODS = 18 BADS = 9 #Piece class hereda de CSprite class Piece(CSprite): MIN_DISTANCE = 40 TIME_RETURN = 15 TIME_ADJUST = 8 RADIUS_COLLISION = 40 mState = None def __init__(self, aParent, aNum, aOrigin, aDestine): CSprite.__init__(self, aOrigin[0], aOrigin[1]) self.mNum = aNum self.mParent = aParent self.mOrigin = CVector(aOrigin[0], aOrigin[1]) self.mDest = CVector(aDestine[0], aDestine[1]) self.setState(STATE_STALE) def update(self): CSprite.update(self) if (self.mState == STATE_STALE): 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 = CMath.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 (CMath.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 = CMath.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(o) self.mVel = CVector(0.0, 0.0) if (aState == STATE_DRAG): self.mVel = CVector(0.0, 0.0) if (aState == STATE_ADJUST): self.setVelXY((self.mDest.getX() - self.mPos.getX()) / self.TIME_ADJUST, (self.mDest.getY() - self.mPos.getY()) / self.TIME_ADJUST) if (aState == STATE_RETURN): vec = CVector(self.mOrigin.getX() - self.mPos.getX(), self.mOrigin.getY() - self.mPos.getY()) vec.normalize() dist = CMath.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()) 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 CArea1Game6(CGameState): def __init__(self): CGameState.__init__(self) self.mBackground = None #mX = 10 self.mButtonPlay = None self.mEndDialog = None self.mListHelps = [] self.mListPieces = [] self.mListWords = [] self.mActivePiece = None self.mAlphaSet = True self.mHelpShowed = True self.mBBsetted = False self.mNBsetted = True self.mBHsetted = False self.mNHsetted = True self.mHelpActive = None self.mHelpPrevious = None self.mBad = 0 self.mGood = 0 for i in range(10): self.mListHelps.insert(i, None) self.mBackImageN = Image.loadImage('assets/images/back.png') self.mBackImageB = Image.loadImage('assets/images/back_big.png') self.mButtonBack = CSprite(1170, 30) self.mButtonBack.setRegistrationPointOffset(22, 22) self.mButtonBack.setImage(self.mBackImageN) CGame().addChild(self.mButtonBack) self.mBackground = Image.loadImage('assets/images/a1g6/A1G6-fondo.jpg', False) CGame().setBackground(self.mBackground) self.mBase = CSprite(DX, DY) self.mBase.loadImage('assets/images/a1g6/A1G6-base-crucigrama.png', True) CGame().addChild(self.mBase) # load the pieces # parameters: aParent, aNum, aOrigin, aDestine self.mPiece1 = Piece(self, 0, (1000.0, 450.0), (DX + 400.0, DY + 50.0)) self.mPiece1.loadImage('assets/images/a1g6/A1G6-piezas_03.png') self.mListPieces.append(self.mPiece1) self.mPiece2 = Piece(self, 1, (700.0, 725.0), (DX + 525.0, DY + 25.0)) self.mPiece2.loadImage('assets/images/a1g6/A1G6-piezas_04.png') self.mListPieces.append(self.mPiece2) self.mPiece3 = Piece(self, 2, (275.0, 800.0), (DX + 650.0, DY + 25.0)) self.mPiece3.loadImage('assets/images/a1g6/A1G6-piezas_05.png') self.mListPieces.append(self.mPiece3) self.mPiece4 = Piece(self, 3, (450.0, 800.0), (DX + 250.0, DY + 125.0)) self.mPiece4.loadImage('assets/images/a1g6/A1G6-piezas_09.png') self.mListPieces.append(self.mPiece4) self.mPiece5 = Piece(self, 4, (875.0, 450.0), (DX + 400.0, DY + 150.0)) self.mPiece5.loadImage('assets/images/a1g6/A1G6-piezas_10.png') self.mListPieces.append(self.mPiece5) self.mPiece6 = Piece(self, 5, (800.0, 550.0), (DX + 525.0, DY + 125.0)) self.mPiece6.loadImage('assets/images/a1g6/A1G6-piezas_11.png') self.mListPieces.append(self.mPiece6) self.mPiece7 = Piece(self, 6, (675.0, 800.0), (DX + 100.0, DY + 225.0)) self.mPiece7.loadImage('assets/images/a1g6/A1G6-piezas_16.png') self.mListPieces.append(self.mPiece7) self.mPiece8 = Piece(self, 7, (775.0, 620.0), (DX + 250.0, DY + 225.0)) self.mPiece8.loadImage('assets/images/a1g6/A1G6-piezas_17.png') self.mListPieces.append(self.mPiece8) self.mPiece9 = Piece(self, 8, (1125.0, 450.0), (DX + 350.0, DY + 250.0)) self.mPiece9.loadImage('assets/images/a1g6/A1G6-piezas_18.png') self.mListPieces.append(self.mPiece9) self.mPiece10 = Piece(self, 9, (400.0, 725.0), (DX + 450.0, DY + 225.0)) self.mPiece10.loadImage('assets/images/a1g6/A1G6-piezas_19.png') self.mListPieces.append(self.mPiece10) self.mPiece11 = Piece(self, 10, (1075.0, 620.0), (DX + 600.0, DY + 225.0)) self.mPiece11.loadImage('assets/images/a1g6/A1G6-piezas_20.png') self.mListPieces.append(self.mPiece11) self.mPiece12 = Piece(self, 11, (900.0, 620.0), (DX + 300.0, DY + 325.0)) self.mPiece12.loadImage('assets/images/a1g6/A1G6-piezas_24.png') self.mListPieces.append(self.mPiece12) self.mPiece13 = Piece(self, 12, (975.0, 750.0), (DX + 350.0, DY + 375.0)) self.mPiece13.loadImage('assets/images/a1g6/A1G6-piezas_25.png') self.mListPieces.append(self.mPiece13) self.mPiece14 = Piece(self, 13, (1100.0, 750.0), (DX + 450.0, DY + 350.0)) self.mPiece14.loadImage('assets/images/a1g6/A1G6-piezas_26.png') self.mListPieces.append(self.mPiece14) self.mPiece15 = Piece(self, 14, (950.0, 550.0), (DX + 250.0, DY + 375.0)) self.mPiece15.loadImage('assets/images/a1g6/A1G6-piezas_29.png') self.mListPieces.append(self.mPiece15) self.mPiece16 = Piece(self, 15, (540.0, 725.0), (DX + 550.0, DY + 375.0)) self.mPiece16.loadImage('assets/images/a1g6/A1G6-piezas_30.png') self.mListPieces.append(self.mPiece16) self.mPiece17 = Piece(self, 16, (850.0, 750.0), (DX + 350.0, DY + 525.0)) self.mPiece17.loadImage('assets/images/a1g6/A1G6-piezas_34.png') self.mListPieces.append(self.mPiece17) self.mPiece18 = Piece(self, 16, (1100.0, 550.0), (DX + 225.0, DY + 525.0)) self.mPiece18.loadImage('assets/images/a1g6/A1G6-piezas_36.png') self.mListPieces.append(self.mPiece18) # add pieces from the list to the game for piece in self.mListPieces: x , y = piece.getSize() piece.setRegistrationPointOffset(x / 2, y / 2) CGame().addChild(piece) dic_help = area1game6_data.PUZZLE_HELP #self.list_temp = self.dic_help.keys() font28 = pygame.font.Font('assets/fonts/DejaVuSans.ttf', 28) self.mListHelps = [] # Label with the Help (for mouseover) for i in dic_help: l = CMultiLabel() l.bgColor = (255, 125, 50) l.font = font28 l.center = (DX + 910, DY + 75) l.size = (350, 150) l.text = unicode(dic_help[i], 'UTF-8') l._update_image() self.mListHelps.append(l) self.mPoints = CPoints(20, 20) CGame().addChild(self.mPoints) # help button self.mHelpImageN = Image.loadImage('assets/images/help.png') self.mHelpImageB = Image.loadImage('assets/images/help_big.png') self.mButtonHelp = CSprite(1110, 30) self.mButtonHelp.setRegistrationPointOffset(22, 22) self.mButtonHelp.setImage(self.mHelpImageN) CGame().addChild(self.mButtonHelp) alphasurface = pygame.Surface((1200,900)) alphasurface.convert() alphasurface.fill((100,100,100)) alphasurface.set_alpha(200) self.mAlpha = CSprite(0, 0) self.mAlpha.setImage(alphasurface) CGame().addChild(self.mAlpha) self.mButtonAccept = CButton() self.mButtonAccept.bgColor = NORMAL_COLOR self.mButtonAccept.font = font28 self.mButtonAccept.center = (600, 400) self.mButtonAccept.size = (200, 40) self.mButtonAccept.set_text(_('Aceptar')) CGame().addChild(self.mButtonAccept) msg = area1game6_data.HELP self.mInstructions = Globe((450, 150), text=unicode(msg, 'UTF-8'), pico=None) self.mInstructions.set_center((600, 300)) CGame().addChild(self.mInstructions) def update(self): CGameState.update(self) if not(self.mAlphaSet): if self.mButtonBack.mouseOver(): if not(self.mBBsetted): self.mBBsetted = True self.mNBsetted = False self.mButtonBack.setRegistrationPointOffset(27, 27) self.mButtonBack.setImage(self.mBackImageB) else: if not(self.mNBsetted): self.mBBsetted = False self.mNBSetted = True self.mButtonBack.setRegistrationPointOffset(22, 22) self.mButtonBack.setImage(self.mBackImageN) if self.mButtonHelp.mouseOver(): if not(self.mBHsetted): self.mBHsetted = True self.mNHsetted = False self.mButtonHelp.setRegistrationPointOffset(27, 27) self.mButtonHelp.setImage(self.mHelpImageB) else: if not(self.mNHsetted): self.mBHsetted = False self.mNHSetted = True self.mButtonHelp.setRegistrationPointOffset(22, 22) self.mButtonHelp.setImage(self.mHelpImageN) if self.mButtonBack.clicked(): hs = HallState.CHallState() CGame().setState(hs) hs.setCurrentGame(5) return if self.mButtonHelp.clicked(): self.mAlphaSet = True self.mHelpShowed = True CGame().addChild(self.mAlpha) CGame().addChild(self.mInstructions) CGame().addChild(self.mButtonAccept) return x = CMouse().getX() y = CMouse().getY() self.mHelpActive = self._get_help(x, y) # this optimize the repetitive remove/add the same sprite if not (self.mHelpPrevious == self.mHelpActive): if self.mHelpPrevious is not None: CGame().removeChild(self.mListHelps[self.mHelpPrevious]) if self.mHelpActive is not None: CGame().addChild(self.mListHelps[self.mHelpActive]) self.mHelpPrevious = self.mHelpActive if (self.mGood == GOODS) or (self.mBad > BADS): self.mAlphaSet = True CGame().addChild(self.mAlpha) msg = _('Has terminado con %s respuestas bien') % self.mGood self.mEndDialog = Globe((450, 100), text=unicode(msg, 'UTF-8'), pico=None) self.mEndDialog.set_center((600, 300)) CGame().addChild(self.mEndDialog) CGame().addChild(self.mButtonAccept) if (self.mGood == GOODS): CGame().setEndGameState(1, 5, 1) else: if self.mButtonAccept.mouseOver(): self.mButtonAccept.set_bgColor(OVER_COLOR) else: self.mButtonAccept.set_bgColor(NORMAL_COLOR) if self.mButtonAccept.clicked(): if self.mHelpShowed: self.mAlphaSet = False self.mHelpShowed = False self.mButtonAccept.set_bgColor(NORMAL_COLOR) CGame().removeChild(self.mAlpha) CGame().removeChild(self.mInstructions) CGame().removeChild(self.mButtonAccept) else: hs = HallState.CHallState() CGame().setState(hs) hs.setCurrentGame(5) return def _get_help(self, x, y): if CMath.pointInsideRectangle(x,y, WORD1): return 0 elif CMath.pointInsideRectangle(x,y, WORD2a) or CMath.pointInsideRectangle(x,y, WORD2b): return 1 elif CMath.pointInsideRectangle(x,y, WORD3a) or CMath.pointInsideRectangle(x,y, WORD3b): return 2 elif CMath.pointInsideRectangle(x,y, WORD4a) or CMath.pointInsideRectangle(x,y, WORD4b): return 3 elif CMath.pointInsideRectangle(x,y, WORD5a) or CMath.pointInsideRectangle(x,y, WORD5b): return 4 elif CMath.pointInsideRectangle(x,y, WORD6): return 5 elif CMath.pointInsideRectangle(x,y, WORD7): return 6 else: return None def destroy(self): CGameState.destroy(self) CGame().removeChild(self.mEndDialog) CGame().removeChild(self.mButtonBack) CGame().removeChild(self.mButtonHelp) CGame().removeChild(self.mPoints) CGame().removeChild(self.mBase) CGame().removeChild(self.mAlpha) CGame().removeChild(self.mInstructions) CGame().removeChild(self.mButtonAccept) for piece in self.mListPieces: CGame().removeChild(piece) piece = None self.mListPieces = None for h in self.mListHelps: CGame().removeChild(h) self.mListHelps = None self.mButtonBack = None self.mBackground = None self.mWord01 = None self.mHelp01 = None self.mPoints = None