aboutsummaryrefslogtreecommitdiff
path: root/graphic.py
blob: 3075e274f1c041b9d67ff90636a70c4bce62a775 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import os
from time import sleep, time

import pygame as pg
from pygame.locals import *


RESOLUTION = (720, 520)
BLACK_COLOR = (0, 0, 0)
WHITE_COLOR = (255, 255, 255)
DECAL_LENGTH = 20
FPS = 30


class Graphic:
    def __init__(self, gol):
        self.gol = gol
        self.running = True
        self.key_event_occured = False
        self.inspect_next = False
        self.full_screen = False
        self.x_decal = 0
        self.y_decal = 0
        self.zoom_level = 0
        self.time_next_draw = time()

    @property
    def square_size(self):
        return self.gol.square_size + self.zoom_level

    def main_loop(self):
        os.environ['SDL_VIDEO_CENTERED'] = '1'
        pg.init()
        # display_info = pg.display.Info()
        # self.screen_size = (display_info.current_w, display_info.current_h)
        # print(RESOLUTION == self.screen_size)
        pg.display.set_caption('Game of life')
        self.window = pg.display.set_mode(RESOLUTION, RESIZABLE | DOUBLEBUF)
        self.sans_font = pg.font.SysFont('sans', 15)
        clock = pg.time.Clock()

        while self.running:
            clock.tick(FPS)
            self.event_handler()
            self.update()
            pg.display.flip()

    def update(self):
        if not self.gol.inspect:
            if not time() >= self.time_next_draw:
                return
            self.time_next_draw = time() + self.gol.time_step

        if self.gol.inspect and not self.key_event_occured:
            return
        self.window.fill(BLACK_COLOR)
        for node in self.gol.alive_nodes:
            node_rect = pg.Rect(10 + self.x_decal + (node.x + 1) * self.square_size,
                                45 + self.y_decal + (node.y + 1) * self.square_size,
                                self.square_size, self.square_size)
            pg.draw.rect(self.window, WHITE_COLOR, node_rect)

        gen_text = self.sans_font.render(str(self.gol.generation_counter),
                                         True, WHITE_COLOR, BLACK_COLOR)
        self.window.blit(gen_text, (10, 35))

        gen_text = self.sans_font.render(str(self.gol.pattern_name),
                                         True, WHITE_COLOR, BLACK_COLOR)
        self.window.blit(gen_text, (10, 10))
        if (self.gol.inspect and self.inspect_next) or not self.gol.inspect:
            self.gol.next_generation()
        if self.gol.generation_counter > self.gol.max_gen:
            self.running = False
        self.key_event_occured = False
        self.inspect_next = False

    def event_handler(self):
        for event in pg.event.get():
            if event.type == QUIT:
                self.running = False
            elif event.type == KEYDOWN:
                self.key_event_occured = True
                # trigger next step in inspect mode
                if event.key == K_RETURN or event.key == K_SPACE:
                    self.inspect_next = True
                # quit
                elif event.key == K_q:
                    self.running = False
                # toggle inspect mode
                elif event.key == K_i:
                    self.gol.inspect = not self.gol.inspect
                # elif event.key == K_F11 or (event.key == K_ESCAPE and self.full_screen):
                #     pg.display.toggle_fullscreen()
                #     if self.window.get_flags() & FULLSCREEN:
                #         pg.display.set_mode(RESOLUTION, RESIZABLE | DOUBLEBUF)
                #     else:
                #         pg.display.set_mode(RESOLUTION, RESIZABLE | DOUBLEBUF | FULLSCREEN)
                # view move
                elif event.key == K_UP:
                    self.y_decal += DECAL_LENGTH
                elif event.key == K_DOWN:
                    self.y_decal -= DECAL_LENGTH
                elif event.key == K_LEFT:
                    self.x_decal += DECAL_LENGTH
                elif event.key == K_RIGHT:
                    self.x_decal -= DECAL_LENGTH
                # zoom
                elif event.key == K_MINUS:
                    self.zoom_level -= 1
                elif event.key == K_EQUALS:
                    self.zoom_level += 1
            elif event.type == VIDEORESIZE:
                pg.display.set_mode(event.size, RESIZABLE | DOUBLEBUF)