collision detection using list of objects in SDL

Started by
0 comments, last by wazup92324 17 years, 5 months ago
hello everyone, I’m having trouble with collision detection and finding a way to detect if a bullet is colliding with an enemy. The bullet object is pushed into a list. I created a SDL_Rect around the bullet and Enemy_A. And I am having trouble with it detecting the collision with Enemy_A and Bullet. Here is code of the bullet class: class Bullet { private: //Offsets of bullet int x, y; //The collisions of the box of the dot std::vector<SDL_Rect> box; //The const velocity of Bullet int yVel; //Move the boxes relative to the postion of the box void shift_boxes(); public: Bullet(); void set_xy(int player_x, int player_y); void show(); void move(std::vector<SDL_Rect>&rects); bool is_dead(); std::vector<SDL_Rect> &get_rects(); }; //Bullet Implementation Bullet::Bullet() { //Offsets for bullet x = 10; y = 9930; //Velocity for bullet yVel = -10; //Create the nesasarry SDL_Rects box.resize(1); //Init the collision boxes with the width and height box[0].w = 3; box[0].h = 5; shift_boxes(); } void Bullet::move(std::vector<SDL_Rect> &rects) { //Move the bullet y += yVel; //Move the rectangles shift_boxes(); } void Bullet::set_xy(int player_x, int player_y) { x = player_x; y = player_y; } void Bullet::show() { apply_surface(x - camera.x, y - camera.y, bullet, screen); } bool Bullet::is_dead() { if(y == 0) { return true; } else return false; } void Bullet::shift_boxes() { //The row offset int r = 0; //The set int set = 0; //Loop through all the rects for(set = 0; set<box.size();set++) { //Center the collision box box[set].x = x + (BULLET_WIDTH - box[set].w)/2; //Set the collision box at its row offset box[set].y = y + r; //Move the row offset down r += box[set].h; } } std::vector<SDL_Rect>&Bullet::get_rects() { //return the collision boxes return box; } here is the enemy class: class Enemy_A { private: //x and y offsets int x, y; //velocity of x and y int xVel; int yVel; //The collisions box of the player std::vector<SDL_Rect> box; //Moves the boxes relative to the postion of the box void shift_boxes(); public: //Constructor Enemy_A(); //Move the enemy void move(std::vector<SDL_Rect> &rects); //Show the enemy on the screen void show(); //Show the enemy dead body void show_body(); //Get the rectangles for the vector std::vector<SDL_Rect>&get_rects(); }; //Enemy_A implementations //New Enemy_A constructor Enemy_A::Enemy_A() { //init the offsets and dims x = 0; y = 9900;; //int the velocity xVel = 0; yVel = 0; //Create the nessasary SDL_Rects box.resize(4); //Init the collison box rects box[0].w = 3; box[0].h = 1; box[1].w = 5; box[1].h = 1; box[2].w = 7; box[2].h = 1; box[3].w = 9; box[3].h = 20; //move the collison boxes to their proper spot shift_boxes(); } //Enemy_A move() function void Enemy_A::move(std::vector<SDL_Rect> &rects) { //Move the dot left or right x += xVel; shift_boxes(); //If the dot went too far to the left or right or has collided with the other shapes if( ( x < 0 ) || ( x + ENEMY_A_WIDTH > SCREEN_WIDTH )) { //Move back x -= xVel; shift_boxes(); } //Move the dot up or down y += yVel; shift_boxes(); //If the dot went too far up or down or has collided with the other shapes if( ( y < 0 ) || ( y + ENEMY_A_HEIGHT > SCREEN_HEIGHT )) { //Move back y -= yVel; shift_boxes(); } } //Enemy_A show(); function void Enemy_A::show() { //show the Dot apply_surface(x - camera.x, y - camera.y, enemy_A, screen); } //Enemy_A show body function void Enemy_A::show_body() { apply_surface(x - camera.x, y - camera.y, deadBody, screen); } void Enemy_A::shift_boxes() { //The row offset int r = 0; //The set of rects int set = 0; //loop through all rects for(set = 0; set < box.size(); set++) { //Center the collision boxes box[set].x = x + (PLAYER_WIDTH - box[set].w)/2; //Set the collision box at its row offset box[set].y = y + r; //Move the row offset r += box[set].h; } } std::vector<SDL_Rect>&Enemy_A::get_rects() { //return the collision boxes return box; } Here is the game level //****************************************************************** //****************************************************************** //* NEW GAME FUNCTION * //****************************************************************** //****************************************************************** int new_game() { //Start the music Mix_PlayMusic(level_1M, -1); //Make the timer Timer myTimer; //Start the timer myTimer.start(); //keeps track of current bullet on screen int bullet_num = 0; //Game Over flag bool game_over = false; //Create all game objects Level1 level1; Player newPlayer; Enemy_A newEnemy; std::list<Bullet> activeBullets; //Create animations for sprites set_playerClips(); //Frame rate cap timer Timer fps; //While the user hasn't quit while( quit == false ) { fps.start(); while(SDL_PollEvent (&event)) { newPlayer.handle_input(); newPlayer.set_life(30); //If the user has Xed out the window if( event.type == SDL_QUIT ) { //Quit the program quit = true; } } //******************************************* //* Display level1 * //******************************************* level1.show(); newPlayer.move(newPlayer.get_rects()); newPlayer.set_camera(); newPlayer.show(); newEnemy.show(); newEnemy.move(newEnemy.get_rects()); if(check_collision(newPlayer.get_rects(),newEnemy.get_rects())) { newEnemy.show_body(); } //Get the keystates Uint8 *keystates = SDL_GetKeyState(NULL); //If spacebar is pressed shoot bullet if(keystates[SDLK_SPACE]) { Bullet newBullet; newBullet.set_xy(newPlayer.get_x(), newPlayer.get_y()); activeBullets.push_back(newBullet); } std::list<Bullet>::iterator iBullet = activeBullets.begin(); while(iBullet != activeBullets.end()) { if(iBullet->is_dead()) { iBullet = activeBullets.erase(iBullet); } else { iBullet->show(); iBullet->move(iBullet->get_rects()); ++iBullet; } } //Update the screen if( SDL_Flip( screen ) == -1 ) { return 1; } //Cap the frame rate with fps while(fps.get_ticks() < 1000 / FRAMES_PER_SECOND) { //wait... } } return 0; }
Advertisement
Nevermind, I fixed the problem.

thanks for looking everyone!!!

This topic is closed to new replies.

Advertisement