void soso::applyLinearForce(entityx::EntityManager &entities)
{
  ComponentHandle<LinearForce>  force;
  ComponentHandle<VerletBody>    body;
  for (auto __unused e : entities.entities_with_components(force, body)) {
    body->nudge(force->force);
  }
}
void soso::enforceBoundaries(entityx::EntityManager &entities)
{
  entityx::ComponentHandle<VerletBody> vc;
  entityx::ComponentHandle<Bounded> bc;
  for (auto e : entities.entities_with_components(vc, bc)) {
    if (! bc->contains(vc->position)) {
      e.destroy();
    }
  }
}
Camera::Handle Camera::getCamera(entityx::EntityManager &entities)
{
    Camera::Handle cameraHandle;
    auto count = 0;
    for (auto entity : entities.entities_with_components(cameraHandle))
    {
        (void)entity;
        assert(count++ == 0 && "there should only be one camera!");
    }
    return cameraHandle;
}
예제 #4
0
    void UIRenderingSystem::update(entityx::EntityManager & entities, entityx::EventManager & events, entityx::TimeDelta dt)
    {
        prepareRendering();

        // TODO: sort text components based on font - bind texture atlas before text rendering
        entityx::ComponentHandle<UITextComponent> text_component;

        for(auto entity : entities.entities_with_components(text_component))
        {
            renderText(text_component);
        }
    }
std::string serializePositions(entityx::EntityManager &entities)
{
  ComponentHandle<Transform>      xf;
  ComponentHandle<InstanceShape>  instance;
  std::stringstream ss;

  for (auto __unused e : entities.entities_with_components(xf, instance))
  {
    ss << xf->position().x << "," << xf->position().y << "," << xf->position().z << "," << instance->_openness << std::endl;
  }
  
  return ss.str();
}
예제 #6
0
파일: ease.hpp 프로젝트: eco/vibrant
  void update(entityx::EntityManager& es, entityx::EventManager& events,
              entityx::TimeDelta dt) override
  {
    Easings<TargetComponent>::Handle easing;
    typename TargetComponent::Handle target;

    for (entityx::Entity entity : es.entities_with_components(easing, target))
    {
      // TODO: add events
      bool alive = easing->apply(target, dt);
      if (!alive) entity.remove<Easings<TargetComponent>>();
    }
  }
void soso::applyWanderingForce(entityx::EntityManager &entities)
{
  ComponentHandle<WanderingForce> force;
  ComponentHandle<VerletBody>      body;

  for (auto __unused e : entities.entities_with_components(force, body)) {
    auto heading = safeHeading(body->velocity());
    auto half_fov = force->fov_radians / 2;
    auto wander = ci::randFloat(- half_fov, half_fov);
    heading = glm::rotate(heading, wander, ci::vec3(0, 0, 1));

    auto f = heading * force->impulse;
    body->nudge(f);
  }
}
예제 #8
0
void AnimationSystem::update(entityx::EntityManager &es, entityx::EventManager &events, entityx::TimeDelta dt)
{
    GraphicsComponent::Handle ghandle;
    AnimationComponent::Handle ahandle;

    for (auto entity : es.entities_with_components(ahandle, ghandle))
    {
        ahandle->animator.update(sf::seconds(dt));
        ahandle->animator.animate(ghandle->sprite);

        if (ahandle->firstAnimationProcessLaunch)
        {
            ahandle->firstAnimationProcessLaunch = false;
            sf::IntRect textureRect = ghandle->sprite.getTextureRect();
            ghandle->sprite.setOrigin(textureRect.left + textureRect.width / 2, textureRect.top - textureRect.height / 2);
        }
    }
}
예제 #9
0
파일: layout.cpp 프로젝트: eco/vibrant
void LayoutSystem::update(entityx::EntityManager& es, entityx::EventManager& events,
                          entityx::TimeDelta dt)
{
  Layout::Handle layout;
  Body::Handle body;

  for (entityx::Entity entity : es.entities_with_components(layout, body))
  {
    assert(!layout->x.is_nil());
    assert(!layout->width.is_nil());
    assert(!layout->y.is_nil());
    assert(!layout->height.is_nil());

    body->position.x = layout->x.value();
    body->position.y = layout->y.value();
    body->size.x = layout->width.value();
    body->size.y = layout->height.value();
  }
}
예제 #10
0
	void update(entityx::EntityManager &es, entityx::EventManager &events, double dt)
	{
		entityx::ComponentHandle<Moveable> moveable;
		entityx::ComponentHandle<Position> position;
		entityx::ComponentHandle<Player> player;

		for(entityx::Entity entity : es.entities_with_components(player))
		{
			float x = 0.0f;
			float y = 0.0f;

			const Uint8 *state = SDL_GetKeyboardState(NULL);
			if(state[SDL_SCANCODE_W])
			{
				y-=1.0f;
			}
			if(state[SDL_SCANCODE_A])
			{
				x-=1.0f;
			}
			if(state[SDL_SCANCODE_S])
			{
				y+=1.0f;
			}
			if(state[SDL_SCANCODE_D])
			{
				x+=1.0f;
			}
			if(state[SDL_SCANCODE_SPACE])
			{
				events.emit<PlayerInstructionLight>(entity);
			}
			if(x != 0.0f || y != 0.0f)
			{
				glm::vec2 direction(x,y);
				direction = glm::normalize(direction);// *(float) dt;
				events.emit<PlayerInstructionEvent>(direction,entity);
			}
			
		}
	}
예제 #11
0
파일: ease.hpp 프로젝트: eco/vibrant
  void update(entityx::EntityManager& es, entityx::EventManager& events,
              entityx::TimeDelta dt) override
  {
    FastEase<Time, Value, Comp>::Handle ease;
    typename Comp::Handle component;

    for (entityx::Entity entity : es.entities_with_components(ease, component))
    {
      ease->current += dt;
      if (ease->current < ease->total_time)
      {
        ease->value_function(component) =
            ease->easing_function(ease->current, ease->beginning, ease->change, ease->total_time);
      }
      else
      {
        ease->value_function(component) = ease->beginning + ease->change;
        entity.remove<FastEase<Time, Value, Comp>>();
      }
    }
  }
예제 #12
0
void RenderableOrbit::update(entityx::EntityManager &entities)
{
    float  *pathGL;
    using namespace entityx;
    int pathSteps = 0;
    OrbitPath::Handle orbit;
    
    auto count = 0;
    for (Entity entity : entities.entities_with_components(orbit))
    {
        auto &path = orbit->path;
        if (path.empty())
        {
            std::cout << "empty orbit path\n";
            continue;
        }
        glBindVertexArray(orbit->vao);
        vao = orbit->vao;
        glBindBuffer(GL_ARRAY_BUFFER, orbit->vbo);
        setAttribute("position");
        check_gl_error();

        glBufferData(GL_ARRAY_BUFFER, sizeof(float)*path.size(), nullptr, GL_STREAM_DRAW);
        check_gl_error();
       
        pathGL = (float*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
        check_gl_error();
        
        memcpy(pathGL, path.data(), sizeof(float)*path.size());
        transform = orbit->transform;
        
        drawCount = (int)(path.size())/3;
        
        check_gl_error();
        glUnmapBuffer(GL_ARRAY_BUFFER);
        check_gl_error();
        count++;
    }
}
예제 #13
0
void PlayerSystem::update(entityx::EntityManager& entities, entityx::EventManager& events, double dt)
{
    if (!m_world->isServer()) {
        return;
    }

    PositionComponent::Handle positionComponent;
    PlayerComponent::Handle playerComponent;

    for (auto entity : entities.entities_with_components(positionComponent, playerComponent)) {
        calculateLoadedViewport(entity);

        //qCDebug(ORE_SERVER_ENTITY_LOGIC) << "pos: " << positionComponent->position();
        //qCDebug(ORE_IMPORTANT()) << "PROCESS PLAYER SYSTEM";

        Q_ASSERT(positionComponent->position().x >= 0.0);
        Q_ASSERT(positionComponent->position().y >= 0.0);

        if (positionComponent->positionDirty()) {
            m_world->m_server->sendPlayerMove(entity);

            positionComponent->setPositionDirty(false);

            const glm::vec2& currentChunkPosition = glm::vec2((positionComponent->position().x / BLOCK_SIZE), (positionComponent->position().y / BLOCK_SIZE));

            // conversion because glm::distance only allows float comparisons. and i don't want to
            // change player->lastLoadedChunk because that doesn't make sense as a float, and
            // would cause more issues
            const glm::vec2& lastChunk = glm::vec2(playerComponent->lastLoadedChunk);
            if (glm::distance(currentChunkPosition, lastChunk) > 20.0) {
                //qCDebug(ORE_IMPORTANT) << " server sending large world chunk..: ";
                m_world->m_server->sendLargeWorldChunkForPlayer(entity);
            }
        }
    }
}
예제 #14
0
  void BehaviorSystem::update(entityx::EntityManager &es, entityx::EventManager &events, entityx::TimeDelta dt)
  {

    entityx::ComponentHandle<c::Character> anAlive;
    entityx::ComponentHandle<c::MapObject> anMapObject;
    entityx::ComponentHandle<c::Transformable> anTransform;

    if (mTurnOrder.empty())
    {
      for (entityx::Entity anEntity : es.entities_with_components(anAlive, anMapObject, anTransform)) {
        if (!anMapObject->destroyed)
          mTurnOrder.push(anEntity);
      }

    }
    else
    {
      bool anAction = false;
      entityx::Entity anEntity = mTurnOrder.front();
      anAlive = anEntity.component<c::Character>();
      anMapObject = anEntity.component<c::MapObject>();

      anTransform = anEntity.component<c::Transformable>();
      if (!anMapObject->destroyed)
      {
        if (anMapObject->health <= 0)
        {
          anMapObject->destroyed = true;

          anTransform->setRotation(90);

        }
        else
        {
          std::string anEntityName = anEntity.component<c::MapObject>()->name;
          sf::Vector2f anTargetPos;
          if (anAlive->behaviorFlags & BEHAVIOR_CONTROLLED)
          {
            anAction = mPlayerAction;
            if (!anAction)
            {
              while (!mKeyboardEventQueue.empty() && !mTurnOrder.empty())
              {

                if (mKeyboardEventQueue.front().theKeyCode == sf::Keyboard::Left)
                {
                  anTargetPos.x = -1.0f;
                  anTargetPos.y = 0.0f;
                  anAction = true;
                }
                else if (mKeyboardEventQueue.front().theKeyCode == sf::Keyboard::Right)
                {
                  anTargetPos.x = 1.0f;
                  anTargetPos.y = 0.0f;
                  anAction = true;
                }
                else if (mKeyboardEventQueue.front().theKeyCode == sf::Keyboard::Up)
                {
                  anTargetPos.x = 0.0f;
                  anTargetPos.y = -1.0f;
                  anAction = true;
                }
                else if (mKeyboardEventQueue.front().theKeyCode == sf::Keyboard::Down)
                {
                  anTargetPos.x = 0.0f;
                  anTargetPos.y = 1.0f;
                  anAction = true;
                }
                else if (mKeyboardEventQueue.front().theKeyCode == sf::Keyboard::A)
                {
                  if (anAlive->behaviorFlags & BEHAVIOR_AGRESSIVE)
                  {
                    mApp.mConsole.print(anEntityName + "is lowering it's gaurd.");
                    anAlive->behaviorFlags &= ~BEHAVIOR_AGRESSIVE;
                  }
                  else
                  {
                    mApp.mConsole.print(anEntityName + "is acting aggressive.");
                    anAlive->behaviorFlags |= BEHAVIOR_AGRESSIVE;
                  }
                  anAction = true;
                }
                mKeyboardEventQueue.pop();
              }
            }
            else
            {
              mPlayerAction = false;
            }
          }
          else if (anAlive->behaviorFlags & BEHAVIOR_WANDER)
          {
            GExL::Uint32 anDirection = GExL::random(0, 8);
            if (anDirection == 1)
            {
              anTargetPos.x = 0.0f;
              anTargetPos.y = -1.0f;
              anAction = true;
            }
            if (anDirection == 2)
            {
              anTargetPos.x = 1.0f;
              anTargetPos.y = 0.0f;
              anAction = true;
            }
            if (anDirection == 3)
            {
              anTargetPos.x = 0.0f;
              anTargetPos.y = 1.0f;
              anAction = true;
            }
            if (anDirection == 4)
            {
              anTargetPos.x = -1.0f;
              anTargetPos.y = 0.0f;
              anAction = true;
            }
          }
          if (anAction)
          {
            anTargetPos.x += anTransform->getPosition().x / Tilemap::TileSize;
            anTargetPos.y += anTransform->getPosition().y / Tilemap::TileSize;
            if (anAlive->behaviorFlags & BEHAVIOR_AGRESSIVE)
            {
              //mApp.mWorld.events.emit<DamageEvent>(anEntity, anTargetPos, static_cast<GExL::Uint32>(DAMAGE_MELEE), 0.0f);
            }
            mApp.mWorld.events.emit<MovementEvent>(anEntity, anTargetPos, MOVEMENT_WALK_BI);
            mTurnOrder.pop();

          }
        }
      }
      else
      {
        mTurnOrder.pop();
      }
    }
  }