# -*- 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 import HallState 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)] #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) 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 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.mListHelps = [] self.mListPieces = [] self.mListWords = [] self.mActivePiece = None self.dic_help = {} self.mHelpActive = None self.mHelpPrevious = None self.mBad = 0 self.mGood = 0 for i in range(10): self.mListHelps.insert(i, None) self.mBsetted = False self.mNsetted = True self.mBackImageN = Image.loadImage('assets/images/back.png') self.mBackImageB = Image.loadImage('assets/images/back_big.png') self.mButtonBack = CSprite() self.mButtonBack.setRegistrationPointOffset(22, 22) self.mButtonBack.setXY(1170, 30) 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() self.mBase.setXY(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) self.dic_help = area1game6_data.HELP self.list_temp = self.dic_help.keys() self.mListHelps = [] # Label with the Help (for mouseover) for i in range(7): l = CMultiLabel() l.bgColor = (255, 125, 50) l.font = pygame.font.Font('assets/fonts/DejaVuSans.ttf', 28) l.set_center((DX + 910, DY + 75)) l.set_size((350, 150)) l.set_text(unicode(self.dic_help[i], 'UTF-8')) self.mListHelps.append(l) #CGame().addChild(self.mHelp01) self.mPoints = CPoints() self.mPoints.setXY(100, 10) CGame().addChild(self.mPoints) def update(self): #print "menu update" CGameState.update(self) if self.mButtonBack.mouseOver(): if not(self.mBsetted): self.mBsetted = True self.mNsetted = False self.mButtonBack.setRegistrationPointOffset(27, 27) self.mButtonBack.setImage(self.mBackImageB) else: if not(self.mNsetted): self.mBsetted = False self.mNSetted = True self.mButtonBack.setRegistrationPointOffset(22, 22) self.mButtonBack.setImage(self.mBackImageN) if self.mButtonBack.clicked(): #print "clicked clicked back of a1g6" hs = HallState.CHallState() CGame().setState(hs) hs.setCurrentGame(5) return x = CMouse().getX() y = CMouse().getY() #hay algo mas eficiente? if CMath.pointInsideRectangle(x,y, WORD1): self.mHelpActive = 0 elif CMath.pointInsideRectangle(x,y, WORD2a) or CMath.pointInsideRectangle(x,y, WORD2b): self.mHelpActive = 1 elif CMath.pointInsideRectangle(x,y, WORD3a) or CMath.pointInsideRectangle(x,y, WORD3b): self.mHelpActive = 2 elif CMath.pointInsideRectangle(x,y, WORD4a) or CMath.pointInsideRectangle(x,y, WORD4b): self.mHelpActive = 3 elif CMath.pointInsideRectangle(x,y, WORD5a) or CMath.pointInsideRectangle(x,y, WORD5b): self.mHelpActive = 4 elif CMath.pointInsideRectangle(x,y, WORD6): self.mHelpActive = 5 elif CMath.pointInsideRectangle(x,y, WORD7): self.mHelpActive = 6 else: self.mHelpActive = None # 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 def destroy(self): CGameState.destroy(self) CGame().removeChild(self.mButtonBack) CGame().removeChild(self.mPoints) CGame().removeChild(self.mBase) # remove pieces from the game for piece in self.mListPieces: CGame().removeChild(piece) piece = None if self.mHelpActive: CGame().removeChild(self.mHelpActive) self.mButtonBack = None self.mBackground = None self.mWord01 = None self.mHelp01 = None self.mPoints = None