与瓷砖碰撞的问题,使用AABB

稍微查看一下碰撞后。 我似乎无法find我每次触摸它发送给我的瓷砖底部的错误,并将我抛出到瓷砖的右侧。 如果有人能够帮助我,我会很感激,我会在下面复制所有相关的代码。

void Game::update(float dt) { //check collision with world vector<Tile>* world = level.getLevel(); for (int i = 0; i < (int)world->size(); i++) { if ((*world)[i].isAlive()) { //if "alive" check collision //world tile that are not alive don't do checks if (checkCollision(&mario, &(*world)[i])) { mario.collisionResponse(&(*world)[i]); } } } bool Game::checkCollision(MySprite* sprite, MySprite* sprite2) { if (sprite->getAABB().left + sprite->getAABB().width <sprite2->getAABB().left) return false; if (sprite->getAABB().left > sprite2->getAABB().left + sprite2->getAABB().width) return false; if (sprite->getAABB().top + sprite->getAABB().height < sprite2->getAABB().top) return false; if (sprite->getAABB().top > sprite2->getAABB().top + sprite2->getAABB().height) return false; return true; } 

马里奥class

 void Mario::collisionResponse(MySprite* sp) { //setPosition(getPosition().x, sp->getPosition().y - getSize().y); //velocity.y = 0; sf::Vector2f collide(getPosition().x - sp->getPosition().x, getPosition().y - sp->getPosition().y); //check left side if (abs(collide.x) > abs(collide.y)) { if (collide.x < -5) { //right side setPosition(sp->getPosition().x - getSize().x-1, getPosition().y); velocity.x = 0; } if (collide.x > 5) { //left side setPosition(sp->getPosition().x + sp->getSize().x + 1, getPosition().y); velocity.x = 0; } } else { if (collide.y < -5) { setPosition(getPosition().x, sp->getPosition().y - getSize().y); velocity.y = 0; } else if (collide.y > 5) { setPosition(getPosition().x, sp->getPosition().y + getSize().y); velocity.y = 0; falling = false; } } }