]> Skullheadx's Git Forge - fruit-ninja.git/commitdiff
better fruit spawning
authorSkullheadx <94652084+Skullheadx@users.noreply.github.com>
Fri, 2 Jun 2023 13:27:41 +0000 (09:27 -0400)
committerSkullheadx <94652084+Skullheadx@users.noreply.github.com>
Fri, 2 Jun 2023 13:27:41 +0000 (09:27 -0400)
effect.py
fruit.py
game.py
setup.py

index 643836894b27f5b409e445f0238dd7368450109a..735d0dbe66f03692091ba4c5c251bc49df82d5b7 100644 (file)
--- 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)
index 35059b65ed0ca64189ed5c6b36f219ab4ca52c7d..5a9785921c378502d613841887f4e96ec6e7f12b 100644 (file)
--- 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 1762ccb3471bb604868f2dbf18938e0b1ac3c4f7..5749803ad376b94791bcfe1fa33b05650df0a389 100644 (file)
--- 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:
index 328ffd7a93efa4ff1e7dba94df416ab71cb4969b..0d2533aeac2577a2736f3b0e9074a3b2f0af61df 100644 (file)
--- 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