SDL C++ Collision on multiple objects?

时间:2017-12-18 08:15:42

标签: c++ collision

So I was determined to get collision working myself from online resources without asking for help & I successfully followed a tutorial on lazyfoo to get collision working but quickly realised other problems.

So I started trying to get my collision working on my player (just a rect with controls atm) but couldn't actually access the rect inside the player class, I had to initialize it in main & use that for collision which meant transferring my collision function to main (not exactly perfect).

My question: So my collision is limited to two rects which I dedicated to the player & a single asteroid but my idea was to create multiple asteroids coming from the top of the screen, how would I go about altering the below code to accept a vector of "asteroids". Any advice about altering my code to be better object oriented etc is more then welcome but my main problem is collision. Please read collision carefully before posting, the specific X and Y params from the .cpp provides are hardcoded there.

Below Code order:

  • My current way of defining both player & asteroid for collision
  • Collision function
  • Asteroid.cpp & Player.cpp
  • My new way of loading asteroids - This is what I need collision to work with

    package dao;
    
    import java.util.List;
    
    import org.hibernate.criterion.DetachedCriteria;
    import org.springframework.orm.hibernate4.HibernateTemplate;
    import org.springframework.transaction.annotation.Transactional;
    import model.Student;
    
    public class StudentDaoImplHT implements StudentDaoInterface {
    
        private HibernateTemplate ht;
    
        public void setHt(HibernateTemplate ht) {
            this.ht = ht;
        }
    
        @Override
        @Transactional(readOnly = false)
        public int save(Student st) {
    
            int i=(Integer)ht.save(st);
            return i;
        }
    
                        .
                        .
                        .
                        .
    
    }
    

    What I need collision to work with, a vector of asteroids:

    Player aPlayer(200, 50, 50, 50);
    Asteroid oneAsteroid(200, -50, 50, 50);
    
    bool check_collision(SDL_Rect aPlayer, SDL_Rect oneAsteroid) {
    
        //The sides of the rectangles
        int leftA, leftB;
        int rightA, rightB;
        int topA, topB;
        int bottomA, bottomB;
    
        //Calculate the sides of rect A
        leftA = aPlayer.X;
        rightA = aPlayer.X + aPlayer.width;
        topA = aPlayer.Y;
        bottomA = aPlayer.Y + aPlayer.height;
    
        //Calculate the sides of rect B
        leftB = oneAsteroid.X;
        rightB = oneAsteroid.X + oneAsteroid.width;
        topB = oneAsteroid.Y;
        bottomB = oneAsteroid.Y + oneAsteroid.height;
    
    
        if (bottomA <= topB)
        {
            return false;
        }
    
        if (topA >= bottomB)
        {
            return false;
        }
    
        if (rightA <= leftB)
        {
            return false;
        }
    
        if (leftA >= rightB)
        {
            return false;
        }
    
        //If none of the sides from A are outside B
        return true;
    }
    
    #include "asteroids.h"
    
    Asteroid::Asteroid()
    {
    
    
    }
    
    Asteroid::~Asteroid()
    {
    
    
    }
    
    Asteroid::Asteroid(int x, int y, int w, int h)
    {
        X = x; Y = y; width = w; height = h;
        //SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Square Constructed with Param(&p)", this);
    
    }
    
    void Asteroid::Render(SDL_Renderer * aRenderer)
    {
        printf("");
        SDL_Rect* aAsteroid = new SDL_Rect();
        aAsteroid->x = X; aAsteroid->y = Y; aAsteroid->w = width; aAsteroid->h = height;
        SDL_SetRenderDrawColor(aRenderer, 0, 0, 0, 255);
        SDL_RenderFillRect(aRenderer, aAsteroid);
    
    }
    
    void Asteroid::Init()
    {
        velocity.X = 0;
        velocity.Y = 5;
    
    }
    
    void Asteroid::Update()
    {
        Y = Y + velocity.Y;
    //  printf("%d \n", Astero);
        if (Y > 650) {
            Y = -50;
        }
    
    }
    
    #include "Player.h"
    #include "asteroids.h"
    
    using namespace std;
    
    Player::Player()
    {
    }
    
    Player::~Player()
    {
        SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Player Destroyed (&p)", this);
    }
    
    Player::Player(int x, int y, int w, int h)
    {
        X = x; Y = y; width = w; height = h;
        //SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Square Constructed with Param(&p)", this);
    
    }
    
    void Player::Init()
    {
        velocity.X = 10;
        velocity.Y = 10;
    }
    
    void Player::Update()
    {
        Y = Y + floorStart;
    
        if (X < 0) {
            X = 0;
        }
    
        if (KEY_RIGHT == true) {
            X++;
        }
    
        if (X > SCREEN_WIDTH - 50) {
            X = SCREEN_WIDTH - 50;
        }
    
        if (Y > SCREEN_HEIGHT - 100) {
            Y = SCREEN_HEIGHT - 100;
        }
    
        if (KEY_LEFT == true) {
            X--;
        }
    
    
    }
    
    void Player::Input(SDL_Event event)
    {
    
    
        if (event.type == SDL_KEYDOWN && event.key.repeat == NULL)
        {
            if (event.key.keysym.sym == SDLK_LEFT) {
                KEY_LEFT = true;
            }
            else {
                KEY_LEFT = false;
            }
    
            if (event.key.keysym.sym == SDLK_RIGHT) {
                KEY_RIGHT = true;
            }
            else {
                KEY_RIGHT = false;
            }
        }
    
        if (event.type == SDL_KEYUP && event.key.repeat == NULL) {
            if (event.key.keysym.sym == SDLK_LEFT) {
                KEY_LEFT = false;
            }
            if (event.key.keysym.sym == SDLK_RIGHT) {
                KEY_RIGHT = false;
            }
    
        }
    }
    
    void Player::Render(SDL_Renderer * aRenderer)
    {
        SDL_Rect* thePlayer = new SDL_Rect;
        thePlayer->x = X; thePlayer->y = Y; thePlayer->w = width; thePlayer->h = height;
        SDL_SetRenderDrawColor(aRenderer, 0, 0, 0, 255);
        SDL_RenderFillRect(aRenderer, thePlayer);
        //SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Rendering (&p)", this);
    }
    

    The function to check collision in main.cpp

    std::vector<Asteroid*> asteroidList;
    asteroidList.push_back(new Asteroid(150, 350, 50, 50));
    asteroidList.push_back(new Asteroid(70, 120, 125, 125));
    

And lastly, how would I go about rendering the array of asteroids?

0 个答案:

没有答案