-
Notifications
You must be signed in to change notification settings - Fork 1
/
world.py
104 lines (75 loc) · 3.45 KB
/
world.py
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
from configs import SCR_W_COEFF, PLATFORM_SIZE
from threading import Thread
from objects import real
import pygame
import re
import logging
logging.basicConfig(level=logging.DEBUG)
class TWEngine(Thread): # здесь крутится игровой цикл на сервере и клиенте
logger = logging.getLogger(__name__)
def __init__(self, nlvl):
super().__init__()
pygame.init()
pygame.font.init()
pygame.event.set_blocked(pygame.MOUSEMOTION) # чтоб движения мышки не забивали очередь событий
self.__lvl_builder = LevelBuilder(self)
self.__lvl_builder.build(nlvl)
self.loop = True
self.start()
def run(self):
while self.loop:
self._e_cycle_body()
pygame.time.wait(12)
# все нужные действия в цикле будут выполняться отнаследованными клиентом и сервером по-разному
def _e_cycle_body(self):
raise NotImplementedError
# спавн игровых объектов с учётом того, что 1 единица на координатной сетке = 1 кубик (размеры прописаны в конфиге)
def spawn(self, TWobj, coords, *args, **kwargs):
x, y, *sizes = coords
if self.is_empty((x, y)) == True:
return TWobj([x*PLATFORM_SIZE, y*PLATFORM_SIZE] + sizes, *args, **kwargs)
else:
return False
@property
def lvl(self):
return self.__lvl_builder.CURR_LVL
def is_empty(self, coords):
return self.__lvl_builder.level_map.get(coords, True)
class LevelBuilder: # парсер уровней
CURR_LVL = 0
def __init__(self, eng=None):
self.eng = eng
self.pattern = re.compile(r'-*?\d+?(?:\:-*?\d+\W|\W)')
self.level_map = {} # {(x, y): block}
self.blocks = {
'#': real.DefaultBlock
}
def __normalize(self, s_coord):
s_coord = int(s_coord)
if s_coord < 0:
s_coord += SCR_W_COEFF
return s_coord
def __unpack(self, level): # распаковка совершенно упоротого придуманного формата
self.result = {}
with open('lvl%d.txt' % level, 'r') as fi:
for row in fi:
self.result.clear()
for itm in self.pattern.findall(row):
rawblock = itm[-1]
itm = itm[:-1]
if ':' in itm:
pos = list(map(self.__normalize, itm.split(':')))
for i in range(pos[0], pos[1]+1):
self.result[i] = rawblock
else:
self.result[self.__normalize(itm)] = rawblock
yield self.result
def build(self, nlvl):
LevelBuilder.CURR_LVL = nlvl
by = 0
for row in self.__unpack(nlvl):
for bx, block in row.items():
sblock = self.eng.spawn(self.blocks[block], (bx, by)) # создание кубиков уровня
self.level_map[(bx, by)] = sblock._name
by += 1
#print(self.level_map)