From 6112423938dffd60aae0a9fae7a0cbc60d745eca Mon Sep 17 00:00:00 2001 From: Skullheadx <94652084+Skullheadx@users.noreply.github.com> Date: Tue, 4 Jul 2023 17:18:10 -0400 Subject: [PATCH] fixed performance on checking if split is good --- README.md | 6 +++- assets/bomb.png | Bin 24116 -> 9253 bytes assets/knife.png | Bin 0 -> 8815 bytes bomb.py | 19 ++++++++--- effect.py | 87 +++++++++++++++++++++++++++-------------------- fruit.py | 2 +- game.py | 18 +++++----- high_score.txt | 2 +- image.png | Bin 4695 -> 0 bytes main.py | 6 ++-- menu.py | 6 ++-- player.py | 25 ++++++-------- setup.py | 16 ++------- 13 files changed, 99 insertions(+), 88 deletions(-) create mode 100644 assets/knife.png delete mode 100644 image.png diff --git a/README.md b/README.md index a9bee68..7db37d0 100644 --- a/README.md +++ b/README.md @@ -22,4 +22,8 @@ https://pixabay.com/sound-effects/sub-bass-4-secondsssss-6241/ ## Game background image made with help from https://www.deviantart.com/sadfacerl/art/WoodTexture-748548579 -## Blood Splatter Effect https://bluerosesonata.itch.io/free-blood-splatter-cgsfx \ No newline at end of file +## Blood Splatter Effect https://bluerosesonata.itch.io/free-blood-splatter-cgsfx + + +Bomb https://www.rawpixel.com/image/6287121/png-public-domain-black +Knife https://wandering-ghost.itch.io/horror-knifes-sprites \ No newline at end of file diff --git a/assets/bomb.png b/assets/bomb.png index 5418bee0e590c0c97b23511dd4f30ad7a3d8fc41..5d873bbbe5a9e360c7102f30134330a37cb1da32 100644 GIT binary patch delta 3900 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 literal 24116 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%0DIeEoa6}C!XbFK1 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 Mr>mdKI;Vst0CfuGO8@`> literal 0 HcmV?d00001 diff --git a/bomb.py b/bomb.py index 9fae48f..133934e 100644 --- a/bomb.py +++ b/bomb.py @@ -1,5 +1,4 @@ from fruit import Fruit -from effect import SplitEffect from setup import * @@ -12,6 +11,8 @@ class Bomb(Fruit): BOMB_IMAGE = pygame.image.load("assets/bomb.png").convert_alpha() BOMB_TXT = Texture.from_surface(renderer, BOMB_IMAGE) + RADIUS_FACTOR = 1.75 + EXPLOSIONS = [ [ Texture.from_surface(renderer, pygame.image.load(f"assets/explosion/Punch1/File1.png")), @@ -57,6 +58,10 @@ class Bomb(Fruit): self.explosion_txt = random.choice(self.EXPLOSIONS) + circle = pygame.Surface((self.radius * 2, self.radius * 2), pygame.SRCALPHA) + pygame.draw.circle(circle, (255, 255, 255, 255), (self.radius, self.radius), self.radius) + self.circle = Texture.from_surface(renderer, circle) + def update(self, delta): super().update(delta) if self.exploded: @@ -93,7 +98,11 @@ class Bomb(Fruit): self.EXPLOSION_RADIUS * 2, self.EXPLOSION_RADIUS * 2)) else: - if self.position.y - self.radius <= HEIGHT: - self.BOMB_TXT.draw(None, pygame.Rect(self.position.x - self.radius, self.position.y - self.radius, - self.radius * 2, self.radius * 2), self.angle, - (self.radius, self.radius)) + # self.circle.draw(None, pygame.Rect(self.position.x - self.RADIUS, self.position.y - self.RADIUS, + # self.RADIUS * 2, self.RADIUS * 2)) + + self.BOMB_TXT.draw(None, pygame.Rect(self.position.x - self.radius * self.RADIUS_FACTOR, + self.position.y - self.radius * self.RADIUS_FACTOR, + self.radius * 2 * self.RADIUS_FACTOR, + self.radius * 2 * self.RADIUS_FACTOR), + self.angle, (self.radius * self.RADIUS_FACTOR, self.radius * self.RADIUS_FACTOR)) diff --git a/effect.py b/effect.py index 4b6462e..368e90b 100644 --- a/effect.py +++ b/effect.py @@ -119,11 +119,12 @@ class SplitEffect: random.random()) / 100 + pygame.Vector2(normal_velocity) self.acceleration = pygame.Vector2(0, self.gravity) - self.angle = 0 + self.angle = frame.angle self.direction = random.choice([-1, 1]) - self.frame = Texture.from_surface(renderer, frame) - self.width, self.height = self.frame.width, self.frame.height + + self.frame = frame + self.width, self.height = self.frame.get_rect().width, self.frame.get_rect().height def update(self, delta): self.velocity += self.acceleration * delta / 1000 @@ -135,83 +136,95 @@ class SplitEffect: return True def draw(self): + self.frame.angle = self.angle + # print(self.position) self.frame.draw(None, pygame.Rect(self.position.x - self.width / 2, self.position.y - self.height / 2, - self.width, self.height), - self.angle, origin=(self.width / 2, self.height / 2)) - self.width, self.height = self.frame.width, self.frame.height + self.width, self.height)) + self.width, self.height = self.frame.get_rect().width, self.frame.get_rect().height @staticmethod def find_normals(v): return pygame.Vector2(-v.y, v.x), pygame.Vector2(v.y, -v.x) @staticmethod - def should_split(image, angle, image_position, mouse_position, mouse_direction, radius): - img, img_pos = rotate_center(pygame.transform.scale(image.copy(), (radius * 2, radius * 2)), angle, - image_position) - img_pos += pygame.Vector2(img.get_size()) / 2 + def should_split(texture, angle, image_position, mouse_position, mouse_direction, radius): if mouse_direction.x == 0: mouse_direction.x += 0.0001 + a = math.degrees(math.atan(mouse_direction.y / mouse_direction.x)) - img = rotate_center(img, a, pygame.Vector2(0, 0))[0] + diagonal = math.sqrt(2 * ((radius * 2) ** 2)) + txt = Texture(renderer, (diagonal, diagonal), target=True) + txt.blend_mode = pygame.BLEND_ADD + renderer.target = txt + texture.draw(None, pygame.Rect((diagonal - radius * 2) / 2, (diagonal - radius * 2) / 2, radius * 2, + radius * 2), angle - a, origin=(radius, radius)) + renderer.target = None + + img_size = pygame.Vector2(diagonal, diagonal) + center = img_size / 2 + + # finding end and start points of the splitting line + # [x,y] = mouse_position + t * mouse_direction # vector equation + # x = mouse_position.x + t * mouse_direction.x + # y = mouse_position.y + t * mouse_direction.y - top_left = pygame.Vector2(image_position) - pygame.Vector2(img.get_width() / 2, img.get_height() / 2) - rot_center = pygame.Vector2(image_position) - top_left - mp = mouse_position - top_left + mp = mouse_position - image_position + center t1 = (- mp.x) / mouse_direction.x p1 = mp + t1 * mouse_direction - p3 = (p1 - rot_center).rotate(-a) + rot_center + p3 = (p1 - center).rotate(-a) + center MIN_SPLIT = 0.25 - slice_percent = clamp(p3.y, 0, img.get_height()) / img.get_height() + slice_percent = clamp(p3.y, 0, img_size.y) / img_size.y if MIN_SPLIT < slice_percent < 1 - MIN_SPLIT: return True return False @staticmethod - def split_image(image, angle, image_position, mouse_position, mouse_direction, radius): - img, img_pos = rotate_center(pygame.transform.scale(image.copy(), (radius * 2, radius * 2)), angle, - image_position) - - - img_pos += pygame.Vector2(img.get_size()) / 2 + def split_image(texture, angle, image_position, mouse_position, mouse_direction, radius): if mouse_direction.x == 0: mouse_direction.x += 0.0001 a = math.degrees(math.atan(mouse_direction.y / mouse_direction.x)) - img = rotate_center(img, a, pygame.Vector2(0, 0))[0] + diagonal = math.sqrt(2 * ((radius * 2) ** 2)) + txt = Texture(renderer, (diagonal, diagonal), target=True) + txt.blend_mode = pygame.BLEND_ADD + renderer.target = txt + texture.draw(None, pygame.Rect((diagonal - radius * 2) / 2, (diagonal - radius * 2) / 2, radius * 2, + radius * 2), angle - a, origin=(radius, radius)) + renderer.target = None - top_left = pygame.Vector2(img_pos) - pygame.Vector2(img.get_width() / 2, img.get_height() / 2) - rot_center = pygame.Vector2(img_pos) - top_left + img_size = pygame.Vector2(diagonal, diagonal) + center = img_size / 2 # finding end and start points of the splitting line # [x,y] = mouse_position + t * mouse_direction # vector equation # x = mouse_position.x + t * mouse_direction.x # y = mouse_position.y + t * mouse_direction.y - mp = mouse_position - top_left + mp = mouse_position - image_position + center t1 = (- mp.x) / mouse_direction.x p1 = mp + t1 * mouse_direction - p3 = (p1 - rot_center).rotate(-a) + rot_center + p3 = (p1 - center).rotate(-a) + center - half1 = img.subsurface(pygame.Rect(0, 0, img.get_width(), clamp(p3.y, 0, img.get_height()))) - half2 = img.subsurface(pygame.Rect(0, clamp(p3.y, 0, img.get_height()), img.get_width(), - clamp(img.get_height() - p3.y, 0, img.get_height()))) + half1 = Image(txt, pygame.Rect(0, 0, img_size.x, clamp(p3.y, 0, img_size.y))) + half2 = Image(txt, + pygame.Rect(0, clamp(p3.y, 0, img_size.y), img_size.x, clamp(img_size.y - p3.y, 0, img_size.y))) - p5 = half1.get_rect().center - rot_center - pos1 = p5.rotate(a) + img_pos + p5 = half1.get_rect().center - center + pos1 = p5.rotate(a) + image_position - p6 = half2.get_rect().center - rot_center + pygame.Vector2(0, clamp(p3.y, 0, img.get_height())) - pos2 = p6.rotate(a) + img_pos + p6 = half2.get_rect().center - center + pos2 = p6.rotate(a) + image_position - r_half1 = pygame.transform.rotate(half1, -a) - r_half2 = pygame.transform.rotate(half2, -a) + half1.angle = a + half2.angle = a - return r_half1, r_half2, pos1, pos2 + return half1, half2, pos1, pos2 class SlashEffect: diff --git a/fruit.py b/fruit.py index aed62a3..37a9df3 100644 --- a/fruit.py +++ b/fruit.py @@ -50,4 +50,4 @@ class Fruit: if self.position.y - self.radius <= HEIGHT: self.fruit_txt.draw(None, pygame.Rect(self.position - pygame.Vector2(self.radius, self.radius), (self.radius * 2, self.radius * 2)), - angle=-self.angle, origin=(self.radius, self.radius)) + angle=self.angle, origin=(self.radius, self.radius)) diff --git a/game.py b/game.py index 9680b40..d863598 100644 --- a/game.py +++ b/game.py @@ -8,7 +8,7 @@ from setup import * class Game: - BOMB_CHANCE = 0 + BOMB_CHANCE = 0.1 COMBO_TIME = 250 GAME_OVER_TIME = 2000 @@ -59,7 +59,7 @@ class Game: self.time_since_last_hit = 0 self.current_combo = 0 - self.wave = 100 + self.wave = 1 self.cleared_wave = True self.wave_cooldown_timer = 0 @@ -83,7 +83,7 @@ class Game: self.score_surf = font.render(f"SCORE {self.score}", True, WHITE) self.score_txt = Texture.from_surface(renderer, self.score_surf) - self.combo_surf = font.render(f"COMBO x{self.current_combo}", True, WHITE) + self.combo_surf = font.render(f"COMBO x{max(1,self.current_combo)}", True, WHITE) self.combo_txt = Texture.from_surface(renderer, self.combo_surf) self.high_score_surf = font.render(f"BEST {self.high_score}", True, WHITE) @@ -139,7 +139,7 @@ class Game: fruit.update(delta) hit_status = self.player.hits(fruit) - if hit_status and SplitEffect.should_split(fruit.image, fruit.angle, fruit.position, + if hit_status and SplitEffect.should_split(fruit.fruit_txt, fruit.angle, fruit.position, self.player.previous_mouse_pos, self.player.mouse_direction, fruit.radius): hits.append((fruit, self.player.mouse_direction, self.player.previous_mouse_pos)) @@ -159,7 +159,7 @@ class Game: self.high_score_txt = Texture.from_surface(renderer, self.high_score_surf) else: self.current_combo = 0 - self.combo_surf = font.render(f"COMBO x{self.current_combo}", True, WHITE) + self.combo_surf = font.render(f"COMBO x{max(1,self.current_combo)}", True, WHITE) self.combo_txt = Texture.from_surface(renderer, self.combo_surf) for hit, mouse_direction, mouse_position in hits: @@ -169,7 +169,7 @@ class Game: color)) self.effects[1].append(BloodEffect(hit.position, hit.radius, lighten(color, 0.15))) - half1, half2, pos1, pos2 = SplitEffect.split_image(hit.image, hit.angle, hit.position, mouse_position, + half1, half2, pos1, pos2 = SplitEffect.split_image(hit.fruit_txt, hit.angle, hit.position, mouse_position, mouse_direction, hit.radius) n1, n2 = SplitEffect.find_normals(mouse_direction.normalize() * 5) @@ -186,7 +186,7 @@ class Game: if self.time_since_last_hit < self.COMBO_TIME: self.current_combo += 1 - self.combo_surf = font.render(f"COMBO x{self.current_combo}", True, WHITE) + self.combo_surf = font.render(f"COMBO x{max(1,self.current_combo)}", True, WHITE) self.combo_txt = Texture.from_surface(renderer, self.combo_surf) if self.current_combo > 1: self.combo_counters.append(ComboCounter(hit.position, self.current_combo + 1)) @@ -218,7 +218,7 @@ class Game: self.bombs.remove(bomb) continue if (((not -bomb.radius * 2 < bomb.position.x < WIDTH + bomb.radius * 2) or - bomb.position.y - bomb.radius * 2 > HEIGHT) and bomb.velocity.y > 0): + bomb.position.y - bomb.radius * 2 * bomb.RADIUS_FACTOR > HEIGHT) and bomb.velocity.y > 0): self.bombs.remove(bomb) if len(self.fruits) == 0 and len(self.bombs) == 0 and not self.game_over: @@ -269,7 +269,6 @@ class Game: effect.draw() for combo in self.combo_counters: combo.draw() - self.player.draw() for effect in self.effects[4]: effect.draw() @@ -278,3 +277,4 @@ class Game: self.r2.draw() self.game_over_txt.draw(None, ( WIDTH / 2 - self.game_over_txt.width / 2, HEIGHT / 2 - self.game_over_txt.height / 2)) + self.player.draw() diff --git a/high_score.txt b/high_score.txt index d23ee5c..c227083 100644 --- a/high_score.txt +++ b/high_score.txt @@ -1 +1 @@ -3850 \ No newline at end of file +0 \ No newline at end of file diff --git a/image.png b/image.png deleted file mode 100644 index 73e6ada04baf51a389c83c7824212a69f84b1a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4695 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 YsxVu-=5XC}1_lNOPgg&ebxsLQ038wW%K!iX diff --git a/main.py b/main.py index b3d22be..2053bfe 100644 --- a/main.py +++ b/main.py @@ -15,9 +15,9 @@ while is_running: status = scene.update(delta) scene.draw() - fps_text = font_small.render(f"FPS: {clock.get_fps():.0f}", True, DARK_GRAY) - fps_txt = Texture.from_surface(renderer, fps_text) - fps_txt.draw(None, pygame.Vector2(10, 75)) + # fps_text = font_small.render(f"FPS: {clock.get_fps():.0f}", True, DARK_GRAY) + # fps_txt = Texture.from_surface(renderer, fps_text) + # fps_txt.draw(None, pygame.Vector2(10, 75)) renderer.present() diff --git a/menu.py b/menu.py index 2dcf1bf..21ac97b 100644 --- a/menu.py +++ b/menu.py @@ -88,7 +88,7 @@ class Menu: if not self.blacked_out: hit_status = self.player.hits(self.fruit) # Check if player hits fruit # Check if fruit should split - if hit_status and SplitEffect.should_split(self.fruit.image, self.fruit.angle, self.fruit.position, + if hit_status and SplitEffect.should_split(self.fruit.fruit_txt, self.fruit.angle, self.fruit.position, self.player.previous_mouse_pos, self.player.mouse_direction, self.fruit.radius): # Split fruit @@ -100,7 +100,7 @@ class Menu: self.fruit.position + self.player.mouse_direction), color)) self.effects.append(BloodEffect(self.fruit.position, self.fruit.radius, lighten(color, 0.15))) - half1, half2, pos1, pos2 = SplitEffect.split_image(self.fruit.image, self.fruit.angle, + half1, half2, pos1, pos2 = SplitEffect.split_image(self.fruit.fruit_txt, self.fruit.angle, self.fruit.position, self.player.previous_mouse_pos, self.player.mouse_direction, self.fruit.radius) @@ -143,7 +143,7 @@ class Menu: self.controls_txt.draw(None, self.controls_surface.get_rect(bottomleft=(10, HEIGHT - 10))) self.credit_txt.draw(None, self.credit_surface.get_rect(bottomright=(WIDTH - 10, HEIGHT - 10))) - self.player.draw() for effect in self.effects: effect.draw() + self.player.draw() diff --git a/player.py b/player.py index fe66ea8..ba3f230 100644 --- a/player.py +++ b/player.py @@ -1,11 +1,15 @@ +import pygame.mouse + from setup import * class Player: LIFE_TIME = 100 - INFLATE_SCALE = 20 - IMAGE = pygame.image.load("assets/effects/sword_slashes/White_Slash_Thin/File2.png").convert_alpha() + image = pygame.image.load("assets/knife.png").convert_alpha() + txt = Texture.from_surface(renderer, image) + + SIZE = pygame.Vector2(50* SCALE, 50* SCALE) def __init__(self): self.sliced_points = [] @@ -13,10 +17,9 @@ class Player: self.previous_mouse_pos = pygame.Vector2(pygame.mouse.get_pos()) self.mouse_direction = pygame.Vector2(0, 0) - self.angle = 0 self.slicing = False - self.display_image = self.IMAGE.copy() - self.position = pygame.Vector2(0, 0) + + self.angle = 0 def update(self, delta): pressed = pygame.mouse.get_pressed() @@ -25,21 +28,13 @@ class Player: self.sliced_points.append((pygame.Vector2(pos), pygame.time.get_ticks())) self.mouse_direction = pygame.Vector2(pos) - self.previous_mouse_pos self.previous_mouse_pos = pygame.Vector2(pos) - if self.mouse_direction.x == 0: - x_direction = self.mouse_direction.x + 0.0001 - else: - x_direction = self.mouse_direction.x - self.angle = math.degrees(math.atan(self.mouse_direction.y / x_direction)) - self.display_image, self.position = rotate_center(self.IMAGE, self.angle, - pygame.Vector2(pos) + pygame.Vector2( - self.IMAGE.get_width() / 2, 0)) self.slicing = True else: self.mouse_direction = pygame.Vector2(0, 0) self.previous_mouse_pos = pygame.Vector2(pygame.mouse.get_pos()) - self.angle = 0 self.slicing = False + self.lines.clear() if len(self.sliced_points) > 1: for i in range(len(self.sliced_points) - 1): @@ -78,3 +73,5 @@ class Player: for i in range(len(self.sliced_points) - 1): renderer.draw_line(self.sliced_points[i][0], self.sliced_points[i + 1][0]) renderer.draw_line(self.previous_mouse_pos, self.previous_mouse_pos - self.mouse_direction) + self.txt.draw(None, pygame.Rect(pygame.mouse.get_pos(), self.SIZE)) + diff --git a/setup.py b/setup.py index 7897215..08ad0f1 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,5 @@ import pygame -from pygame._sdl2 import Window, Renderer, Texture +from pygame._sdl2 import Window, Renderer, Texture, Image import random import os import math @@ -10,6 +10,7 @@ WIDTH, HEIGHT = pygame.display.Info().current_w, pygame.display.Info().current_h display = pygame.display.set_mode((WIDTH, HEIGHT)) window = Window.from_display_module() renderer = Renderer(window) +pygame.mouse.set_visible(False) SCALE = pygame.Vector2(WIDTH / 1536, HEIGHT / 864) @@ -93,19 +94,6 @@ def lerp(start, end, weight): def clamp(value, minimum, maximum): return min(maximum, max(minimum, value)) - -@cache -def rotate(image, angle): - return pygame.transform.rotate(image, angle) - - -def rotate_center(image, angle, position): - rotated_image = rotate(image, round(angle)) - new_rect = rotated_image.get_rect(center=image.get_rect(topleft=(position.x - image.get_rect().width / 2, - position.y - image.get_rect().height / 2)).center) - return rotated_image, new_rect.topleft - - def determine_angle(pos1, pos2): pos1 = pygame.Vector2(pos1) pos2 = pygame.Vector2(pos2) -- 2.54.0