Welcome, Guest. Please login or register. Did you miss your activation email?

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - nikiblauer

Pages: [1]
1
General / TileMap Collision. Help please!!
« on: October 13, 2016, 03:35:00 pm »
Hello and I wanted to ask you, if you could help me with my tilemap-collision problem i have.
I don't know what i have done wrong, but the collision on the x axis doesn't work.Please help me !!!!

 I took this from the "SFML Game Development by example" book.

Here is the collision checking:


Checkcollision:

void EntityBase::CheckCollisions() {
   Map* gameMap = m_gamemap;
   unsigned int tileSize = gameMap->GetTileSize();
   int fromX = floor(m_AABB.left / tileSize);
   int toX = floor((m_AABB.left + m_AABB.width) / tileSize);
   int fromY = floor(m_AABB.top / tileSize);
   int toY = floor((m_AABB.top + m_AABB.height) / tileSize);

   for (int x = fromX; x <= toX; ++x) {
      for (int y = fromY; y <= toY; ++y) {
         Tile* tile = gameMap->GetTile(x, y);
         if (!tile) { continue; }

         sf::FloatRect tileBounds(x * tileSize, y * tileSize, tileSize, tileSize);
         sf::FloatRect intersection;
         m_AABB.intersects(tileBounds, intersection);

         float area = intersection.width * intersection.height;
         

         CollisionElement e(area, tile->properties, tileBounds);
         m_collisions.emplace_back(e);
         std::cout << m_collisions.size() << std::endl;
      }
   }
}



Resolving it:

void EntityBase::ResolveCollisions() {
   if (!m_collisions.empty()) {
      std::sort(m_collisions.begin(), m_collisions.end(), SortCollisions);
      Map* gameMap = m_gamemap;
      unsigned int tileSize = gameMap->GetTileSize();
      for (auto &itr : m_collisions) {
         
         
         
         float xDiff = (m_AABB.left + (m_AABB.width / 2)) - (itr.m_tileBounds.left + (itr.m_tileBounds.width / 2));
         float yDiff = (m_AABB.top + (m_AABB.height / 2)) - (itr.m_tileBounds.top + (itr.m_tileBounds.height / 2));
         float resolve = 0;
         if (abs(xDiff) > abs(yDiff)) {
            if (xDiff > 0) {
               resolve = (itr.m_tileBounds.left + tileSize) - m_AABB.left;
            }
            else {
               resolve = -((m_AABB.left + m_AABB.width) - itr.m_tileBounds.left);
            }
            Move(resolve, 0);
            m_velocity.x = 0;
            m_collidingOnX = true;
         }
         else {
            if (yDiff > 0) {
               resolve = (itr.m_tileBounds.top + tileSize) - m_AABB.top;
            }
            else {
               resolve = -((m_AABB.top + m_AABB.height) - itr.m_tileBounds.top);
            }
            Move(0, resolve);
            m_velocity.y = 0;
            if (m_collidingOnY) { continue; }
            m_referenceTile = itr.m_tile;
            m_collidingOnY = true;
         }
      }
      m_collisions.clear();
   }
   if (!m_collidingOnY) { m_referenceTile = nullptr; }
}

//m_AABB is the player's floatrect

hope you can help me thanks.

Pages: [1]
anything