Exemple #1
0
class Game():
    def __init__(self):
        self.sceneManager = SceneManager(self)
        pygame.init()
        self.size = self.width, self.height = 480, 320
        self.backgroundColor = 0, 0, 0
        self.screen = pygame.display.set_mode(self.size)
        self.clock = pygame.time.Clock()
        self.sceneManager.setScene('Menu')
        self.cursor = Cursor(self)
        while 1:
            deltaTime = 1 / float(self.clock.tick(60))
            events = pygame.event.get()
            for event in events:
                if event.type == pygame.QUIT:
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_ESCAPE:
                        sys.exit()
            self.update(deltaTime, events)
            self.screen.fill(self.backgroundColor)
            self.draw(self.screen)
            pygame.display.flip()

    def update(self, deltaTime, events):
        self.cursor.update(deltaTime, events)
        self.sceneManager.update(deltaTime, events)

    def draw(self, screen):
        self.sceneManager.draw(screen)
        self.cursor.draw(screen)
Exemple #2
0
def main():
    pygame.init()
    screen = pygame.display.set_mode([WIDTH, HEIGHT])
    pygame.display.set_caption("pyEdit")

    font = pygame.font.SysFont("consolas", FONT_SIZE)
    font_size = pygame.font.Font.size(font, "a")
    done = False
    camera = Camera()
    cursor = Cursor(0, 0, screen, font_size[0], font_size[1], camera)
    clock = pygame.time.Clock()
    text = Text(cursor, font, FONT_SIZE, font_size, screen, [WIDTH, HEIGHT], camera)
    while not done:
        for event in pygame.event.get():
            if text.handle_event(event):
                done = True

        screen.fill(WHITE)

        text.check_ticks()
        text.draw()

        cursor.draw()

        pygame.display.flip()
        clock.tick(FPS)

    pygame.quit()
Exemple #3
0
class TextInput(SelectableText):
    def __init__(self, screen, **kwargs):
        super().__init__(screen, **kwargs)
        self.rect = Rect(0, 0, kwargs.get("height", 0), kwargs.get("width", 0))
        self.multiline = kwargs.get("multiline", True)
        self.cursor = Cursor(height=self.textheight)
        self.focused = False
        self.highlighted = False
    def update(self, event=None):
        super().update(event)
        if not None in [self.x2, self.y2]:
            self.cursor.x_index = self.x2
            self.cursor.y_index = self.y2
        significant_event = False
        mouse_pos = pygame.mouse.get_pos()
        if event.type == MOUSEBUTTONDOWN and event.button == 1 and self.rect.collidepoint(mouse_pos):
            self.focused = True
            self.cursor.start()
        elif event.type == MOUSEBUTTONDOWN and event.button == 1 and not self.rect.collidepoint(mouse_pos):
            self.focused = False
            self.cursor.stop()
        elif event.type == MOUSEMOTION:
            if self.pressed:
                significant_event = True
            if self.rect.collidepoint(mouse_pos):
                self.highlighted = True
            else:
                self.highlighted = False
        elif event.type == KEYDOWN and self.focused:
            significant_event = True
            if event.key == K_BACKSPACE:
                new_indeces = self.delete_selection()
                if not new_indeces:
                    self.cursor.x_index -= 1
                    if self.cursor.x_index < 0:
                        if self.cursor.y_index > 0:
                            self.cursor.y_index -= 1
                            self.cursor.x_index = len(self.final_lines[self.cursor.y_index].text)
                            self.join_lines(self.cursor.y_index, self.cursor.y_index + 1)
                        else:
                            self.cursor.x_index = 0
                    else:
                        self.delete((self.cursor.x_index, self.cursor.y_index))
                else:
                    self.cursor.x_index, self.cursor.y_index = new_indeces
            elif event.key == K_DELETE:
                new_indeces = self.delete_selection()
                if not new_indeces:
                    if self.cursor.x_index < len(self.final_lines[self.cursor.y_index].text):
                        self.delete((self.cursor.x_index, self.cursor.y_index))
                    else:
                        if self.cursor.y_index < len(self.final_lines) - 1:
                            self.join_lines(self.cursor.x_index, self.cursor.y_index + 1)
                else:
                    self.cursor.x_index, self.cursor.y_index = new_indeces
            elif event.key == K_RETURN:
                if self.multiline:
                    new_indeces = self.delete_selection()
                    if new_indeces:
                        self.cursor.x_index, self.cursor.y_index = new_indeces
                    self.split_line((self.cursor.x_index, self.cursor.y_index))
                    self.cursor.x_index = 0
                    self.cursor.y_index += 1
            elif event.key == K_UP:
                pos = self.get_index_pos((self.cursor.x_index, self.cursor.y_index))
                self.cursor.x_index, self.cursor.y_index = self.get_nearest_index((pos[0], pos[1] - self.textheight))
            elif event.key == K_DOWN:
                pos = self.get_index_pos((self.cursor.x_index, self.cursor.y_index))
                self.cursor.x_index, self.cursor.y_index = self.get_nearest_index((pos[0], pos[1] + self.lineheight))
            elif event.key == K_LEFT:
                if self.cursor.x_index > 0:
                    self.cursor.x_index -= 1
                elif self.cursor.y_index > 0:
                    self.cursor.y_index -= 1
                    self.cursor.x_index = len(self.final_lines[self.cursor.y_index].text)
            elif event.key == K_RIGHT:
                if self.cursor.x_index < len(self.final_lines[self.cursor.y_index].text):
                    self.cursor.x_index += 1
                elif self.cursor.y_index < len(self.final_lines) - 1:
                    self.cursor.y_index += 1
                    self.cursor.x_index = 0
            else:
                new_indeces = self.delete_selection()
                if new_indeces:
                    self.cursor.x_index, self.cursor.y_index = new_indeces
                character = event.unicode
                if len(character) > 0:
                    self.select_none()
                    self.insert((self.cursor.x_index, self.cursor.y_index), character)
                    self.cursor.x_index += 1
        if significant_event:
            self.cursor.event()
        self.change_color()
    def change_color(self):
        if self.highlighted:
            self.color = (0, 0, 200)
        elif self.focused:
            self.color = (0, 0, 150)
        else:
            self.color = (0, 0, 100)
    def draw(self):
        self.cursor.update()
        pygame.draw.rect(self.screen, self.color, self.rect, 2)
        super().draw()
        self.cursor.draw(self.screen, self.get_index_pos((self.cursor.x_index, self.cursor.y_index)))
Exemple #4
0
    def loop(self):
        """
        The main loop

        	@param self -- the JogoDoPiano
	    
        """
        sc = Screen()
        screen = sc.getScreen()

        statusBar = Label(10, 805, [(0, 0), (1, 1), (0, 1)])
        statusBarRight = Label(1100, 805, [(0, 0), (1, 1), (0, 1)])
        #statusBar = Label(10, 10, [(0,0), (1,1), (0,1)])

        lampCursor = Cursor("lamp", 0, 0, [(0, 0), (1, 1), (0, 1)])
        earCursor = Cursor("ear", 0, 0, [(0, 0), (1, 1), (0, 1)])
        lamp = Lamp("lamp", 825, 709, [(836, 721), (868, 721), (836, 779),
                                       (868, 779)], lampCursor)
        #lamp = Lamp("lamp", 825, 709, [(0, 0), (0, 20), (20, 20), (20, 0)], lampCursor)
        game = Game()

        buttons = [
            Key("1", -36, 507, [(28, 508), (0, 566), (0, 639), (31, 649),
                                (49, 602), (30, 595), (58, 514)], game),
            Key("2", 31, 510, [(60, 512), (30, 595), (58, 603), (89, 518)],
                game),
            Key("3", 19, 516, [(89, 518), (59, 603), (49, 602), (34, 649),
                               (88, 664), (100, 615), (84, 610), (104, 520)],
                game),
            Key("4", 85, 517, [(106, 520), (84, 610), (113, 615), (133, 524)],
                game),
            Key("5", 75, 524, [(134, 524), (113, 615), (100, 614), (87, 663),
                               (137, 672), (158, 527)], game),
            Key("6", 131, 527, [(160, 527), (138, 671), (196, 677), (200, 624),
                                (184, 621), (196, 532)], game),
            Key("7", 187, 529, [(194, 532), (184, 621), (213, 623),
                                (221, 536)], game),
            Key("8", 190, 535, [(221, 536), (215, 623), (201, 624), (196, 680),
                                (254, 677), (253, 628), (232, 626),
                                (237, 538)], game),
            Key("9", 234, 534, [(236, 536), (232, 625), (263, 626),
                                (262, 539)], game),
            Key("10", 243, 538,
                [(262, 539), (263, 626), (252, 627), (254, 676), (303, 675),
                 (296, 627), (284, 626), (279, 538)], game),
            Key("11", 282, 532, [(279, 538), (285, 625), (312, 625),
                                 (301, 538)], game),
            Key("12", 295, 540, [(302, 540), (312, 625), (297, 627),
                                 (301, 676), (344, 670), (317, 539)], game),
            Key("13", 320, 537, [(317, 539), (344, 671), (389, 662),
                                 (378, 625), (367, 624), (342, 538)], game),
            Key("14", 342, 532, [(342, 538), (367, 623), (387, 621),
                                 (358, 535)], game),
            Key("15", 358, 535,
                [(358, 535), (387, 620), (378, 625), (389, 661), (432, 651),
                 (418, 618), (407, 619), (376, 534)], game),
            Key("16", 377, 526, [(376, 534), (406, 618), (424, 614),
                                 (394, 530)], game),
            Key("17", 393, 529, [(394, 531), (424, 613), (418, 618),
                                 (431, 653), (473, 639), (411, 529)], game),
            Key("18", 413, 524, [(413, 530), (474, 639), (511, 628),
                                 (496, 603), (484, 605), (434, 525)], game),
            Key("19", 436, 516, [(435, 526), (483, 604), (503, 599),
                                 (456, 521)], game),
            Key("20", 455, 520,
                [(455, 522), (503, 599), (496, 603), (511, 629), (548, 615),
                 (532, 592), (522, 593), (474, 520)], game),
            Key("21", 475, 508, [(473, 520), (522, 592), (542, 585),
                                 (493, 514)], game),
            Key("22", 494, 512,
                [(493, 514), (541, 585), (532, 591), (548, 616), (585, 600),
                 (568, 579), (559, 580), (507, 512)], game),
            Key("23", 510, 502, [(508, 512), (559, 580), (577, 574),
                                 (526, 507)], game),
            Key("24", 526, 506, [(527, 508), (577, 574), (569, 582),
                                 (585, 602), (621, 586), (538, 504)], game),
            Key("25", 539, 496, [(538, 504), (622, 588), (661, 571),
                                 (639, 550), (626, 553), (572, 496)], game),
            Key("26", 572, 485, [(572, 496), (627, 553), (644, 546),
                                 (595, 494)], game),
            Key("27", 595, 492,
                [(596, 493), (645, 546), (639, 551), (662, 572), (698, 562),
                 (672, 538), (664, 539), (610, 491)], game),
            Key("28", 611, 481, [(610, 492), (664, 539), (679, 534),
                                 (632, 488)], game),
            Key("29", 632, 488, [(633, 489), (679, 534), (672, 539),
                                 (698, 562), (729, 553), (646, 488)], game),
            Key("30", 647, 485, [(645, 488), (731, 556), (763, 550),
                                 (739, 531), (728, 531), (671, 485)], game),
            Key("31", 672, 478, [(670, 485), (728, 530), (742, 527),
                                 (690, 484)], game),
            Key("32", 690, 483,
                [(693, 484), (742, 528), (739, 532), (763, 551), (796, 545),
                 (778, 530), (769, 529), (714, 482)], game),
            Key("33", 715, 474, [(714, 483), (770, 529), (784, 525),
                                 (734, 481)], game),
            Key("34", 735, 481,
                [(736, 481), (784, 524), (777, 529), (797, 547), (829, 543),
                 (810, 527), (802, 525), (748, 481)], game),
            Key("35", 746, 472, [(749, 481), (802, 525), (817, 521),
                                 (771, 480)], game),
            Key("36", 771, 482, [(773, 481), (818, 522), (810, 527),
                                 (830, 543), (869, 541), (793, 481)], game),
            Key("37", 794, 481, [(793, 481), (869, 540), (902, 539),
                                 (879, 520), (866, 518), (821, 480)], game),
            Key("38", 823, 472, [(820, 480), (866, 519), (881, 516),
                                 (843, 480)], game),
            Key("39", 843, 480,
                [(843, 480), (881, 518), (878, 520), (902, 539), (936, 537),
                 (909, 515), (899, 516), (852, 480)], game),
            Stick("2", _("Aleluia - Handel - 4 notes"), 892,
                  241, [(1022, 330), (1017, 325), (1011, 327), (1005, 319),
                        (1008, 315), (1010, 301), (1008, 296), (1004, 289),
                        (993, 284), (984, 277), (983, 257), (988, 248),
                        (998, 247), (1007, 247), (1013, 249), (1018, 257),
                        (1020, 269), (1016, 277), (1010, 282), (1007, 285),
                        (1009, 295), (1016, 295), (1021, 326)], game),
            Stick("1", _("Silent Night - Christmas Song - 4 notes"), 885,
                  271, [(1006, 343), (1001, 338), (1006, 330), (1000, 322),
                        (994, 325), (984, 324), (976, 319), (970, 308),
                        (973, 296), (982, 288), (992, 285), (1003, 290),
                        (1008, 299), (1009, 309), (1004, 321), (1010, 327),
                        (1017, 325), (1038, 351)], game),
            Stick("3", _("Save me - Hanson - 4 notes"), 917, 222,
                  [(1039, 351), (1027, 338), (1024, 278), (1031, 276),
                   (1030, 265), (1026, 262), (1019, 256), (1015, 246),
                   (1016, 233), (1026, 229), (1036, 226), (1046, 231),
                   (1049, 238), (1049, 252), (1044, 262), (1036, 266),
                   (1037, 276), (1046, 276), (1049, 352), (1037, 352)], game),
            Stick("4", _("Every breath you take - Sting - 5 notes"), 944, 213,
                  [(1050, 233), (1054, 223), (1063, 218), (1071, 218),
                   (1084, 223), (1087, 235), (1083, 247), (1079, 253),
                   (1070, 250), (1061, 249), (1055, 249), (1053, 248)], game),
            Stick("5", _("Aquarela - Toquinho - 6 notes"), 950, 247,
                  [(1061, 353), (1055, 302), (1063, 299), (1062, 289),
                   (1055, 283), (1048, 276), (1047, 263), (1053, 254),
                   (1059, 250), (1070, 250), (1082, 257), (1086, 271),
                   (1081, 278), (1074, 282), (1070, 289), (1070, 299),
                   (1078, 301), (1081, 351)], game),
            Stick("6", _("Wedding March - Felix Mendelssohn - 7 notes"), 969,
                  202, [(1091, 233), (1091, 239), (1094, 248), (1100, 257),
                        (1108, 257), (1116, 257), (1125, 252), (1128, 242),
                        (1129, 234), (1128, 226), (1122, 222), (1111, 219),
                        (1102, 221), (1096, 226)], game),
            Stick("7", _("Amor Maior - Jota Quest - 8 notes"), 977, 251,
                  [(1081, 352), (1079, 324), (1086, 304), (1093, 308),
                   (1097, 296), (1094, 291), (1090, 283), (1089, 275),
                   (1091, 267), (1096, 263), (1104, 261), (1109, 260),
                   (1114, 262), (1119, 266), (1126, 272), (1126, 279),
                   (1124, 290), (1119, 295), (1108, 298), (1102, 299),
                   (1101, 303), (1098, 311), (1105, 313), (1091, 351)], game),
            Stick("8", _("Greenleaves - Anonymous - 9 notes"), 1014, 211,
                  [(1108, 346), (1118, 296), (1124, 292), (1125, 286),
                   (1127, 279), (1127, 274), (1124, 266), (1129, 267),
                   (1133, 257), (1127, 252), (1128, 251), (1129, 242),
                   (1130, 238), (1130, 230), (1128, 222), (1133, 219),
                   (1136, 217), (1144, 217), (1149, 220), (1155, 226),
                   (1158, 234), (1158, 245), (1152, 252), (1143, 258),
                   (1136, 263), (1135, 267), (1133, 271), (1136, 286),
                   (1134, 278), (1138, 291), (1140, 293), (1140, 301),
                   (1132, 301), (1129, 301), (1126, 316), (1120, 328),
                   (1114, 339), (1111, 344)], game),
            Stick("9", _("Velha Infancia - Tribalistas - 5 notes"), 985, 219,
                  [(1113, 344), (1130, 303), (1139, 303), (1143, 294),
                   (1139, 288), (1136, 282), (1135, 273), (1138, 266),
                   (1140, 262), (1146, 259), (1157, 259), (1167, 260),
                   (1170, 269), (1173, 278), (1171, 286), (1165, 293),
                   (1157, 295), (1149, 297), (1148, 298), (1146, 307),
                   (1151, 309), (1139, 339), (1113, 345)], game),
            Stick("10", _("Jingle Bells - Christmas Song - 11 notes"), 883,
                  496, [(1009, 604), (1002, 560), (1009, 558), (1009, 547),
                        (1004, 545), (996, 543), (991, 533), (990, 526),
                        (995, 513), (997, 510), (1007, 507), (1016, 507),
                        (1021, 511), (1025, 518), (1027, 528), (1024, 536),
                        (1019, 545), (1014, 546), (1014, 557), (1023, 557),
                        (1028, 609)], game),
            Stick("11", _("Habanera - Georges Bizet - 8 notes"), 927, 479,
                  [(1039, 612), (1034, 536), (1040, 533), (1040, 521),
                   (1034, 519), (1029, 515), (1024, 509), (1024, 499),
                   (1026, 490), (1030, 487), (1039, 485), (1048, 484),
                   (1059, 490), (1062, 498), (1062, 509), (1056, 515),
                   (1047, 521), (1046, 523), (1047, 534), (1054, 534),
                   (1059, 612)], game),
            Stick("12", _("Yellow Submarine - Beatles - 10 notes"), 954, 497,
                  [(1060, 609), (1059, 589), (1062, 571), (1066, 552),
                   (1071, 551), (1074, 541), (1068, 537), (1062, 526),
                   (1064, 513), (1071, 504), (1085, 503), (1087, 504),
                   (1096, 512), (1099, 520), (1096, 532), (1089, 539),
                   (1080, 543), (1078, 553), (1086, 556), (1074, 614)], game),
            Stick("13",
                  _("Jesu, Joy of Man's Desiring - J. S. Bach - 12 notes"),
                  995, 495,
                  [(1087, 612), (1105, 549), (1113, 550), (1114, 538),
                   (1110, 533), (1104, 522), (1105, 515), (1112, 506),
                   (1118, 504), (1126, 501), (1134, 503), (1139, 509),
                   (1143, 519), (1139, 533), (1129, 541), (1122, 543),
                   (1117, 553), (1126, 554), (1108, 608)], game),
            Stick("14", _("Symphony No. 9 - Beethoven - 15 notes"), 1027, 515,
                  [(1113, 605), (1133, 566), (1138, 569), (1145, 560),
                   (1142, 551), (1139, 544), (1139, 536), (1145, 529),
                   (1152, 525), (1160, 526), (1169, 529), (1176, 539),
                   (1174, 553), (1169, 560), (1158, 565), (1151, 564),
                   (1146, 572), (1151, 578), (1138, 600)], game), lampCursor,
            earCursor, lamp, statusBar, statusBarRight
        ]

        helps = [
            Help("re", 370, 500, [(0, 0), (1, 1), (0, 1)]),
            Help("re_sust", 380, 458, [(0, 0), (1, 1), (0, 1)]),
            Help("mi", 415, 490, [(0, 0), (1, 1), (0, 1)]),
            Help("fa", 450, 478, [(0, 0), (1, 1), (0, 1)]),
            Help("fa_sust", 455, 435, [(0, 0), (1, 1), (0, 1)]),
            Help("sol", 490, 470, [(0, 0), (1, 1), (0, 1)]),
            Help("sol_sust", 490, 425, [(0, 0), (1, 1), (0, 1)]),
            Help("la", 525, 460, [(0, 0), (1, 1), (0, 1)]),
            Help("la_sust", 530, 417, [(0, 0), (1, 1), (0, 1)]),
            Help("si", 565, 445, [(0, 0), (1, 1), (0, 1)]),
            Help("do", 595, 430, [(0, 0), (1, 1), (0, 1)]),
            Help("do_sust", 600, 395, [(0, 0), (1, 1), (0, 1)]),
            Help("re", 640, 420, [(0, 0), (1, 1), (0, 1)]),
            Help("re_sust", 630, 380, [(0, 0), (1, 1), (0, 1)]),
            Help("mi", 675, 405, [(0, 0), (1, 1), (0, 1)]),
            Help("fa", 708, 402, [(0, 0), (1, 1), (0, 1)]),
            Help("fa_sust", 695, 370, [(0, 0), (1, 1), (0, 1)]),
            Help("sol", 742, 398, [(0, 0), (1, 1), (0, 1)])
        ]

        game.setButtons(buttons, helps)

        stones = [
            Stone("stone", 115, 187, [(116, 188), (159, 188), (159, 234),
                                      (116, 234)], game),
            Stone("stone", 163, 187, [(164, 188), (207, 188), (207, 234),
                                      (164, 234)], game),
            Stone("stone", 211, 187, [(212, 188), (255, 188), (255, 234),
                                      (212, 234)], game),
            Stone("stone", 259, 187, [(260, 188), (303, 188), (303, 234),
                                      (260, 234)], game),
            Stone("stone", 307, 187, [(308, 188), (351, 188), (351, 234),
                                      (308, 234)], game),
            Stone("stone", 355, 187, [(356, 188), (399, 188), (399, 234),
                                      (356, 234)], game),
            Stone("stone", 403, 187, [(404, 188), (447, 188), (447, 234),
                                      (404, 234)], game),
            Stone("stone", 451, 187, [(452, 188), (495, 188), (495, 234),
                                      (452, 234)], game),
            Stone("stone", 498, 187, [(500, 188), (543, 188), (543, 234),
                                      (500, 234)], game),
            Stone("stone", 546, 187, [(548, 188), (591, 188), (591, 234),
                                      (548, 234)], game),
            Stone("stone", 594, 187, [(596, 188), (639, 188), (639, 234),
                                      (596, 234)], game),
            Stone("stone", 642, 187, [(644, 188), (687, 188), (687, 234),
                                      (644, 234)], game),
            Stone("stone", 690, 187, [(692, 188), (735, 188), (735, 234),
                                      (692, 234)], game),
            Stone("stone", 738, 187, [(740, 188), (783, 188), (783, 234),
                                      (740, 234)], game),
            Stone("stone", 786, 187, [(788, 188), (831, 188), (831, 234),
                                      (788, 234)], game)
        ]

        animation = [
            Ball("bar", 80, 287, [(0, 0), (1, 1), (0, 1)], game),
            Ball("redBall", 10, 247, [(8, 247), (100, 247), (100, 338),
                                      (8, 338)], game),
            Ball("greenBall", 10, 247, [(8, 247), (100, 247), (100, 338),
                                        (8, 338)], game),
            Ball("blueBall", 10, 247, [(8, 247), (100, 247), (100, 338),
                                       (8, 338)], game),
            Ball("yellowBall", 10, 247, [(8, 247), (100, 247), (100, 338),
                                         (8, 338)], game),
            Ball("rightBall", 850, 267, [(0, 0), (1, 1), (0, 1)], game)
        ]

        game.addChallenge(
            Challenge("noitefeliz", [20, 22, 20, 17], buttons[40], stones,
                      [5, 7, 5, 2], animation[1], animation[0], animation[5],
                      "easy", game))
        game.addChallenge(
            Challenge("aleluia", [27, 22, 24, 22], buttons[39], stones,
                      [12, 7, 9, 7], animation[3], animation[0], animation[5],
                      "easy", game))
        game.addChallenge(
            Challenge("saveme", [16, 17, 24, 17], buttons[41], stones,
                      [1, 2, 9, 2], animation[2], animation[0], animation[5],
                      "easy", game))
        game.addChallenge(
            Challenge("everybreath", [26, 27, 26, 24, 22], buttons[42], stones,
                      [11, 12, 11, 9, 7], animation[3], animation[0],
                      animation[5], "easy", game))
        game.addChallenge(
            Challenge("aquarela", [15, 15, 20, 20, 19, 17], buttons[43],
                      stones, [0, 0, 5, 5, 4, 2], animation[4], animation[0],
                      animation[5], "easy", game))
        game.addChallenge(
            Challenge("marchanupcial", [25, 24, 19, 22, 20, 18, 15],
                      buttons[44], stones, [10, 9, 4, 7, 5, 3, 0],
                      animation[1], animation[0], animation[5], "easy", game))
        game.addChallenge(
            Challenge("amormaior", [22, 23, 22, 25, 27, 22, 20, 18],
                      buttons[45], stones, [7, 8, 7, 10, 12, 7, 5, 3],
                      animation[2], animation[0], animation[5], "easy", game))
        game.addChallenge(
            Challenge("greenleaves", [17, 20, 22, 24, 25, 24, 22, 19, 15],
                      buttons[46], stones, [], animation[4], animation[0],
                      animation[5], "easy", game))
        game.addChallenge(
            Challenge("velhainfancia", [19, 22, 19, 22, 29], buttons[47],
                      stones, [4, 7, 4, 7, 14], animation[1], animation[0],
                      animation[5], "easy", game))
        game.addChallenge(
            Challenge("jinglebells",
                      [24, 24, 24, 24, 24, 24, 24, 27, 20, 22, 24],
                      buttons[48], stones, [9, 9, 9, 9, 9, 9, 9, 12, 5, 7, 9],
                      animation[1], animation[0], animation[5], "difficult",
                      game))
        game.addChallenge(
            Challenge("habanera", [27, 26, 25, 25, 25, 24, 23, 22],
                      buttons[49], stones, [12, 11, 10, 10, 10, 9, 8, 7],
                      animation[2], animation[0], animation[5], "difficult",
                      game))
        game.addChallenge(
            Challenge("yellow", [27, 27, 27, 27, 29, 24, 22, 22, 22, 22],
                      buttons[50], stones, [12, 12, 12, 12, 14, 9, 7, 7, 7, 7],
                      animation[3], animation[0], animation[5], "difficult",
                      game))
        game.addChallenge(
            Challenge("jesusalegria",
                      [20, 22, 24, 27, 25, 25, 29, 27, 27, 32, 31, 32],
                      buttons[51], stones,
                      [5, 7, 9, 12, 10, 10, 14, 12, 12, 17, 16, 17],
                      animation[0], animation[4], animation[5], "difficult",
                      game))
        game.addChallenge(
            Challenge(
                "nonasinfonia",
                [19, 19, 20, 22, 22, 20, 19, 17, 15, 15, 17, 19, 19, 17, 17],
                buttons[52], stones,
                [4, 4, 5, 7, 7, 5, 4, 2, 0, 0, 2, 4, 4, 2, 2], animation[3],
                animation[0], animation[5], "difficult", game))

        keyboard = pygame.image.load("image/keyboard.png")

        bigBar = pygame.image.load("image/bigBar.png")
        bigBar.set_alpha(None)  # disable alpha.
        bigBar.convert()
        bigBar.set_colorkey((255, 0, 255))  # magenta

        frame = pygame.image.load("image/frame.png")
        frame.set_alpha(None)  # disable alpha.
        frame.convert()
        frame.set_colorkey((255, 0, 255))  # magenta

        bucket1 = pygame.image.load("image/bucket1.png")
        bucket1.set_alpha(None)  # disable alpha.
        bucket1.convert()
        bucket1.set_colorkey((255, 0, 255))  # magenta

        bucket2 = pygame.image.load("image/bucket2.png")
        bucket2.set_alpha(None)  # disable alpha.
        bucket2.convert()
        bucket2.set_colorkey((255, 0, 255))  # magenta

        clock = pygame.time.Clock()
        FPS = 20

        while self.run:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                else:
                    for button in buttons:
                        button.parseEvent(event)
                    for stone in stones:
                        stone.parseEvent(event)
                    for help in helps:
                        help.parseEvent(event)
                    for thing in animation:
                        thing.parseEvent(event)
                    if event.type == MOUSEMOTION:
                        posicao = (event.pos[0], event.pos[1])
                        #pygame.display.set_caption(str(posicao[0])+" x "+str(posicao[1]))

            screen.blit(keyboard, (0, -1))

            for button in buttons:
                button.draw(screen)

            for stone in stones:
                stone.draw(screen)

                for thing in animation:
                    thing.draw(screen)

            screen.blit(frame, (-39, 470))
            screen.blit(bigBar, (114, 274))

            for help in helps:
                help.draw(screen)

            screen.blit(bucket1, (988, 338))
            screen.blit(bucket2, (987, 597))

            lampCursor.draw(screen)
            earCursor.draw(screen)

            #update the surface in the screen
            pygame.display.flip()

            #control number of frames per second
            clock.tick(FPS)
Exemple #5
0
class ColorGrid:

    # None = empty cell
    # 1 - 4 = color cell

    # (n) by (n) grid
    def __init__(self, n):
        self.blockFactory = BlockFactory()
        self.grid = []
        #add second, empty grid
        for i in range(n):
            self.grid.append([])
            for j in range(n):
                self.grid[i].append(None)
        #create grid filled with blocks
        for i in range(n):
            self.grid.append([])
            for j in range(n):
                cellPos = (j * (cellWidth + padding),
                           (n + i) * (cellHeight + padding))
                self.grid[n + i].append(self.blockFactory.build(cellPos))
        self.n = n
        self.center = (n * (cellWidth + padding) / 2, n *
                       (cellHeight + padding) + n * (cellHeight + padding) / 2)

        #cursor set to (0,0) on the grid
        self.cursor = Cursor(n, n, [n - 1, 0])

    def rotateClock(self):
        for i in range(3):
            self.rotateCounter()

    def rotateCounter(self):
        N = self.n
        for x in range(0, int(N / 2)):
            for y in range(x, N - x - 1):
                top = ((x + N), y)
                right = ((y + N), (N - 1 - x))
                bottom = ((N - 1 - x + N), (N - 1 - y))
                left = ((N - 1 - y + N), (x))
                self.grid[top[0]][top[1]].rotate()
                self.grid[right[0]][right[1]].rotate()
                self.grid[bottom[0]][bottom[1]].rotate()
                self.grid[left[0]][left[1]].rotate()
                self.swapCells(top, left)
                self.swapCells(top, bottom)
                self.swapCells(top, right)
        self.rotateCursor(True)

    #coord - (row,col)
    def getCell(self, coord):
        return self.grid[coord[0]][coord[1]]

    #A / B = (row,col) of desired cells
    def swapCells(self, A, B):
        temp = self.grid[A[0]][A[1]]
        self.grid[A[0]][A[1]] = self.grid[B[0]][B[1]]
        self.grid[B[0]][B[1]] = temp
        cellA = self.grid[A[0]][A[1]]
        cellB = self.grid[B[0]][B[1]]
        if cellA != None:
            cellA.updatePosition(
                (A[1] * (cellWidth + padding), A[0] * (cellHeight + padding)))
        if cellB != None:
            cellB.updatePosition(
                (B[1] * (cellWidth + padding), B[0] * (cellHeight + padding)))

    def moveCursor(self, key):
        self.cursor.move(key)

    def rotateCursor(self, counter=True):
        currPos = self.cursor.getPosition()
        n = self.n
        xMin = min(currPos[1], n - currPos[1] - 1)
        yMin = min(currPos[0], n - currPos[0] - 1)
        layer = min(xMin, yMin)
        #top
        if currPos[0] - layer == 0:
            if counter == False:
                #top - > right
                self.cursor.setPosition((currPos[1], self.n - 1 - layer))
            else:
                #top -> left
                self.cursor.setPosition((self.n - currPos[1] - 1, layer))
        #bottom
        elif currPos[0] + layer == self.n - 1:
            if counter == False:
                #bottom -> left
                self.cursor.setPosition((currPos[1], layer))
            else:
                #bottom -> right
                self.cursor.setPosition(
                    (self.n - currPos[1] - 1, self.n - 1 - layer))
        else:
            #left
            if currPos[1] - layer == 0:
                if counter == False:
                    #left -> top
                    self.cursor.setPosition((layer, self.n - currPos[0] - 1))
                else:
                    #left -> bottom
                    self.cursor.setPosition((self.n - 1 - layer, currPos[0]))
            #right
            else:
                if counter == False:
                    #right -> bottom
                    self.cursor.setPosition(
                        (self.n - 1 - layer, self.n - currPos[0] - 1))
                else:
                    #right -> top
                    self.cursor.setPosition((layer, currPos[0]))

    def deleteBlock(self):
        self.grid[self.cursor.position[0] +
                  self.n][self.cursor.position[1]] = None

    def getVerticalMatches(self, minMatchLength):
        matchSet = set([])
        #check bottom -> top
        for col in range(self.n):
            matchStack = []
            #only check the bottom grid (n/2)
            for row in range(self.n - 1, self.n * 2, 1):
                cell = self.grid[row][col]
                if cell != None:
                    if len(matchStack) == 0 or cell.getColor() == self.grid[
                            matchStack[0][0]][matchStack[0][1]].getColor():
                        matchStack.append((row, col))
                    else:
                        if len(matchStack) >= minMatchLength:
                            for cell in matchStack:
                                matchSet.add(cell)
                        matchStack = [(row, col)]
                else:
                    if len(matchStack) >= minMatchLength:
                        for cell in matchStack:
                            matchSet.add(cell)
                    matchStack = []
            if len(matchStack) >= minMatchLength:
                for cell in matchStack:
                    matchSet.add(cell)
        return matchSet

    def getHorizontalMatches(self, minMatchLength):
        matchSet = set([])
        #check L -> R
        #only check the bottom grid (n/2)
        for rowIndex in range(self.n - 1, self.n * 2, 1):
            rowList = self.grid[rowIndex]
            matchStack = []
            for cellIndex, cell in enumerate(rowList):
                if cell != None:
                    if len(matchStack) == 0 or cell.getColor() == self.grid[
                            matchStack[0][0]][matchStack[0][1]].getColor():
                        matchStack.append((rowIndex, cellIndex))
                    else:
                        if len(matchStack) >= minMatchLength:
                            for cell in matchStack:
                                matchSet.add(cell)
                        matchStack = [(rowIndex, cellIndex)]
                else:
                    if len(matchStack) >= minMatchLength:
                        for cell in matchStack:
                            matchSet.add(cell)
                    matchStack = []
            if len(matchStack) >= minMatchLength:
                for cell in matchStack:
                    matchSet.add(cell)
        return matchSet

    def getMatches(self, minMatchLength):
        return self.getHorizontalMatches(minMatchLength).union(
            self.getVerticalMatches(minMatchLength))

    def removeMatches(self, matchList):
        for matchCell in matchList:
            self.grid[matchCell[0]][matchCell[1]] = None

    def moveCellsDown(self):
        colList = []
        for col in range(self.n):
            emptyStack = []
            toMove = []
            for row in range(self.n * 2 - 1, -1, -1):
                if self.grid[row][col] == None:
                    emptyStack.append((row, col))
                else:
                    if self.grid[row][col].getIsMoveable(
                    ) and len(emptyStack) > 0:
                        toMove.append(((row, col), emptyStack.pop(0)))
                        emptyStack.append((row, col))
                    if self.grid[row][col].getIsMoveable() == False:
                        emptyStack = []
            if len(toMove) > 0:
                colList.append(toMove)
        if len(colList) > 0:
            return colList
        return None

    def getEmptyCells(self):
        emptyCellList = []
        for col in range(self.n):
            for row in range(self.n, self.n * 2, 1):
                if self.grid[row][col] == None:
                    emptyCellList.append((row, col))
                else:
                    break
        return emptyCellList

    def spawnNewCells(self, emptyCells):
        for cell in emptyCells:
            self.grid[cell[0] - self.n][cell[1]] = self.blockFactory.build(
                (cell[1] * (cellWidth + padding),
                 (cell[0] - self.n) * (cellHeight + padding)))

    def scaleCells(self, cellList, factor):
        for index in cellList:
            self.grid[index[0]][index[1]].scale(factor)

    def rotateCells(self, cellList, factor):
        for index in cellList:
            self.grid[index[0]][index[1]].rotateInPlace(factor)

    def rotateGrid(self, factor):
        #t = (self.center[0] - 30, self.n*60 + int(self.n/2)*60)
        t = (self.center[0] - 5, self.center[1] - 5)
        for row in self.grid:
            for cell in row:
                if cell != None:
                    #cell.rotateInPlace(-factor)
                    cell.rotateAroundPoint(t, factor)
        self.cursor.poly.rotateAroundPoint(t, factor)

    def draw(self, screen, position, drawCursor=True):
        for row in range(self.n * 2):
            for col in range(self.n):
                if self.grid[row][col] != None:
                    self.grid[row][col].draw(screen, position)
        cursorX = self.cursor.position[1] * (cellWidth + padding) - (
            abs(cellWidth - self.cursor.width)) / 2
        cursorY = (self.cursor.position[0] + self.n) * (
            cellHeight + padding) - (abs(cellHeight - self.cursor.height)) / 2
        #print(position)
        if drawCursor:
            #self.cursor.draw(screen, (position[0] + cursorX, position[1] + cursorY))
            self.cursor.draw(screen, position)

    def __str__(self):
        outStr = ""
        for i in range(len(self.grid)):
            for cell in self.grid[i]:
                cellStr = str(cell)
                if cell == None:
                    cellStr = "0"
                for j in range(len(cellStr), 3):
                    cellStr += " "
                outStr += cellStr + " "
            outStr += "\n"
        return outStr
Exemple #6
0
        popup.draw(screen)
        pass
    elif GameStateEnum.running == gamestate.getState():
        """ Update """
        level.update()

        """ Draw """
        level.draw(screen)
        pass
    elif GameStateEnum.shop == gamestate.getState():
        """ Upfdate """

        """ Draw """
        shop.draw(screen)

    cursor.draw(screen)


    # --- Go ahead and update the screen with what we've drawn.
    pygame.display.flip()

    # --- Limit to 30 frames per second
    clock.tick(30)

pygame.quit()

# prob junk code
def set_game_state(state):
    global gamestate
    gamestate = state
class WorldMapBackground(object):
    def __init__(self, sprite, labels=True):
        self.x = 0
        self.y = 0
        self.sprite = sprite

        # for easing
        self.easing_flag = False
        self.target_x = 0
        self.target_y = 0
        self.old_x = 0
        self.old_y = 0
        self.start_time = 0

        # Dictionary of world map sprites
        self.wm_sprites = {}

        # Labels for world map
        self.wm_labels = []
        if labels:
            self.parse_labels('Data/world_map_labels.txt')

        # Highlights
        self.wm_highlights = []

        # Cursor
        self.cursor = None

    def parse_labels(self, fp):
        with open(fp, 'r') as label_data:
            for line in label_data:
                split_line = line.strip().split(';')
                coord = (int(split_line[1]), int(split_line[2]))
                if split_line[3] == '1':
                    font = GC.FONT['chapter_yellow']
                else:
                    font = GC.FONT['chapter_green']
                self.add_label(split_line[0], coord, font)

    def add_label(self, name, position, font=GC.FONT['chapter_yellow']):
        self.wm_labels.append(WMLabel(name, position, font))

    def clear_labels(self):
        self.wm_labels = []

    def add_highlight(self, sprite, position):
        self.wm_highlights.append(WMHighlight(sprite, position))

    def clear_highlights(self):
        for highlight in self.wm_highlights:
            highlight.remove()

    def add_sprite(self, name, klass, gender, team, position):
        # Key is string assigned by user. Value is units class, gender, team, starting_position
        self.wm_sprites[name] = WMSprite(klass, gender, team, position)

    def remove_sprite(self, name):
        del self.wm_sprites[name]

    def move_sprite(self, name, new_pos):
        if name in self.wm_sprites:
            self.wm_sprites[name].move(new_pos)
        elif cf.OPTIONS['debug']:
            print('Error! ', name, ' not in self.wm_sprites')

    def quick_move(self, new_pos):
        self.x += new_pos[0]
        self.y += new_pos[1]

        self.x, self.y = self.bound(self.x, self.y)

    def move(self, new_pos):
        self.old_x = self.x
        self.old_y = self.y
        self.target_x = self.x + new_pos[0]
        self.target_y = self.y + new_pos[1]
        self.start_time = Engine.get_time()
        self.easing_flag = True

        self.target_x, self.target_y = self.bound(self.target_x, self.target_y)

    def bound(self, x, y):
        x = Utility.clamp(x, 0, self.sprite.get_width() - GC.WINWIDTH)
        y = Utility.clamp(y, 0, self.sprite.get_height() - GC.WINHEIGHT)
        return x, y

    def create_cursor(self, coord):
        from Cursor import Cursor
        self.cursor = Cursor('Cursor', coord, fake=True)

    def remove_cursor(self):
        self.cursor = None

    def draw(self, surf):
        # === UPDATE ===
        # Handle easing
        current_time = Engine.get_time()
        if self.easing_flag:
            self.x = Utility.easing(current_time - self.start_time, self.old_x,
                                    self.target_x - self.old_x, 400)
            self.y = Utility.easing(current_time - self.start_time, self.old_y,
                                    self.target_y - self.old_y, 400)
            if self.target_x > self.old_x and self.x >= self.target_x or \
               self.target_x < self.old_x and self.x <= self.target_x or \
               self.target_y > self.old_y and self.y >= self.target_y or \
               self.target_y < self.old_y and self.y <= self.target_y:
                self.easing_flag = False
                self.x = self.target_x
                self.y = self.target_y

        # === DRAW ===
        image = Engine.copy_surface(self.sprite)
        # Highlights
        for highlight in self.wm_highlights:
            highlight.draw(image)
        self.wm_highlights = [
            highlight for highlight in self.wm_highlights
            if not highlight.remove_clear
        ]
        # Draw label
        for label in self.wm_labels:
            label.draw(image)
        # Update world_map_sprites
        for key, wm_unit in self.wm_sprites.items():
            wm_unit.update()
        # World map sprites
        for key, wm_unit in self.wm_sprites.items():
            wm_unit.draw(image)
        # Cursor
        if self.cursor:
            self.cursor.image = Engine.subsurface(
                self.cursor.passivesprite,
                (GC.CURSORSPRITECOUNTER.count * GC.TILEWIDTH * 2, 0,
                 GC.TILEWIDTH * 2, GC.TILEHEIGHT * 2))
            self.cursor.draw(image)

        image = Engine.subsurface(image,
                                  (self.x, self.y, GC.WINWIDTH, GC.WINHEIGHT))
        surf.blit(image, (0, 0))
class Game(arcade.Window):
    def __init__(self):
        super().__init__(WIDTH, HEIGHT, NAME)

        arcade.set_background_color(arcade.color.WHITE)

        self.SERVER = socket.gethostbyname(socket.gethostname())
        self.PORT = 5050
        self.ADDR = (self.SERVER, self.PORT)
        self.FORMAT = 'utf-8'

        try:
            self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.client.setblocking(1)
            self.client.connect(self.ADDR)
        except:
            pass

        self.board_draw = Board()
        self.board = {
            '7': ' ',
            '8': ' ',
            '9': ' ',
            '4': ' ',
            '5': ' ',
            '6': ' ',
            '1': ' ',
            '2': ' ',
            '3': ' '
        }

        self.button_list = []
        self.popup_list = []
        self.cursor = Cursor()

        self.client_ID = None

        self.my_turn = False
        self.game_over = False

        #SERVER REQUEST BOOLS
        self.board_request = False
        self.ID_request = False

        self.player_2 = False
        self.request_reset = False
        self.reset_state = False
        self.clear_state = False

        self.winner = None

        self.popup = Popup(WIDTH / 2, HEIGHT / 2 - HEIGHT / 4, 1)
        self.game_over_popup = Popup(WIDTH / 2, HEIGHT / 2 - HEIGHT / 4, 2)
        self.restart_popup = Popup(WIDTH / 2, HEIGHT / 2 - HEIGHT / 2.5, 3)
        self.popup_list.append(self.restart_popup)

        for x in range(1, 10):
            button = Button(x)
            self.button_list.append(button)

    def col_circle_square(self, tx, ty, tr, cx, cy, cr):
        dx = tx - cx
        dy = ty - cy
        distance = math.sqrt(dx * dx + dy * dy)

        if distance < tr + cr:
            return True

    def detect_collision(self, rect1, rect2):
        if (rect1[0] < rect2[0] + rect2[2] and rect1[0] + rect1[2] > rect2[0]
                and rect1[1] < rect2[1] + rect2[3]
                and rect1[1] + rect1[3] > rect2[1]):
            return True

    def decode_board(self, msg):
        utf_json = msg.decode(self.FORMAT)
        json_list = json.loads(utf_json)
        return json_list

    def clear_board(self):
        for x in self.board:
            if self.board[str(x)] == 'X' or self.board[str(x)] == 'O':
                self.board[str(x)] = " "

    def clear_game(self):
        try:
            if self.clear_state:
                msg = '!c'
                self.client.send(msg.encode(self.FORMAT))

                reply = self.client.recv(16)
                reply_decode = reply.decode(self.FORMAT)

                if reply_decode == '!r':
                    self.clear_board()
                    self.game_over = False
                    self.clear_state = False
                    if self.client_ID == 2:
                        self.my_turn = False

        except Exception as e:
            print(e)

    def check_win(self):
        print('2')
        try:
            if not self.clear_state:
                msg = '!w'
                self.client.send(msg.encode(self.FORMAT))
                reply = self.client.recv(128)
                reply_decode = reply.decode(self.FORMAT)

                if reply_decode == 'X':
                    self.winner = 'X'
                    self.game_over = True
                elif reply_decode == 'O':
                    self.winner = 'O'
                    self.game_over = True
                elif reply_decode == '!p':
                    self.game_over = False
                elif reply_decode == '!o':
                    self.game_over = True

        except Exception as e:
            print(e)

    def player_2_connected(self):
        try:
            if self.client_ID == 1:
                if not self.player_2:
                    msg = '!p'
                    self.client.send(msg.encode(self.FORMAT))

                    reply = self.client.recv(2)
                    if reply.decode(self.FORMAT) == '!t':
                        self.player_2 = True
                    else:
                        self.player_2 = False
            elif self.client_ID == 2:
                self.player_2 = True

        except Exception as e:
            print(e)

    def send_board_request(self):
        print('4')
        try:
            if not self.board_request:
                msg = '!board'
                request = msg.encode(self.FORMAT)
                self.client.send(request)

                new_msg = self.client.recv(92)
                utf_string = new_msg.decode(self.FORMAT)
                json_list = json.loads(utf_string)

                self.board = json_list[0]
                self.board_request = True

        except:
            traceback.print_exc()

    def send_ID_request(self):
        try:
            if not self.client_ID:
                msg = '!ID'
                request = msg.encode(self.FORMAT)
                self.client.send(request)

                new_msg = self.client.recv(6)
                message = new_msg.decode(self.FORMAT)
                self.client_ID = int(message)

        except Exception as e:
            pass

    def request_turn(self):
        print('6')
        try:
            if not self.my_turn:
                if self.client_ID:
                    if self.client_ID == 1:
                        msg = '!t1'
                    else:
                        msg = '!t2'

                    self.client.send(msg.encode(self.FORMAT))
                    reply = self.client.recv(2)
                    decoded_reply = reply.decode(self.FORMAT)

                    if decoded_reply == '!t':
                        self.my_turn = True
                        self.board_request = False
                    else:
                        self.my_turn = False

                    self.check_win()

        except Exception as e:
            print(e)

    def on_draw(self):
        arcade.start_render()

        self.board_draw.draw()

        for button in self.button_list:
            button.draw()

        self.cursor.draw()

        if self.client_ID == 1:
            if not self.my_turn or not self.player_2:
                if not self.game_over:
                    self.popup.draw()
        elif self.client_ID == 2:
            if not self.my_turn:
                if not self.game_over:
                    self.popup.draw()

        if self.game_over:
            self.game_over_popup.draw()
            self.restart_popup.draw()

        arcade.finish_render()

    def update(self, delta_time: float):
        self.cursor.update(self._mouse_x, self._mouse_y)

        self.player_2_connected()
        self.send_ID_request()

        if not self.clear_state:
            self.request_turn()
            self.send_board_request()
        elif self.clear_state:
            self.clear_game()

        for button in self.button_list:
            button.update(self.board)

        self.restart_popup.update(self.cursor)

    def on_mouse_press(self, x: float, y: float, button: int, modifiers: int):
        if self.my_turn and not self.game_over:
            if self.player_2:
                if button == 1:
                    c = self.cursor
                    for button in self.button_list:
                        if button.value == button.B:
                            if self.col_circle_square(button.x, button.y,
                                                      button.r, c.x, c.y, c.r):
                                col_list = []
                                col_list.append(button)
                                if (len(col_list) > 1):
                                    col_list.RemoveRange(
                                        0,
                                        col_list.count() - 1)

                                com = '!sub'
                                com_encode = com.encode(self.FORMAT)
                                self.client.send(com_encode)
                                msg = str(col_list[0].ID)
                                self.client.send(msg.encode(self.FORMAT))
                                col_list.clear()
                                self.my_turn = False
                                self.board_request = False
        elif self.game_over:
            if self.restart_popup.colliding:
                self.clear_state = True

    def on_mouse_drag(self, x: float, y: float, dx: float, dy: float,
                      buttons: int, modifiers: int):
        pass
        '''for button in self.button_list:
            if button.dragging:
                button.x, button.y = self.cursor.x, self.cursor.y'''

    def on_mouse_release(self, x: float, y: float, button: int,
                         modifiers: int):
        pass
        '''for button in self.button_list: