-
Notifications
You must be signed in to change notification settings - Fork 0
/
HelpFunctions.py
179 lines (150 loc) · 4.57 KB
/
HelpFunctions.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
import os
import collections
import glob
import pygame
from Constants import *
def load_image(name, colorkey=None):
try:
image = pygame.image.load(name)
except pygame.error:
raise
image = image.convert()
if colorkey is not None:
if colorkey is -1:
colorkey = image.get_at((0, 0))
image.set_colorkey(colorkey, pygame.RLEACCEL)
return image, image.get_rect()
def search_file(path, term):
results = []
for file in glob.glob(os.path.join(path, "*" + term + "*")):
if os.path.isfile(os.path.basename(file)):
results.append(os.path.basename(file))
return results
def to_string(var_name, value):
"""Attempts to convert several known types to str"""
var_str = ''
if value is None:
var_str = ''
elif var_name == 'type':
var_str = obj_type_str(value)
#If list, create comma delim string
elif isinstance(value, list):
for item in value:
if isinstance(item, int) or isinstance(item, float) or isinstance(item, str):
var_str += str(item) + ','
#var_str = var_str.rstrip(',')
print(var_str)
#If value is int, convert it to string
elif isinstance(value, int) or isinstance(value, float):
var_str = str(value)
#Save any strings data type member variables to file
elif isinstance(value, str):
var_str = value
return var_str
def to_num(s):
try:
s = int(s)
return s
except ValueError:
pass
try:
s = float(s)
return s
except ValueError:
pass
return s
def get_iterable(x):
if isinstance(x, collections.Iterable):
return x
else:
return x,
def to_bool(bool_str):
if bool_str.lower() in ['true', 'yes', 'y']:
return True
elif bool_str.lower() in ['false', 'no', 'n']:
return False
else:
return None
def to_behavior(str_behavior):
behavior = str_behavior.lower()
if behavior == 'pickup':
return PICKUP
elif behavior == 'place':
return PLACE
elif behavior == 'toggle_power':
return TOGGLE_POWER
else:
print(str_behavior + " was not recognized by to_behavior()")
return NOTHING
def behavior_str(behavior):
if behavior == PICKUP:
return 'pickup'
elif behavior == PLACE:
return 'place'
elif behavior == TOGGLE_POWER:
return 'toggle_power'
else:
print("Unable to convert behavior to string")
return "invalid"
def obj_type_str(obj_type):
if obj_type == BASE_OBJECT:
return "baseobject"
if obj_type == LEVEL_OBJECT:
return "levelobject"
if obj_type == PLAYER:
return "player"
if obj_type == CRANE_OBJECT:
return "craneobject"
if obj_type == PLATFORM:
return "platform"
if obj_type == BUILD_PROC:
return "buildprocess"
if obj_type == PART:
return "part"
def index_by_value(value, container):
i = 0
for v in container:
if value == v:
return i
i += 1
return -1
def get_colorkey_hitmask(image, rect, key=None):
"""returns a hitmask using an image's colorkey.
image->pygame Surface,
rect->pygame Rect that fits image,
key->an over-ride color, if not None will be used instead of the image's colorkey"""
if key is None:
colorkey = image.get_colorkey()
else:
colorkey = key
mask = []
for x in range(rect.width):
mask.append([])
for y in range(rect.height):
mask[x].append(not image.get_at((x, y)) == colorkey)
return mask
def get_colorkey_and_alpha_hitmask(image, rect, colorkey=None, alpha=0):
"""returns a hitmask using an image's colorkey and alpha."""
mask = []
for x in range(rect.width):
mask.append([])
for y in range(rect.height):
mask[x].append(not (image.get_at((x, y))[3] == alpha or image.get_at((x, y)) == colorkey))
return mask
def check_collision(obj1, obj2):
"""checks if two objects have collided, using hitmasks"""
try:
rect1, rect2, hm1, hm2 = obj1.rect, obj2.rect, obj1.hitmask, obj2.hitmask
except AttributeError:
return False
rect = rect1.clip(rect2)
if rect.width == 0 or rect.height == 0:
return False
x1, y1, x2, y2 = rect.x-rect1.x, rect.y-rect1.y, rect.x-rect2.x, rect.y-rect2.y
for x in range(rect.width):
for y in range(rect.height):
if hm1[x1+x][y1+y] and hm2[x2+x][y2+y]:
return True
else:
continue
return False