From: Skullheadx <94652084+Skullheadx@users.noreply.github.com> Date: Fri, 2 Jun 2023 13:27:41 +0000 (-0400) Subject: better fruit spawning X-Git-Tag: game~24 X-Git-Url: http://git.skullheadx.com/nixos/README?a=commitdiff_plain;h=9a94eb4053ec0c006cf199cf85ce809292904596;p=fruit-ninja.git better fruit spawning --- diff --git a/effect.py b/effect.py index 6438368..735d0db 100644 --- a/effect.py +++ b/effect.py @@ -5,7 +5,8 @@ class Effect: LIFE_TIME = 500 SPEED_RANGE = [150, 250] RADIUS_RANGE = [0.25, 0.75] - DARKEN = {RED: DARK_RED, ORANGE: DARK_ORANGE, YELLOW: DARK_YELLOW, GREEN: DARK_GREEN, BLUE: DARK_BLUE, PURPLE: DARK_PURPLE} + + OUTLINE_WIDTH = 1 def __init__(self, position, radius, color): self.position = pygame.Vector2(position) @@ -13,7 +14,8 @@ class Effect: self.SPEED_RANGE[0],self.SPEED_RANGE[1],random.random()) self.radius = radius * lerp(self.RADIUS_RANGE[0], self.RADIUS_RANGE[1], random.random()) self.time = self.LIFE_TIME - self.color = self.DARKEN[color] + self.color = DARKEN[color] + self.outline_color = color def update(self, delta): self.position += self.velocity * delta / 1000 @@ -23,3 +25,4 @@ class Effect: def draw(self, surf): pygame.draw.circle(surf, self.color, self.position, self.radius) + pygame.draw.circle(surf, self.outline_color, self.position, self.radius, self.OUTLINE_WIDTH) diff --git a/fruit.py b/fruit.py index 35059b6..5a97859 100644 --- a/fruit.py +++ b/fruit.py @@ -1,24 +1,35 @@ +import pygame + from setup import * class Fruit: - SPAWN_RANGE = [WIDTH / 5, WIDTH * 4 / 5] - VERTICAL_VELOCITY_RANGE = [-500, -300] - HORIZONTAL_VELOCITY_RANGE = [-150, 150] - GRAVITY = 275 - RADIUS_RANGE = [25, 50] - COLORS = [RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE] + HORIZONTAL_SPAWN_RANGE = [WIDTH / 5, WIDTH * 4 / 5] + VERTICAL_SPAWN_RANGE = [HEIGHT + max(RADIUS_RANGE), HEIGHT*2 + max(RADIUS_RANGE) ] + + VERTICAL_TARGET_RANGE = [HEIGHT / 5, HEIGHT * 2/3] + HORIZONTAL_TARGET_RANGE = [WIDTH / 5, WIDTH * 4 / 5] + + GRAVITY = 275 + COLORS = [RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE] + OUTLINE_WIDTH =3 def __init__(self): self.radius = lerp(self.RADIUS_RANGE[0], self.RADIUS_RANGE[1], random.random()) - self.position = pygame.Vector2(lerp(self.SPAWN_RANGE[0], self.SPAWN_RANGE[1], random.random()), - HEIGHT - self.radius) - self.velocity = pygame.Vector2( - lerp(self.HORIZONTAL_VELOCITY_RANGE[0], self.HORIZONTAL_VELOCITY_RANGE[1], random.random()), - lerp(self.VERTICAL_VELOCITY_RANGE[0], self.VERTICAL_VELOCITY_RANGE[1], random.random())) + + self.target = pygame.Vector2(lerp(self.HORIZONTAL_TARGET_RANGE[0], self.HORIZONTAL_TARGET_RANGE[1], random.random()),lerp(self.VERTICAL_TARGET_RANGE[0], self.VERTICAL_TARGET_RANGE[1], random.random())) + self.position = pygame.Vector2(lerp(self.HORIZONTAL_SPAWN_RANGE[0], self.HORIZONTAL_SPAWN_RANGE[1], random.random()), + lerp(self.VERTICAL_SPAWN_RANGE[0], self.VERTICAL_SPAWN_RANGE[1], random.random())) self.acceleration = pygame.Vector2(0, self.GRAVITY) + + + dy = self.target.y-self.position.y + dx = self.target.x-self.position.x + t = (-2 / self.GRAVITY * dy)**0.5 + self.velocity = pygame.Vector2(dx/t, -(-2 * self.GRAVITY * dy)**0.5) + self.color = random.choice(self.COLORS) def update(self, delta): @@ -31,3 +42,6 @@ class Fruit: def draw(self, surf): pygame.draw.circle(surf, self.color, self.position, self.radius) + pygame.draw.circle(surf, DARKEN[self.color], self.position, self.radius, self.OUTLINE_WIDTH) + + # pygame.draw.circle(surf, BLACK, self.target, 10) diff --git a/game.py b/game.py index 1762ccb..5749803 100644 --- a/game.py +++ b/game.py @@ -30,12 +30,12 @@ class Game: if self.player.hits(fruit): hits.append(fruit) fr = fruit.get_rect() - if (not -fruit.radius < fr.x < WIDTH + fruit.radius) or fr.y > HEIGHT: + if ((not -fruit.radius < fr.x < WIDTH + fruit.radius) or fr.y > HEIGHT) and fruit.velocity.y > 0: self.fruits.remove(fruit) for hit in hits: for i in range(self.EFFECT_COUNT_PER_FRUIT): - self.effects.append(Effect(hit.position, hit.radius, fruit.color)) + self.effects.append(Effect(hit.position, hit.radius, hit.color)) self.fruits.remove(hit) for effect in self.effects: @@ -48,7 +48,7 @@ class Game: if self.player.hits(bomb): return COMMAND_START br = bomb.get_rect() - if (not -bomb.RADIUS < br.x < WIDTH + bomb.RADIUS) or br.y > HEIGHT: + if ((not -bomb.RADIUS < br.x < WIDTH + bomb.RADIUS) or br.y > HEIGHT) and bomb.velocity.y > 0: self.bombs.remove(bomb) if len(self.fruits) == 0 and len(self.bombs) == 0: diff --git a/setup.py b/setup.py index 328ffd7..0d2533a 100644 --- a/setup.py +++ b/setup.py @@ -20,12 +20,15 @@ YELLOW = (255, 255, 0) PURPLE = (128, 0, 128) BROWN = (139, 69, 19) + DARK_RED = (139, 0, 0) DARK_GREEN = (0, 100, 0) DARK_BLUE = (0, 0, 139) DARK_ORANGE = (255, 140, 0) DARK_YELLOW = (255, 215, 0) DARK_PURPLE = (75, 0, 130) +DARKEN = {RED: DARK_RED, ORANGE: DARK_ORANGE, YELLOW: DARK_YELLOW, GREEN: DARK_GREEN, BLUE: DARK_BLUE, PURPLE: DARK_PURPLE} +LIGHTEN = {RED: ORANGE, ORANGE: YELLOW, YELLOW: GREEN, GREEN: BLUE, BLUE: PURPLE, PURPLE: RED} # commands COMMAND_EXIT = 0