forked from StanislavPetrovV/SpriteStacking
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstacked_sprite.py
More file actions
97 lines (63 loc) · 2.59 KB
/
stacked_sprite.py
File metadata and controls
97 lines (63 loc) · 2.59 KB
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
from settings import *
import math
class StackedSprite(pg.sprite.Sprite):
def __init__(self, app, name, pos, rot=0, collision=True):
self.app = app
self.name = name
self.pos = vec2(pos) * TILE_SIZE
self.player = app.player
self.group = app.main_group
super().__init__(self.group)
if collision:
self.app.collision_group.add(self)
self.attrs = STACKED_SPRITE_ATTRS[name]
self.y_offset = vec2(0, self.attrs['y_offset'])
self.cache = app.cache.stacked_sprite_cache
self.viewing_angle = app.cache.viewing_angle
self.rotated_sprites = self.cache[name]['rotated_sprites']
self.collision_masks = self.cache[name]['collision_masks']
self.angle = 0
self.screen_pos = vec2(0)
self.rot = (rot % 360) // self.viewing_angle
self.image = self.rotated_sprites[self.angle]
self.mask = self.collision_masks[self.angle]
self.rect = self.image.get_rect()
def change_layer(self):
self.group.change_layer(self, self.screen_pos.y)
def transform(self):
pos = self.pos - self.player.offset
pos = pos.rotate_rad(self.player.angle)
self.screen_pos = pos + CENTER
def get_angle(self):
self.angle = -math.degrees(self.player.angle) // self.viewing_angle + self.rot
self.angle = int(self.angle % NUM_ANGLES)
def update(self):
self.transform()
self.get_angle()
self.get_image()
self.change_layer()
def get_image(self):
self.image = self.rotated_sprites[self.angle]
self.mask = self.collision_masks[self.angle]
self.rect = self.image.get_rect(center=self.screen_pos + self.y_offset)
class TrnspStackedSprite(StackedSprite):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.app.transparent_objects.append(self)
self.alpha_trigger = False
self.alpha_objects = self.cache[self.name]['alpha_sprites']
self.dist_to_player = 0.0
def get_dist_to_player(self):
self.dist_to_player = self.screen_pos.distance_to(self.player.rect.center)
def update(self):
super().update()
self.get_dist_to_player()
def get_image(self):
super().get_image()
self.get_alpha_image()
def get_alpha_image(self):
if self.alpha_trigger:
if self.rect.centery > self.player.rect.top:
if self.rect.contains(self.player.rect):
self.image = self.alpha_objects[self.angle]
self.alpha_trigger = False