-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmap.py
227 lines (169 loc) · 6.09 KB
/
map.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
from parameters import *
from tkinter import *
import __main__
def Update(clear = True):
"""Update Canvas with map"""
if clear:
print("nan")
__main__.cv.delete("all")
#what part of map we will draw on cavs
start = 0
end = 4 * MAP.WIDTH * MAP.HEIGHT
#here we check checkbox and get new range(only for one layer) from
#layer combobox
if __main__.Show_only_layer.get():
if __main__.layer.get() != "Layer":
layer = LAYER[__main__.layer.get()] * MAP.WIDTH * MAP.HEIGHT
start = layer
end = layer + MAP.WIDTH * MAP.HEIGHT
else:
return
for i in range(start,end):
if MAP.MAP[i] != 0:
w = i % (MAP.HEIGHT * MAP.WIDTH) #array of layer
m = w % MAP.WIDTH #x coords
d = w // MAP.WIDTH #y coords
print("hi, i am tile", i, "with cords", m, d)
x1 = m * MAP.TILE_SIZE
y1 = d * MAP.TILE_SIZE
print("It is me",MAP.MAP[i] )
image = TILES.ID[MAP.MAP[i]]#return tuple (category_name, name)
tile = TILES.categories[image[0]][image[1]]["tile"]
__main__.cv.create_image(x1, y1, anchor=NW, image=tile)
#drawing grid on canvas
if __main__.Display_Grid.get():
print(__main__.Display_Grid.get())
#vertical lines
for i in range(MAP.WIDTH + 1):
x1 = i * MAP.TILE_SIZE
y1 = 0
y2 = MAP.TILE_SIZE * MAP.HEIGHT
__main__.cv.create_line(x1, y1, x1, y2)
#horizontal lines
for i in range(MAP.HEIGHT + 1):
y1 = i * MAP.TILE_SIZE
x1 = 0
x2 = MAP.TILE_SIZE * MAP.WIDTH
__main__.cv.create_line(x1, y1, x2, y1)
def paint(event, tile_id = 1, layer = 1):
"""Drawing by updating map array"""
#is lisbox selected?
if __main__.lb_Tiles.get(ACTIVE) != "":
tile = __main__.lb_Tiles.get(ACTIVE)
category = __main__.category.get()
if tile_id != 0:
tile_id = TILES.categories[category][tile]["id"]
# Spawn can be only in one tile
if tile_id == SPAWN_ID:
# deleting spawn tile
MAP.reset()
else:
return
if __main__.layer.get() != "Layer":
layer = LAYER[__main__.layer.get()] * MAP.WIDTH * MAP.HEIGHT
print("read", layer)
else:
return
#handling moving around the canvas with scrollbar
scroll_h_shift = int(__main__.hbar.get()[0] * MAP.TILE_SIZE * MAP.WIDTH)
scroll_v_shift = int(__main__.vbar.get()[0] * MAP.TILE_SIZE * MAP.HEIGHT)
x1, y1 = (event.x + scroll_h_shift), (event.y + scroll_v_shift)
if x1 >= MAP.TILE_SIZE * MAP.WIDTH or y1 >= MAP.TILE_SIZE * MAP.HEIGHT:
return
cords = int(x1 // MAP.TILE_SIZE) + int(y1 // MAP.TILE_SIZE) * MAP.WIDTH
cords += layer
MAP.MAP[cords] = tile_id
print(x1, y1)
print(MAP.MAP)
print(MAP.WIDTH, MAP.HEIGHT)
Update()
def scale(event):
"""Resizing tiles"""
print(event.delta)
delta = 5
if event.delta > 0:
MAP.TILE_SIZE += delta
elif MAP.TILE_SIZE - delta > 0:
MAP.TILE_SIZE -= delta
TILES.resize(MAP.TILE_SIZE)
Update()
#resizing canvas
__main__.cv.config(scrollregion=(0, 0, MAP.TILE_SIZE * MAP.WIDTH, MAP.TILE_SIZE * MAP.HEIGHT))
def erase(event):
"""Erasing tile"""
#TODO implement layers
paint(event, tile_id = 0)
def CaptureFrame(event, tile_id = 1, layer = 1):
"""Creating frame to modify tiles in area"""
global x1, y1
#TODO
#is lisbox selected?
if __main__.lb_Tiles.get(ACTIVE) != "":
tile = __main__.lb_Tiles.get(ACTIVE)
category = __main__.category.get()
if tile_id != 0:
tile_id = TILES.categories[category][tile]["id"]
#Spawn can be only in one tile
if tile_id == SPAWN_ID:
return
else:
return
if __main__.layer.get() != "Layer":
layer = LAYER[__main__.layer.get()] * MAP.WIDTH * MAP.HEIGHT
print("read", layer)
else:
return
#handling moving around the canvas with scrollbar
scroll_h_shift = int(__main__.hbar.get()[0] * MAP.TILE_SIZE * MAP.WIDTH)
scroll_v_shift = int(__main__.vbar.get()[0] * MAP.TILE_SIZE * MAP.HEIGHT)
#"6" stands for Motion
#"5" stands for ButtonRelease
#"4" stands for ButtonPress
if event.type == "4":
x1, y1 = event.x + scroll_h_shift, event.y + scroll_v_shift
if event.type == "5":
x2, y2 = event.x + scroll_h_shift, event.y + scroll_v_shift
#handling arrayboundary
if x1 >= MAP.TILE_SIZE * MAP.WIDTH or y1 >= MAP.TILE_SIZE * MAP.HEIGHT:
return
if x2 >= MAP.TILE_SIZE * MAP.WIDTH or y2 >= MAP.TILE_SIZE * MAP.HEIGHT:
return
__main__.cv.delete("CaptureFrame")
A = int(x1 // MAP.TILE_SIZE) + int(y1 // MAP.TILE_SIZE) * MAP.WIDTH
B = int(x2 // MAP.TILE_SIZE) + int(y1 // MAP.TILE_SIZE) * MAP.WIDTH
C = int(x1 // MAP.TILE_SIZE) + int(y2 // MAP.TILE_SIZE) * MAP.WIDTH
#D = int(x2 // MAP.TILE_SIZE) + int(y2 // MAP.TILE_SIZE) * MAP.WIDTH
#handling shape
if C>=A:
d = C // MAP.WIDTH - A // MAP.WIDTH
k = 1
else:
d = A // MAP.WIDTH - C // MAP.WIDTH
k = (-1)
if A > B:
A, B = B, A
# A-----------B
# | |
# | |
# | |
# C-----------D
for j in range(d + 1):
for i in range(A, B + 1):
cords = i + k*j * MAP.WIDTH
cords += layer
MAP.MAP[cords] = tile_id
print(MAP.MAP)
Update()
return
if event.type == "6":
x2, y2 = event.x + scroll_h_shift, event.y + scroll_v_shift
__main__.cv.delete("CaptureFrame")
__main__.cv.create_line(x1, y1, x1, y2, x2, y2, x2, y1, x1, y1, tags = "CaptureFrame")
#(x1,y1)-----(x2,y1)
# | |
# | |
# | |
#(x1,y2)-----(x2,y2)
def EraseFrame(event):
"""Erasing tiles in frame"""
CaptureFrame(event, tile_id = 0)