Add score fonts / start AI paddle
authorwatkinsr <ryanwatkins54@gmail.com>
Thu, 18 Jun 2020 14:04:51 +0000 (15:04 +0100)
committerwatkinsr <ryanwatkins54@gmail.com>
Thu, 18 Jun 2020 14:04:51 +0000 (15:04 +0100)
Makefile
game.cpp
lazy.ttf [new file with mode: 0755]

index 30b025c9d1cf6cda41367519aa936e8f11d00ed8..2f892cd8f2af8b92a4a3431aa2faf1d9651d2584 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@ CC = g++
 COMPILER_FLAGS = -w
 
 #LINKER_FLAGS specifies the libraries we're linking against
-LINKER_FLAGS = -lSDL2 -lSDL2_image
+LINKER_FLAGS = -lSDL2 -lSDL2_image -lSDL2_ttf
 
 #OBJ_NAME specifies the name of our exectuable
 OBJ_NAME = out
index 106a40e63df472eda5051ffe8f7779fd93eb8b65..ec72d6ff5d4b61b9c21ed60ed6f525828125a5b8 100755 (executable)
--- a/game.cpp
+++ b/game.cpp
@@ -1,16 +1,19 @@
-/*This source code copyrighted by Lazy Foo' Productions (2004-2020)
+       /*This source code copyrighted by Lazy Foo' Productions (2004-2020)
 
 and may not be redistributed without written permission.*/
 
 //Using SDL, SDL_image, standard IO, vectors, and strings
 #include <SDL2/SDL.h>
 #include <SDL2/SDL_image.h>
+#include <SDL2/SDL_ttf.h>
 #include <stdio.h>
 #include <string>
 
 //Screen dimension constants
 const int SCREEN_WIDTH = 640;
 const int SCREEN_HEIGHT = 480;
+static int player1Score = 0;
+static int player2Score = 0;
 
 //Texture wrapper class
 class LTexture
@@ -25,10 +28,8 @@ class LTexture
                //Loads image at specified path
                bool loadFromFile( std::string path );
                
-               #if defined(_SDL_TTF_H) || defined(SDL_TTF_H)
                //Creates image from font string
                bool loadFromRenderedText( std::string textureText, SDL_Color textColor );
-               #endif
 
                //Deallocates texture
                void free();
@@ -70,10 +71,10 @@ class Dot
     public:
 
                //Maximum axis velocity of the dot
-               static const int DOT_VEL = 10;
+               static const int DOT_VEL = 2.5;
 
                //Initializes the variables
-    Dot(Uint16 x, Uint16 y, int8_t velX, int8_t velY, Uint8 w, Uint8 h);
+    Dot(float x, float y, float velX, float velY, Uint8 w, Uint8 h);
 
                //Moves the dot
                void move( SDL_Rect& paddle1 );
@@ -81,14 +82,16 @@ class Dot
                //Shows the dot on the screen
                void render();
 
+               void reset();
+
                Circle& getCollider();
 
     private:
                //The X and Y offsets of the dot
-               int mPosX, mPosY;
+               float mPosX, mPosY;
 
                //The velocity of the dot
-               int mVelX, mVelY;
+               float mVelX, mVelY;
                //The dimensions of the dot
                
          int mWidth;
@@ -145,6 +148,12 @@ bool checkCollision( Circle& a, SDL_Rect& b );
 //Scene textures
 LTexture gDotTexture;
 
+// Score textures
+LTexture tPlayerOneScore;
+LTexture tPlayerTwoScore;
+
+TTF_Font *gFont = NULL;
+
 LTexture::LTexture()
 {
        //Initialize
@@ -159,6 +168,37 @@ LTexture::~LTexture()
        free();
 }
 
+bool LTexture::loadFromRenderedText( std::string textureText, SDL_Color textColor )
+{
+  // Get rid of preexisting texture
+  free();
+  // Render text surface
+  SDL_Surface* textSurface = TTF_RenderText_Solid( gFont, textureText.c_str(), textColor );
+  if( textSurface == NULL )
+  {
+    printf( "Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError() );
+  }
+  else
+  {
+    //Create texture from surface pixels
+    mTexture = SDL_CreateTextureFromSurface( gRenderer, textSurface );
+    if( mTexture == NULL )
+    {
+      printf( "Unable to create texture from rendered text! SDL Error: %s\n", SDL_GetError() );
+    }
+    else
+    {
+      //Get image dimensions
+      mWidth = textSurface->w;
+      mHeight = textSurface->h;
+    }
+    // Get rid of old surface
+    SDL_FreeSurface( textSurface );
+  }
+  // Return success
+  return mTexture != NULL;
+}
+
 bool LTexture::loadFromFile( std::string path )
 {
        //Get rid of preexisting texture
@@ -201,7 +241,7 @@ bool LTexture::loadFromFile( std::string path )
 }
 
 #if defined(_SDL_TTF_H) || defined(SDL_TTF_H)
-bool LTexture::loadFromRenderedText( std::string textureText, SDL_Color textColor )
+bool LTexture::loadFromRenderedText( player1Score, SDL_Color textColor )
 {
        //Get rid of preexisting texture
        free();
@@ -296,7 +336,7 @@ int LTexture::getHeight()
        return mHeight;
 }
 
-Dot::Dot(Uint16 x, Uint16 y, int8_t velX, int8_t velY, Uint8 w, Uint8 h)
+Dot::Dot(float x, float y, float velX, float velY, Uint8 w, Uint8 h)
 {
     //Initialize the offsets
     mPosX = x;
@@ -317,28 +357,46 @@ Dot::Dot(Uint16 x, Uint16 y, int8_t velX, int8_t velY, Uint8 w, Uint8 h)
 void Dot::move( SDL_Rect& paddle1)
 {
   //Move the dot left or right
-  mPosX += mVelX;
-  shiftColliders();
+
+  if (checkCollision(mCollider, paddle1))
+  {
+       float amount = (mPosY - (paddle1.y + (paddle1.h/2))) / 10;
+       mVelX = -mVelX;
+       mVelY = amount;
+       printf("amount: %f, mVelX: %f, mVelY: %f paddle1.y: %d, paddle1.h: %d, mPosY: %f\n", 
+               amount, mVelX, mVelY, paddle1.y, paddle1.h, mPosY);
+  }
 
   //If the dot collided or went too far to the left or right
-  if( ( mPosX - mCollider.r < 0 ) || ( mPosX + mCollider.r > SCREEN_WIDTH ) || checkCollision( mCollider, paddle1 ))
+  if( ( mPosX - mCollider.r < 0 ) || ( mPosX + mCollider.r > SCREEN_WIDTH ) )
+  {
+    printf("Score\n"); 
+    reset();
+  }
+
+  //If the dot collided or went too far up or down
+  if( ( mPosY - mCollider.r < 0 ) || ( mPosY + mCollider.r > SCREEN_HEIGHT ) )
   {
     //Move back
-    mPosX -= mVelX;
+    mVelY = -mVelY; 
     shiftColliders();
   }
 
+  mPosX += mVelX;
+  shiftColliders();
   //Move the dot up or down
   mPosY += mVelY;
   shiftColliders();
+}
 
-  //If the dot collided or went too far up or down
-  if( ( mPosY - mCollider.r < 0 ) || ( mPosY + mCollider.r > SCREEN_HEIGHT ) || checkCollision( mCollider, paddle1 ))
-  {
-    //Move back
-    mPosY -= mVelY;
-    shiftColliders();
-  }
+void Dot::reset() 
+{
+       mPosX = SCREEN_WIDTH/2;
+       mPosY = SCREEN_HEIGHT/2;
+       mVelX = -(DOT_VEL);
+       mVelY = 1;
+       mWidth = 10;
+       mHeight = 10;
 }
 
 void Dot::render()
@@ -518,6 +576,13 @@ bool init()
                                        printf( "SDL_image could not initialize! SDL_image Error: %s\n", IMG_GetError() );
                                        success = false;
                                }
+
+        // Initialize SDL_ttf
+        if( TTF_Init() == -1 )
+        {
+          printf( "SDL_ttf could not initialize! SDL_ttf Error: %s\n", TTF_GetError() );
+          success = false;
+        }
                        }
                }
        }
@@ -530,6 +595,26 @@ bool loadMedia()
        //Loading success flag
        bool success = true;
 
+       // Open the font
+       gFont = TTF_OpenFont("lazy.ttf", 20);
+
+       if( gFont == NULL )
+       {
+    printf( "Failed to load lazy font! SDL_ttf Error: %s\n", TTF_GetError() );
+    success = false;
+  }
+  else
+  {
+    // Render text
+    SDL_Color textColor = { 0xFF, 0xFF, 0xFF };
+    if( !tPlayerOneScore.loadFromRenderedText( std::to_string(player1Score), textColor ) || 
+               !tPlayerTwoScore.loadFromRenderedText( std::to_string(player2Score), textColor ))
+    {
+      printf( "Failed to render text texture!\n" );
+      success = false;
+    }
+  }
+
        //Load dot texture
        if( !gDotTexture.loadFromFile( "dot.bmp" ) )
        {
@@ -544,6 +629,11 @@ void close()
 {
        //Free loaded images
        gDotTexture.free();
+       tPlayerOneScore.free();
+       tPlayerTwoScore.free();
+
+       TTF_CloseFont( gFont );
+       gFont = NULL;
 
        //Destroy window        
        SDL_DestroyRenderer( gRenderer );
@@ -552,6 +642,7 @@ void close()
        gRenderer = NULL;
 
        //Quit SDL subsystems
+       TTF_Quit();
        IMG_Quit();
        SDL_Quit();
 }
@@ -580,9 +671,9 @@ int main( int argc, char* args[] )
 
                        //The dot that will be moving around on the screen
                        Paddle paddle = Paddle(10, SCREEN_HEIGHT/2, 0, 0, 8, 40);
+                       Paddle ai = Paddle(SCREEN_WIDTH-10, SCREEN_HEIGHT/2, 0, 0, 8, 40);
 
-                       Dot ball = Dot(SCREEN_WIDTH/2, SCREEN_HEIGHT/2, -1, 1, 10, 10);
-                       gDotTexture.setColor(0xFF, 0xFF, 0xFF);
+                       Dot ball = Dot(SCREEN_WIDTH/2, SCREEN_HEIGHT/2, -(ball.DOT_VEL), 1, 10, 10);
 
                        //While application is running
                        while( !quit )
@@ -602,18 +693,23 @@ int main( int argc, char* args[] )
 
                                //Move the dot
                                paddle.move();
+                               ai.move();
                                ball.move(paddle.getCollider());
 
                                //Clear screen
                                SDL_SetRenderDrawColor( gRenderer, 0x00, 0x00, 0x00, 0xFF );
                                SDL_RenderClear( gRenderer );
-               
+
+                               // Try to render score text
+                               tPlayerOneScore.render(SCREEN_WIDTH/4, 40);
+
                                //Render middle line
                                SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
                                SDL_RenderDrawLine(gRenderer, SCREEN_WIDTH/2, 0, SCREEN_WIDTH/2, SCREEN_HEIGHT);
 
                                //Render objects
                                paddle.render();
+                               ai.render();
                                ball.render();
 
                                //Update screen
diff --git a/lazy.ttf b/lazy.ttf
new file mode 100755 (executable)
index 0000000..eb1000b
Binary files /dev/null and b/lazy.ttf differ