Collision Player::checkForShubbery(const glm::vec3& newPosition) { glm::vec3 noXZ = glm::vec3(m_currentPosition.x, newPosition.y, m_currentPosition.y); if (m_collisionMode == CollisionMode::AABB) { AABBCollider me = AABBCollider::centeredOnPoint(newPosition, 1.2f); AABBCollider me2 = AABBCollider::centeredOnPoint(noXZ, 1.2f); if (m_chunkPositionsFoliage.size() > 0) { for (auto& it : m_chunkPositionsFoliage) { AABBCollider other = AABBCollider::centeredOnPoint(it, 1.2f); if (AABBCollider::checkCollision(me, other)) { if (AABBCollider::checkCollision(me2, other)) { std::cout << "almost hittin' them good'ol foliage-xz" << std::endl; return Collision::CollidingXZ; } std::cout << "hittin' them good'ol foliage" << std::endl; return Collision::Colliding; } } } } else { SphereCollider meAll = SphereCollider(newPosition, 1.0f); SphereCollider meNoXZ = SphereCollider(noXZ, 1.0f); if (m_chunkPositionsFoliage.size() > 0) { for (auto& it : m_chunkPositionsFoliage) { SphereCollider other = SphereCollider(it, 1.0f); if (SphereCollider::checkCollision(meAll, other)) { if (SphereCollider::checkCollision(meNoXZ, other)) { std::cout << "almost hittin' them good'ol foliage-xz" << std::endl; return Collision::CollidingXZ; } std::cout << "hittin' them good'ol foliage" << std::endl; return Collision::Colliding; } } } } return Collision::NoCollision; }
void CSword::Initialise(){ m_collisionObject.SetActive(false); m_position = { 0.0f, 0.0f, 0.0f }; m_collisionObject = SphereCollider(2.0f, m_position); m_gameObjectType = SWORD; p_flagged = false; m_alive = false; m_timer = 0.0f; }
void Enemy::tick(float delta) { movement(delta); if(canFire()) fire(); if(getCollider()->collides(SphereCollider(Game::getGame().getPlayer().getPosition(), 1))) { // TODO: what side we were hit on Connection::getInstance().write("EVN#1;0;"); destroy(); } }
void Level00::LoadLights(LegacySceneObject** sceneObjects, mat4f** transforms, SphereColliderComponent** colliders, vec3f* positions, int size) { // Allocate size SceneObjects *sceneObjects = reinterpret_cast<LegacySceneObject*>(mSceneAllocator.Allocate(sizeof(LegacySceneObject) * size, alignof(LegacySceneObject), 0)); *transforms = reinterpret_cast<mat4f*>(mSceneAllocator.Allocate(sizeof(mat4f) * size, alignof(mat4f), 0)); *colliders = reinterpret_cast<SphereColliderComponent*>(mSceneAllocator.Allocate(sizeof(SphereColliderComponent) * size, alignof(SphereColliderComponent), 0)); for (int i = 0; i < size; i++) { (*transforms)[i] = mat4f::translate(positions[i]).transpose(); (*colliders)[i].mCollider = SphereCollider({ positions[i], 1.0f }); (*sceneObjects)[i].mWorldMatrix = transforms[i]; (*sceneObjects)[i].mSphereCollider = colliders[i]; } }
Collision Player::checkForSurroundingBlocks(const glm::vec3& newPosition) { glm::vec3 noY = glm::vec3(newPosition.x, m_currentPosition.y, newPosition.z); glm::vec3 upOne = glm::vec3(newPosition.x, m_currentPosition.y + 1.0f, newPosition.z); if (m_collisionMode == CollisionMode::AABB) { AABBCollider me = AABBCollider::centeredOnPoint(newPosition, 1.2f); AABBCollider me2 = AABBCollider::centeredOnPoint(noY, 1.2f); AABBCollider me3 = AABBCollider::centeredOnPoint(upOne, 1.2f); if (m_chunkPositions.size() > 0) { for (auto& it : m_chunkPositions) { AABBCollider other = AABBCollider::centeredOnPoint(it, 1.2f); if (AABBCollider::checkCollision(me, other)) { //ok you collided... is there a block above you? bool blockCrawl = false; for (auto& it2 : m_chunkPositions) { if (it2.x == it.x && it2.z == it.z && it2.y != it.y) { blockCrawl = true; break;// once is enough } } if (AABBCollider::checkCollision(me2, other)) { if (AABBCollider::checkCollision(me3, other)) return Collision::Colliding; else if(!blockCrawl) return Collision::NoCollisionUpOne; else return Collision::Colliding; } else return Collision::CollidingNotY; } } } } else { SphereCollider meAll = SphereCollider(newPosition, 1.0f); SphereCollider meNoY = SphereCollider(noY, 1.0f); SphereCollider meUpOne = SphereCollider(upOne, 1.0f); if (m_chunkPositions.size() > 0) { for (auto& it : m_chunkPositions) { SphereCollider other = SphereCollider(it, 1.0f); if (SphereCollider::checkCollision(meAll, other)) { //ok you collided... is there a block above you? bool blockCrawl = false; for (auto& it2 : m_chunkPositions) { if (it2.x == it.x && it2.z == it.z && it2.y != it.y) { blockCrawl = true; break;// once is enough } } if (SphereCollider::checkCollision(meNoY, other)) { if (SphereCollider::checkCollision(meUpOne, other)) return Collision::Colliding; else if (!blockCrawl) return Collision::NoCollisionUpOne; else return Collision::Colliding; } else return Collision::CollidingNotY; } } } } return Collision::NoCollision; }