Modified collision checking sprite selection once more

main
Yan Wittmann 2023-03-28 20:01:09 +02:00
parent 0b3ff79002
commit 33ada24b84
3 changed files with 21 additions and 2 deletions

View File

@ -5,13 +5,13 @@
#,#,S,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,S,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,S,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,S,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,C,,,#
#,#,S,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,L,,,,,,,,,,,,,,,,,,,,,,,,C,,,#
#,#,S,,,,,,,,,,,,,,,,,,,+,+,+,+,S,S,S,S,S,+,+,+,+,+,S,S,S,S,S,+,+,+,+,+,S,S,S,S,S,+,+,+,+,+,+,+,+,+,#
#,#,S,,,,,,,,,,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
#,#,S,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,S,,,,,,,,,,,,,,,,,,,,,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,#,,,,,,,,,,,,,,,,,,,,,,G,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,,,,,,,,,,,,,,,M,,,M,M,M,M,M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,,,,,,,,,,,,,,,M,,,M,M,,M,,,,,,,,,,,,,,,,,M,,,,,,M,,,,,,,,,,,,,,,#
#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,,,,,,,,,,,+,+,+,+,+,+,+,+,+,+,+,+,+,+,+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
#,L,,,,,,,,,,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#

1 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
5 # # S #
6 # # S #
7 # # S #
8 # # S L C #
9 # # S + + + + S S S S S + + + + + S S S S S + + + + + S S S S S + + + + + + + + + #
10 # # S # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
11 # # S # #
12 # # S # #
13 # # G #
14 # M M M M M M M M #
15 # #
16 # + + + + + + + + + + + + + + + #
17 # L # # # # # # # # # # # # # # # #

View File

@ -1,3 +1,4 @@
import random
from typing import Optional
from physics.CollisionDirection import CollisionDirection
@ -55,6 +56,14 @@ class PhysicsElementsHandler:
dynamic_sprites = [sprite for sprite in sprites if isinstance(sprite, DynamicSprite)]
sorted_dynamic_sprites = sorted(dynamic_sprites, key=lambda spr: spr.position_scale.position[1])
skip_sprites = []
for sprite in sorted_dynamic_sprites:
if sprite.last_effective_motion[1] == 0 and sprite.last_effective_motion[0] == 0 \
and random.randint(0, 100) > 50:
skip_sprites.append(sprite)
continue
sorted_dynamic_sprites = [sprite for sprite in sorted_dynamic_sprites if sprite not in skip_sprites]
closest_sprites: dict[UiElement, list[tuple[int, StaticSprite]]] = {}
buffered_bounding_boxes: dict[UiElement, BoundingBox] = {}
@ -123,6 +132,7 @@ class PhysicsElementsHandler:
collides_with_last = None
collided = [False, False]
effective_motion = [0, 0]
for i in range(motion_steps):
if not collided[0]:
@ -132,6 +142,9 @@ class PhysicsElementsHandler:
)
collides_with = self.check_collides(sprite, colliders)
if len(collides_with) == 0:
effective_motion[0] += motion_step[0]
for collider in collides_with:
if collider is not None:
if sprite.is_collider and collider.is_collider:
@ -176,6 +189,9 @@ class PhysicsElementsHandler:
)
collides_with = self.check_collides(sprite, colliders)
if len(collides_with) == 0:
effective_motion[1] += motion_step[1]
for collider in collides_with:
if collider is not None:
if sprite.is_collider and collider.is_collider:
@ -213,6 +229,8 @@ class PhysicsElementsHandler:
collides_with_last = collider
collided[1] = True
sprite.last_effective_motion = (sprite.motion[0], sprite.motion[1])
return collides_with_last
def check_collides(self, sprite: StaticSprite, colliders: list[StaticSprite]) -> list[StaticSprite]:

View File

@ -11,6 +11,7 @@ class DynamicSprite(StaticSprite):
super().__init__(spritesheet)
self.motion = (0, 0)
self.last_effective_motion = (1, 1)
self.apply_base_deceleration = True
self.deceleration_horizontal_air = 0.02