Skip to content

Commit

Permalink
prevent controller input overriding keyboard input
Browse files Browse the repository at this point in the history
properly clip track side sprites
  • Loading branch information
fallahn committed Jan 13, 2024
1 parent be0f384 commit a8cb69e
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 25 deletions.
73 changes: 50 additions & 23 deletions samples/scratchpad/src/endless/EndlessDrivingState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ EndlessDrivingState::EndlessDrivingState(cro::StateStack& stack, cro::State::Con
ImGui::ProgressBar(m_inputFlags.accelerateMultiplier);
ImGui::ProgressBar(m_inputFlags.steerMultiplier);

ImGui::Text("Key Count %d", m_inputFlags.keyCount);

ImGui::Text("Max Y %3.3f", debug.maxY);
ImGui::Text("Player Y %3.3f", m_player.position.y);
ImGui::Text("Player Z %3.3f", m_player.position.z);
Expand Down Expand Up @@ -151,22 +153,29 @@ bool EndlessDrivingState::handleEvent(const cro::Event& evt)
break;
}

//TODO compare to keybind
if (evt.key.keysym.sym == SDLK_w)
{
m_inputFlags.flags |= InputFlags::Up;
}
if (evt.key.keysym.sym == SDLK_s)
{
m_inputFlags.flags |= InputFlags::Down;
}
if (evt.key.keysym.sym == SDLK_a)
if (!evt.key.repeat)
{
m_inputFlags.flags |= InputFlags::Left;
}
if (evt.key.keysym.sym == SDLK_d)
{
m_inputFlags.flags |= InputFlags::Right;
//TODO compare to keybind
if (evt.key.keysym.sym == SDLK_w)
{
m_inputFlags.flags |= InputFlags::Up;
m_inputFlags.keyCount++;
}
if (evt.key.keysym.sym == SDLK_s)
{
m_inputFlags.flags |= InputFlags::Down;
m_inputFlags.keyCount++;
}
if (evt.key.keysym.sym == SDLK_a)
{
m_inputFlags.flags |= InputFlags::Left;
m_inputFlags.keyCount++;
}
if (evt.key.keysym.sym == SDLK_d)
{
m_inputFlags.flags |= InputFlags::Right;
m_inputFlags.keyCount++;
}
}
}
else if (evt.type == SDL_KEYUP)
Expand All @@ -175,18 +184,22 @@ bool EndlessDrivingState::handleEvent(const cro::Event& evt)
if (evt.key.keysym.sym == SDLK_w)
{
m_inputFlags.flags &= ~InputFlags::Up;
m_inputFlags.keyCount--;
}
if (evt.key.keysym.sym == SDLK_s)
{
m_inputFlags.flags &= ~InputFlags::Down;
m_inputFlags.keyCount--;
}
if (evt.key.keysym.sym == SDLK_a)
{
m_inputFlags.flags &= ~InputFlags::Left;
m_inputFlags.keyCount--;
}
if (evt.key.keysym.sym == SDLK_d)
{
m_inputFlags.flags &= ~InputFlags::Right;
m_inputFlags.keyCount--;
}
}

Expand Down Expand Up @@ -445,6 +458,12 @@ void EndlessDrivingState::updateControllerInput()
m_inputFlags.accelerateMultiplier = 1.f;
m_inputFlags.brakeMultiplier = 1.f;

if (m_inputFlags.keyCount)
{
//some keys are pressed, don't use controller
return;
}


auto axisPos = cro::GameController::getAxisPosition(0, cro::GameController::TriggerRight);
if (axisPos > cro::GameController::TriggerDeadZone)
Expand Down Expand Up @@ -504,14 +523,14 @@ void EndlessDrivingState::updatePlayer(float dt)
{
const auto d = dxSteer * m_inputFlags.steerMultiplier;
m_player.position.x -= d;
m_player.model.rotationY = std::min(Player::Model::MaxY, m_player.model.rotationY + d);
m_player.model.rotationY = std::min(Player::Model::MaxY, m_player.model.rotationY + (dx * m_inputFlags.steerMultiplier));
}

if (m_inputFlags.flags & InputFlags::Right)
{
const auto d = dxSteer * m_inputFlags.steerMultiplier;
m_player.position.x += d;
m_player.model.rotationY = std::max(-Player::Model::MaxY, m_player.model.rotationY - d);
m_player.model.rotationY = std::max(-Player::Model::MaxY, m_player.model.rotationY - (dx * m_inputFlags.steerMultiplier));
}
}

Expand Down Expand Up @@ -639,11 +658,11 @@ void EndlessDrivingState::updateRoad(float dt)
if ((prev->position.z < m_trackCamera.getPosition().z)
|| curr.projection.position.y < maxY)
{
curr.clipSprites = (curr.projection.position.y < maxY);
curr.clipHeight = (curr.projection.position.y < maxY) ? maxY : 0.f;
continue;
}
maxY = curr.projection.position.y;
curr.clipSprites = false;
curr.clipHeight = 0.f;
debug.maxY = maxY;

//update vertex array
Expand Down Expand Up @@ -685,13 +704,11 @@ void EndlessDrivingState::updateRoad(float dt)
const auto idx = *i;
const auto& seg = m_road[idx];

const float clipHeight = seg.clipSprites ? maxY : 0.f;

for (const auto& sprite : seg.sprites)
{
glm::vec2 pos = seg.projection.position;
pos.x += seg.projection.scale * sprite.position * RoadWidth * halfWidth;
addRoadSprite(sprite, pos, seg.projection.scale, clipHeight, seg.fogAmount, verts);
addRoadSprite(sprite, pos, seg.projection.scale, seg.clipHeight, seg.fogAmount, verts);
}
}
m_trackSpriteEntity.getComponent<cro::Drawable2D>().getVertexData().swap(verts);
Expand Down Expand Up @@ -736,7 +753,17 @@ void EndlessDrivingState::addRoadSprite(const TrackSprite& sprite, glm::vec2 pos

if (clip)
{
c = cro::Colour::Magenta;
//c = cro::Colour::Magenta;

const auto diff = clip - pos.y;
const auto uvOffset = diff / size.y;
const auto uvDiff = uv.height * uvOffset;

pos.y += diff;
size.y -= diff;

uv.bottom += uvDiff;
uv.height -= uvDiff;
}

dst.emplace_back(glm::vec2(pos.x, pos.y + size.y), glm::vec2(uv.left, uv.bottom + uv.height), c);
Expand Down
2 changes: 2 additions & 0 deletions samples/scratchpad/src/endless/EndlessDrivingState.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ class EndlessDrivingState final : public cro::State, public cro::GuiClient
float steerMultiplier = 1.f;
float accelerateMultiplier = 1.f;
float brakeMultiplier = 1.f;

std::int32_t keyCount = 0; //tracks how many keys are pressed and only allows controller to override when 0
}m_inputFlags;


Expand Down
2 changes: 1 addition & 1 deletion samples/scratchpad/src/endless/Track.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ static inline constexpr float CurveMax = 0.004f;
static inline constexpr float HillMin = -30.f;
static inline constexpr float HillMax = 30.f;

static inline constexpr std::int32_t DrawDistance = 300; //number of segs
static inline constexpr std::int32_t DrawDistance = 500; //number of segs

class Track final
{
Expand Down
2 changes: 1 addition & 1 deletion samples/scratchpad/src/endless/TrackSegment.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ struct TrackSegment final
float fogAmount = 0.f;

std::vector<TrackSprite> sprites;
bool clipSprites = false;
float clipHeight = 0.f;

//contains the last known screen projection
struct Projection final
Expand Down

0 comments on commit a8cb69e

Please sign in to comment.