From d5f6569ff50f753bb7a11d955818eec1f95447a9 Mon Sep 17 00:00:00 2001 From: yannickreiss Date: Sun, 25 Aug 2024 08:16:35 +0200 Subject: [PATCH] Enemy with collision detection, spawns randomly --- img/UFO.png | Bin 0 -> 22400 bytes src/ballon_bounce.adb | 134 ++++++++++++++++++++++++++++++++------- src/random_functions.adb | 38 +++++++++++ src/random_functions.ads | 7 ++ 4 files changed, 157 insertions(+), 22 deletions(-) create mode 100644 img/UFO.png create mode 100644 src/random_functions.adb create mode 100644 src/random_functions.ads diff --git a/img/UFO.png b/img/UFO.png new file mode 100644 index 0000000000000000000000000000000000000000..2b04884ddab0baaf81488220b046e2c5262aa64f GIT binary patch literal 22400 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 Yy@?NPvtj$y$JDRac1cr0{%rPKbBdv@(AM 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 literal 0 HcmV?d00001 diff --git a/src/ballon_bounce.adb b/src/ballon_bounce.adb index acfca3e..3bf1717 100644 --- a/src/ballon_bounce.adb +++ b/src/ballon_bounce.adb @@ -16,15 +16,20 @@ use Sf.Window; use Sf.System; use Sf; -with Ada.Text_IO; use Ada.Text_IO; +with Ada.Text_IO; use Ada.Text_IO; +with Ada.Numerics.Elementary_Functions; use Ada.Numerics.Elementary_Functions; +with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random; +with Ada.Numerics.Discrete_Random; + +with Random_Functions; use Random_Functions; procedure Ballon_Bounce is -- Window structure - Width : sfUint32 := 1_000; - Height : sfUint32 := 750; - Width_Float : Float := 1_000.0; - Height_Float : Float := 750.0; + Width : constant sfUint32 := 1_000; + Height : constant sfUint32 := 750; + Width_Float : constant Float := 1_000.0; + Height_Float : constant Float := 750.0; Main_Window : sfRenderWindow_Ptr := RenderWindow.create ((Width, Height, 32), "Balloon Bouncer!"); Event_Hook : Event.sfEvent; @@ -35,42 +40,79 @@ procedure Ballon_Bounce is Background : sfSprite_Ptr := Sprite.create; -- Set platform - Platform_Texture : sfTexture_Ptr := + Platform_Texture : sfTexture_Ptr := Texture.createFromFile ("img/pipe.png"); - Platform : sfSprite_Ptr := Sprite.create; - Platform_Width : Float := 250.0; - Platform_Height : Float := 50.0; + Platform : sfSprite_Ptr := Sprite.create; + Platform_Width : constant Float := 250.0; + Platform_Height : constant Float := 50.0; -- Set Ball type Vector2 is record X : Float; Y : Float; end record; - Ball_Texture : sfTexture_Ptr := Texture.createFromFile ("img/ball.png"); - Ball : sfSprite_Ptr := Sprite.create; - Ball_Size : Float := 93.0; + Ball_Texture : sfTexture_Ptr := Texture.createFromFile ("img/ball.png"); + Ball : sfSprite_Ptr := Sprite.create; + Ball_Size : constant Float := 93.0; + + -- Set easy enemies + Enemy_1_Texture : sfTexture_Ptr := Texture.createFromFile ("img/UFO.png"); + Enemy_1 : sfSprite_Ptr := Sprite.create; + Enemy_1_Width : constant Float := 186.0; + Enemy_1_Height : constant Float := 77.0; + Enemy_1_Position : Vector2 := (-100.0, -100.0); -- Game Coordinates - -- subtype Platform_X_Position is - -- Float range 0.0 .. (Width_Float - Platform_Width); - Platform_X : Float := 0.0; + Platform_X : Float := (Width_Float / 2.0) - (Platform_Width / 2.0); Platform_Y : Float := Height_Float - Platform_Height; Platform_Speed : Float := 8.0; - Ball_X : Float := Width_Float / 2.0; - Ball_Y : Float := Height_Float / 2.0; - Ball_Direction : Vector2 := (1.0, -1.0); + Ball_X : Float := (Width_Float / 2.0) - (Ball_Size / 2.0); + Ball_Y : Float := (Height_Float / 2.0) - (Ball_Size / 2.0); + Ball_Direction : Vector2 := (0.0, 1.0); Ball_Speed : Float := 5.0; + Player_Score : Natural := 0; + + -- Random number generator + + function Rotate_Vector + (Crossing_Place : Float; Direction : Vector2) return Vector2 + is + Result : Vector2; + Angle : constant Float := Crossing_Place / 75.0; + Length : Float; + begin + + Result.X := Angle; + Result.Y := Direction.Y; + + Length := Sqrt ((Result.X * Result.X) + (Result.Y * Result.Y)); + + -- Norming the vector to prevent speed changes + while (Length > 1.2) or (Length < 0.8) loop + Result.X := Result.X / Length; + Result.Y := Result.Y / Length; + Length := Sqrt ((Result.X * Result.X) + (Result.Y * Result.Y)); + end loop; + + -- Prevent glitching down + if Result.Y >= -1.0 then + Result.Y := Result.Y - 1.0; + end if; + + return Result; + end Rotate_Vector; begin RenderWindow.setFramerateLimit (Main_Window, 30); - -- Background initialization + -- Background and position initialization Sprite.setTexture (Background, Background_Texture); Sprite.setPosition (Background, (Float (0), Float (0))); - -- Platform and Ball texture binding + -- Interactive element texture binding Sprite.setTexture (Platform, Platform_Texture); Sprite.setTexture (Ball, Ball_Texture); + Sprite.setTexture (Enemy_1, Enemy_1_Texture); while RenderWindow.isOpen (Main_Window) = sfTrue loop while RenderWindow.PollEvent (Main_Window, event => Event_Hook) = @@ -101,6 +143,7 @@ begin end loop; -- BEGIN: Computing area + -- BEGIN: Ball collision detection Ball_X := Ball_X + (Ball_Direction.X * Ball_Speed); Ball_Y := Ball_Y + (Ball_Direction.Y * Ball_Speed); @@ -114,26 +157,70 @@ begin -- Ball below platform! Possibly Lost! if ((Ball_Y + Ball_Size) >= Platform_Y) then - Put_Line ("INFO: The Ball was catched at Y = " & Ball_Y'Image); -- Check if platform was hit, or game is lost if ((Ball_X + (Ball_Size / 2.0)) >= Platform_X) and ((Ball_X + (Ball_Size / 2.0)) <= (Platform_X + Platform_Width)) then Ball_Direction.Y := Ball_Direction.Y * (-1.0); + + -- Change direction + Ball_Direction := + Rotate_Vector + ((Ball_X + (Ball_Size / 2.0)) - + (Platform_X + (Platform_Width / 2.0)), + Ball_Direction); + + -- The Ball seems to rebounce randomly, so we move it away quicker + Ball_Y := Ball_Y - (Ball_Speed * 1.5); + + -- Speed up the ball + Ball_Speed := Ball_Speed + 0.1; + + -- Check if no enemy is present, if so, maybe spawn one + if Enemy_1_Position.X = -100.0 then + if Spawn_Enemy then + Enemy_1_Position.X := + Generate_Coordinates (Width_Float - Enemy_1_Width); + Enemy_1_Position.Y := + Generate_Coordinates + ((Height_Float * 0.8) - Enemy_1_Height); + end if; + end if; else -- Game is Lost, reset for now Ball_X := Width_Float / 2.0; Ball_Y := Height_Float / 2.0; - Ball_Direction := (1.0, 1.0); + Ball_Direction := (0.0, 1.0); end if; end if; + -- END: Ball collision detection + + -- BEGIN: Enemy collision detection + + -- Check vertical collision + if ((Ball_Y + Ball_Size) >= Enemy_1_Position.Y) and + (Ball_Y <= (Enemy_1_Position.Y + Enemy_1_Height)) + then + -- Check horizontal collision + if ((Ball_X + Ball_Size) >= Enemy_1_Position.X) and + (Ball_X <= (Enemy_1_Position.X + Enemy_1_Width)) + then + -- Detected collision + Player_Score := Player_Score + 5; + Enemy_1_Position.X := -100.0; + Enemy_1_Position.Y := -100.0; + Put_Line (Player_Score'Image); + end if; + end if; + -- END: Enemy collision detection -- END: Computing area -- BEGIN: Update states Sprite.setPosition (Platform, (Platform_X, Platform_Y)); Sprite.setPosition (Ball, (Ball_X, Ball_y)); + Sprite.setPosition (Enemy_1, (Enemy_1_Position.X, Enemy_1_Position.Y)); -- END: Update states @@ -142,6 +229,9 @@ begin -- BEGIN: Draw area RenderWindow.drawSprite (Main_Window, Background); RenderWindow.drawSprite (Main_Window, Platform); + RenderWindow.drawSprite (Main_Window, Enemy_1); + + -- Always on Top RenderWindow.drawSprite (Main_Window, Ball); -- END: Draw area diff --git a/src/random_functions.adb b/src/random_functions.adb new file mode 100644 index 0000000..812a1f5 --- /dev/null +++ b/src/random_functions.adb @@ -0,0 +1,38 @@ +package body Random_Functions is + function Spawn_Enemy return Boolean is + subtype Die is Natural range 1 .. 6; + subtype Dice is Natural range 2 * Die'First .. 2 * Die'Last; + package Random_Die is new Ada.Numerics.Discrete_Random (Die); + use Random_Die; + G : Generator; + D : Dice; + Random_Number : Natural; + begin + Reset (G); + Random_Number := Random (G); + if Random_Number = 2 then + return True; + else + return False; + end if; + end Spawn_Enemy; + + function Generate_Coordinates (Limit : Float) return Float is + subtype Coordinate is Integer range 1 .. Integer (Limit); + subtype Coordinates is + Integer range 2 * Coordinate'First .. 2 * Coordinate'Last; + package Random_Coordinate is new Ada.Numerics.Discrete_Random + (Coordinate); + use Random_Coordinate; + G : Generator; + D : Coordinates; + Random_Number : Float; + begin + Reset (G); + Random_Number := Float (Random (G)); + if Random_Number < 0.0 then + Random_Number := Random_Number * (-1.0); + end if; + return Random_Number; + end Generate_Coordinates; +end Random_Functions; diff --git a/src/random_functions.ads b/src/random_functions.ads new file mode 100644 index 0000000..a315564 --- /dev/null +++ b/src/random_functions.ads @@ -0,0 +1,7 @@ +with Ada.Numerics.Discrete_Random; +with Ada.Numerics.Float_Random; + +package Random_Functions is + function Spawn_Enemy return Boolean; + function Generate_Coordinates (Limit : Float) return Float; +end Random_Functions;