Ejemplo n.º 1
0
class Construct:
    def __init__(self, width, height):
        self.width = width
        self.height = height
        self.win = pygame.display.set_mode([self.width, self.height],
                                           flags=pygame.RESIZABLE)
        self.bg = pygame.image.load(os.path.join("game_assets", "bg.png"))
        self.pos = []
        self.lamps = []
        self.stock = Lamp(25, self.height - 25, 1)
        self.press = False
        self.connected = []
        pygame.font.init()
        self.myfont = pygame.font.SysFont('Comic Sans MS', 30)
        self.draw_line = False
        self.mouse_pos = []
        self.charge_lamp = ""
        self.index_charge = 0
        self.lock = False
        self.charge = []
        self.positions = []
        self.connected_lamps = []

    def draw(self, mouse_pose):
        self.win.blit(self.bg, [0, 0])
        self.stock.draw_lamp(self.win, True)
        if mouse_pose:
            pygame.draw.aaline(self.win, (0, 0, 0), pos_line, mouse_pose)
        for la in self.lamps:
            la.draw(self.win)
        for la in self.lamps:
            la.draw_lamp(self.win, False)
        pygame.draw.rect(self.win, (255, 255, 255),
                         (self.width - 155, 0, 150, 40))
        text = self.myfont.render("Сохранить", False, (0, 0, 0))
        self.win.blit(text, (self.width - 155, 0))

    def save(self):
        for la in self.lamps:
            conn = []
            self.charge.append(la.charge)
            self.positions.append(la.pos)
            for cntd in la.connected:
                index = self.lamps.index(cntd)
                conn.append(index)
            self.connected_lamps.append(conn)
        root = Tk()
        root.wm_attributes('-topmost', 1)
        foo = askopenfilename()
        root.destroy()
        if not foo:
            foo = "save.txt"
        f = open(foo, 'w')
        f.write("\"connected:\"" + str(self.connected_lamps) + ',\n')
        f.write("\"pos:\"" + str(self.positions) + ',\n')
        f.write("\"charge:\"" + str(self.charge) + '\n')
        f.close()
        self.positions = []
        self.charge = []
        self.connected_lamps = []

    def run(self):
        run = True
        clock = pygame.time.Clock()
        self.lock = False
        while run:
            clock.tick(60)
            pygame.display.update()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                if event.type == pygame.VIDEORESIZE:
                    self.width = event.w
                    self.height = event.h
                    self.win = pygame.display.set_mode(
                        [self.width, self.height], flags=pygame.RESIZABLE)
                    self.bg = pygame.transform.scale(self.bg,
                                                     [event.w, event.h])
                if event.type == pygame.MOUSEBUTTONDOWN:
                    pos_mouse = event.pos[0], event.pos[1]
                    global lamp
                    global connected_lamp
                    if event.button == 1 and not self.lock:
                        if self.stock.lamp_rect.collidepoint(pos_mouse):
                            self.press = True
                            self.lamps.append(
                                Lamp(pos_mouse[0], pos_mouse[1], 0))
                            lamp = self.lamps[len(self.lamps) - 1]
                        for la in self.lamps:
                            if la.lamp_rect.collidepoint(pos_mouse):
                                self.press = True
                                lamp = la
                        if self.width - 155 < event.pos[0] < self.width:
                            if 0 < event.pos[1] < 40:
                                self.save()

                    if event.button == 2 and not self.lock:
                        for i in range(len(self.lamps)):
                            la = self.lamps[i]
                            if la.lamp_rect.collidepoint(pos_mouse):
                                self.lock = True
                                self.index_charge = i
                                la.lamp_on = pygame.transform.scale(
                                    la.lamp_on, [100, 100])

                    if event.button == 3 and not self.lock:
                        self.draw_line = True
                        global pos_line
                        for i in range(len(self.lamps)):
                            la = self.lamps[i]
                            if la.lamp_rect.collidepoint(pos_mouse):
                                connected_lamp = i
                                pos_line = self.lamps[i].pos

                if event.type == pygame.KEYDOWN and self.lock:
                    if event.key == pygame.K_SPACE:
                        try:
                            self.lamps[self.index_charge].charge = int(
                                self.charge_lamp)
                        except:
                            self.lamps[self.index_charge].charge = 0
                        finally:
                            self.lock = False
                            self.charge_lamp = ""
                            self.lamps[
                                self.
                                index_charge].lamp_on = pygame.transform.scale(
                                    self.lamps[self.index_charge].lamp_on,
                                    [50, 50])
                    elif event.key == pygame.K_BACKSPACE:
                        self.charge_lamp = self.charge_lamp[:-1]
                        self.lamps[self.index_charge].charge = self.charge_lamp
                    else:
                        if '0' <= event.unicode <= '9' or event.unicode == '-':
                            self.charge_lamp += event.unicode
                        self.lamps[self.index_charge].charge = self.charge_lamp

                if event.type == pygame.MOUSEBUTTONUP:
                    self.press = False
                    self.mouse_pos = []
                    if self.draw_line:
                        pos_mouse = (event.pos[0], event.pos[1])
                        for i in range(len(self.lamps)):
                            la = self.lamps[i]
                            if la.lamp_rect.collidepoint(pos_mouse) and not (
                                    i == connected_lamp):
                                if la in self.lamps[connected_lamp].connected:
                                    continue
                                else:
                                    self.lamps[
                                        connected_lamp].connected.append(la)
                                    la.connected.append(
                                        self.lamps[connected_lamp])
                    self.draw_line = False
                if event.type == pygame.MOUSEMOTION and (self.press
                                                         or self.draw_line):
                    if self.press:
                        lamp.pos = pygame.mouse.get_pos()
                    elif self.draw_line:
                        self.mouse_pos = pygame.mouse.get_pos()
            self.draw(self.mouse_pos)