Jump to content

  • Log In with Google      Sign In   
  • Create Account


Inferno42

Member Since 23 Jun 2012
Offline Last Active Jun 23 2012 03:09 PM
-----

Topics I've Started

SDL_Collision Issue

23 June 2012 - 12:15 PM

I'm having a bit of trouble with collision in SDL. I've tried Lazy Foo's code and SDL_Collision librarie's. My issue is that when my character moves it detects that he is colliding with all of the tiles.

Player.h
[source lang="cpp"]#pragma once#ifndef PLAYER_H#define PLAYER_H#include "SDL_collide.h"#include "Graphics_Core.h"#include "Tile_Manager.h"#include "Debug_Overlay.h"namespace Roger{ const int ROGER_STANDING = 0; const int ROGER_RUN_LEFT_1 = 1; const int ROGER_RUN_LEFT_2 = 2; const int ROGER_RUN_LEFT_3 = 3; const int ROGER_RUN_RIGHT_1 = 4; const int ROGER_RUN_RIGHT_2 = 5; const int ROGER_RUN_RIGHT_3 = 6; class Player { public: Player(int x, int y); void Move_Left(Tile *tiles[]); void Move_Right(Tile *tiles[]); void Jump(Tile *tiles[]); void Fall(Tile *tiles[]); void Lose_Velocity(); void Draw(); int Cur_x; int Cur_y; private: double max_vel; double cur_vel; SDL_Surface* Run[5]; SDL_Surface* Roger_Sheet; SDL_Rect m_BoundBox; SDL_Rect m_ClippingRect[7]; GraphicManager m_Manager; Debug_Overlay m_DOverlay; int anim_number; }; extern Player CRoger;}#endif // PLAYER_H[/source]


Player.cpp

[source lang="cpp"]#include "Player.h"#include "System_Core.h"namespace Roger{ Player CRoger(450,200); Player::Player(int x, int y) { max_vel = 15.f; cur_vel = 0.f; Cur_x = x; Cur_y = y; this->anim_number = 0; Roger_Sheet = m_Manager.VLoad_Image("Textures\\Roger\\Roger.bmp"); m_BoundBox.x = x; m_BoundBox.y = y; m_BoundBox.w = 15; m_BoundBox.h = 29; //Standing Anim m_ClippingRect[ROGER_STANDING].x = 19; m_ClippingRect[ROGER_STANDING].y = 22; //Running Anims m_ClippingRect[ROGER_RUN_LEFT_1].x = 52; m_ClippingRect[ROGER_RUN_LEFT_1].y = 1; m_ClippingRect[ROGER_RUN_LEFT_2].x = 104; m_ClippingRect[ROGER_RUN_LEFT_2].y = 1; m_ClippingRect[ROGER_RUN_LEFT_3].x = 156; m_ClippingRect[ROGER_RUN_LEFT_3].y = 1; m_ClippingRect[ROGER_RUN_RIGHT_1].x = 1; m_ClippingRect[ROGER_RUN_RIGHT_1].y = 52; m_ClippingRect[ROGER_RUN_RIGHT_2].x = 52; m_ClippingRect[ROGER_RUN_RIGHT_2].y = 52; m_ClippingRect[ROGER_RUN_RIGHT_3].x = 104; m_ClippingRect[ROGER_RUN_RIGHT_3].y = 52; for(int i = 0; i <= 6; i++) { m_ClippingRect[i].h = 29; m_ClippingRect[i].w = 15; } } void Player::Fall(Tile *tiles[]) { } void Player::Move_Left(Tile *tiles[]) { bool Cant_Move = false; if(cur_vel < max_vel) { cur_vel += 1.f; } if(cur_vel >= max_vel) { cur_vel = 15.f; } for(int i = 0; i < TILE_AMOUNT; i++) { SDL_Rect t_BoundBox = tiles[i]->Get_Boundbox(); int t_Type = tiles[i]->Get_Ttype(); if(SDL_CollideBoundingBox(m_BoundBox,t_BoundBox) == 1) { } else if(SDL_CollideBoundingBox(m_BoundBox,t_BoundBox) == 0 && t_Type != 1) { m_DOverlay.Draw_Box(m_Surface,m_BoundBox.x,m_BoundBox.y); //Debug, checking where collisions occur SDL_Flip(m_Surface); Cant_Move = true; } if(Cant_Move == false) { Cur_x += cur_vel; } } } void Player::Move_Right(Tile *tiles[]) { bool Cant_Move = false; if(cur_vel < max_vel) { cur_vel += 1.f; } if(cur_vel >= max_vel) { cur_vel = 15.f; } for(int i = 0; i < TILE_AMOUNT; i++) { SDL_Rect t_BoundBox = tiles[i]->Get_Boundbox(); int t_Type = tiles[i]->Get_Ttype(); if(SDL_CollideBoundingBox(m_BoundBox,t_BoundBox) == 1) { } else if(SDL_CollideBoundingBox(m_BoundBox,t_BoundBox) == 0 && t_Type != 1) { m_DOverlay.Draw_Box(m_Surface,m_BoundBox.x,m_BoundBox.y); //Debug, checking where collisions occur SDL_Flip(m_Surface); Cant_Move = true; } if(Cant_Move == false) { Cur_x -= cur_vel; } } } void Player::Lose_Velocity() { cur_vel--; if(cur_vel <= 0) cur_vel = 0; } void Player::Draw() { m_Manager.VDraw(Cur_x,Cur_y,Roger_Sheet,m_Surface,m_ClippingRect[anim_number]); }}[/source]

The character is positioned at X:450 and Y:200, his is 22px hight and 19px wide. My issue is that he is colliding with nearly every single tile despite him not being remotely close to them.

PARTNERS