def __init__(self, screen): self.screen = screen self.background_src = consts.DEDUCCION_ASSETS.get('background') self.drop_areas = pygame.sprite.Group() #objetos sin usar self.drop_objects = pygame.sprite.Group() #objetos usados self.used_objects = pygame.sprite.Group() #objetos correctos self.correct_objects = pygame.sprite.Group() self.text_font = pygame.font.Font(consts.FONT_PATH, 20) self.text_font_title = pygame.font.Font(consts.FONT_PATH, 30) self.data = MegamenteData()
class DeduccionScreen(utils.ScreenBaseClass): QUESTION_SIZE = (1096, 125) MESSAGE_SIZE = (400, 200) current_question = None active_sprite = None MAX_RETRIES = 2 retries = 0 def __init__(self, screen): self.screen = screen self.background_src = consts.DEDUCCION_ASSETS.get('background') self.drop_areas = pygame.sprite.Group() #objetos sin usar self.drop_objects = pygame.sprite.Group() #objetos usados self.used_objects = pygame.sprite.Group() #objetos correctos self.correct_objects = pygame.sprite.Group() self.text_font = pygame.font.Font(consts.FONT_PATH, 20) self.text_font_title = pygame.font.Font(consts.FONT_PATH, 30) self.data = MegamenteData() def show_message(self, message): pos = self.translate_percent(30, 30) surface = self.show_text_rect(message, self.text_font, self.MESSAGE_SIZE, pos, consts.COLORS['black'], consts.COLORS['white'], justification=1, alpha=191, parent_background=consts.COLORS['brown'], parent_alpha=191) pygame.display.update() pygame.time.wait(1000) #clearing the message rect = surface.get_rect() #limpian self.refresh_background() pygame.display.update() def run(self): self.set_background() #dibujamos el rectangulito para question question_surface = utils.SurfaceSprite(consts.COLORS['white'], (1120, 150), location=self.translate_percent(3.5, 31.7), alpha=170 ) question_surface.paint(self.background) question_area = utils.ImageSprite( consts.DEDUCCION_ASSETS.get('horizontal_panel'), location=self.translate_percent(4.5, 33) ) question_area.paint(self.background) #area de respuestas answer_surface = utils.SurfaceSprite(consts.COLORS['white'], (1120, 410), location=self.translate_percent(3.5, 52), alpha=170 ) answer_surface.paint(self.background) loc_x, loc_y= self.translate_percent(4.5, 53) arrow = utils.ImageSprite(consts.DEDUCCION_ASSETS.get('arrow')) arrow.rect.top = loc_y + 170 for x in xrange(5): answer_area = utils.ImageSprite(consts.DEDUCCION_ASSETS.get('vertical_panel'), location=(loc_x, loc_y), name=str(x) ) if x < 4: arrow.rect.left = loc_x + 170 arrow.paint(self.background) self.drop_areas.add(answer_area) loc_x += 231 self.drop_areas.draw(self.background) self.refresh_background() self.next_question() def draw_question(self, question): location = self.translate_percent(4.5, 33) options = '\n'.join(self.current_question['pistas']) question = self.current_question['pregunta'] self.show_text_rect(options, self.text_font, self.QUESTION_SIZE, location, consts.COLORS['white'], None, justification=0, alpha=255) question_loc = self.translate_percent(4.5, 5) self.show_text_rect(question, self.text_font_title, self.QUESTION_SIZE, question_loc, consts.COLORS['white'], None, justification=1, alpha=255) def retry_question(self): self.active_sprite = None #moviendo objetos a posicion inicial for sprite in self.used_objects: sprite.move(self.screen, self.background, sprite.initial_pos) self.drop_objects = self.used_objects.copy() self.used_objects.clear(self.screen, self.background) self.used_objects.empty() #vaciando areas donde el sprite se movio for area in self.drop_areas: try: pygame.sprite.spritecollide(area, self.correct_objects, False)[0] area.filled = True except IndexError: area.filled = False self.draw_objects() pygame.display.update() self.detect_click() def next_question(self): #limpiando self.active_sprite = None self.used_objects.clear(self.screen, self.background) self.used_objects.empty() self.correct_objects.clear(self.screen, self.background) self.correct_objects.empty() for s in self.drop_areas: s.filled = False self.current_question = self.data.get_random_question() self.draw_question(self.current_question) #pintando los objetos loc_x, loc_y= self.translate_percent(4.5, 15) object_list = self.data.get_question_objects(self.current_question) for obj in object_list: name = obj.split('/')[3] name = name.split('.')[0] if '-' in name: name = name.split('-')[1] #TODO: quitar esto cuando tenga todos los recursos if not os.path.exists(obj): print 'objeto no existe ', obj obj = 'assets/img/deduccion/notfound.png' obj_sprite = utils.ImageSprite(obj, location=(loc_x, loc_y), name=name) self.drop_objects.add(obj_sprite) loc_x += 231 self.draw_objects() pygame.display.update() self.detect_click() def draw_objects(self): if self.active_sprite: for sprite in self.drop_objects: if sprite.name != self.active_sprite.name: sprite.paint(self.screen) else: self.drop_objects.draw(self.screen) self.used_objects.draw(self.screen) self.correct_objects.draw(self.screen) def detect_game_state(self): answers = self.current_question.get('respuesta') result = WIN if len(self.drop_objects) == 0: #ver si gana.. #comprobar el orden de las preguntas for i, area in enumerate(self.drop_areas): #scar el sprite que esta encima del area try: sprite = pygame.sprite.spritecollide(area, self.used_objects, False)[0] except IndexError: sprite = pygame.sprite.spritecollide(area, self.correct_objects, False)[0] print sprite.name, '*********', answers[int(area.name)].lower(), '****', area.name if sprite.name == answers[int(area.name)].lower(): sprite.remove(self.used_objects) self.correct_objects.add(sprite) print 'correctos ', self.correct_objects print 'usados incorrectos ', self.used_objects else: result = LOSS #esto es para que que la ganada se de fuera del for y poder calcular que objetos estan bien para #repintarlos en el retry if result == LOSS: if self.retries < self.MAX_RETRIES: self.retries += 1 result = RETRY else: self.retries = 0 #limpiamos los objetos del retry return result else: return INCOMPLETE def detect_click(self): while True: while Gtk.events_pending(): Gtk.main_iteration() for event in pygame.event.get(): if event.type == pygame.QUIT: try: pygame.quit() sys.exit() return except Exception, e: return elif event.type == pygame.MOUSEBUTTONDOWN: pos = pygame.mouse.get_pos() touched_sprites = [s for s in self.drop_objects\ if s.rect.collidepoint(pos)] if touched_sprites: self.active_sprite = touched_sprites[0] else: self.active_sprite = None elif event.type == pygame.MOUSEBUTTONUP: pos = pygame.mouse.get_pos() if self.active_sprite: touched_boxes = [s for s in self.drop_areas\ if s.rect.collidepoint(pos)] if touched_boxes: box = touched_boxes[0] if box.filled: self.active_sprite.move(self.screen, self.background, self.active_sprite.initial_pos) self.draw_objects() pygame.display.update() self.active_sprite = None continue self.used_objects.add(self.active_sprite) self.active_sprite.remove(self.drop_objects) self.screen.blit(self.background, self.active_sprite.rect, self.active_sprite.rect) sprite_pos = (box.rect.left + 20 , box.rect.top+130) self.active_sprite.move(self.screen, self.background, sprite_pos) box.filled = True #comprobar ganador game_state = self.detect_game_state() if game_state == WIN: self.show_message(WIN_MESSAGE) self.active_sprite = False box.filled = False self.next_question() elif game_state == LOSS: self.show_message(LOSS_MESSAGE) self.active_sprite = False box.filled = False self.next_question() elif game_state == RETRY: self.retry_question() pygame.display.update() else: self.screen.blit(self.background, self.active_sprite.rect, self.active_sprite.rect) self.active_sprite.move(self.screen, self.background, self.active_sprite.initial_pos) pygame.display.update() self.active_sprite = None elif event.type == pygame.MOUSEMOTION: pos = pygame.mouse.get_pos() if self.active_sprite: self.screen.blit(self.background, self.active_sprite.rect, self.active_sprite.rect) self.draw_question(self.current_question) self.draw_objects() self.active_sprite.move(self.screen, self.background, pos) pygame.display.update() else: pass