From 15010a3c6fbddc5c663c73f5028378f448aec4d9 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 6 Feb 2010 21:29:45 +0000 Subject: [PATCH] Basic setting of points --- src/Game.cpp | 39 ++++++++++++++++++++++--- src/Points.cpp | 78 +++++++++++++++++++++++++++++++++----------------- 2 files changed, 87 insertions(+), 30 deletions(-) diff --git a/src/Game.cpp b/src/Game.cpp index fdc20a4..b00a5fd 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -59,7 +59,10 @@ private: Vector cameraPosition(float aRadius) const; void switchToBirdCamera(); void stoppedAtStation(); - + + enum TrackStateReq { NEXT, PREV }; + void alterTrackState(TrackStateReq req); + IMapPtr map; ITrainPtr train; ILightPtr sun; @@ -276,6 +279,35 @@ void Game::lookAhead() setStatus(""); } +void Game::alterTrackState(TrackStateReq req) +{ + // Change the state of the nearest points, etc. + TrackIterator it = iterateTrack(map, train->tile(), + train->direction()); + + const int maxAlterLook = 10; + + for (int i = 0; i < maxAlterLook; i++) { + + if (it.status == TRACK_CHOICE) { + switch (req) { + case NEXT: + it.track->nextState(); + break; + case PREV: + it.track->prevState(); + break; + } + + return; + } + + it = it.next(); + } + + warn() << "No nearby track state to change"; +} + void Game::onKeyDown(SDLKey aKey) { switch (aKey) { @@ -304,13 +336,12 @@ void Game::onKeyDown(SDLKey aKey) getGameWindow()->takeScreenShot(); break; case SDLK_LEFT: - // train->controller()->actOn(GO_LEFT); + alterTrackState(PREV); break; case SDLK_RIGHT: - //train->controller()->actOn(GO_RIGHT); + alterTrackState(NEXT); break; case SDLK_UP: - //train->controller()->actOn(GO_STRAIGHT_ON); break; case SDLK_TAB: if (cameraMode == CAMERA_FLOATING) diff --git a/src/Points.cpp b/src/Points.cpp index 5fc9945..a17dbbe 100644 --- a/src/Points.cpp +++ b/src/Points.cpp @@ -54,10 +54,13 @@ private: Point displacedEndpoint() const; Point straightEndpoint() const; + + enum State { TAKEN, NOT_TAKEN }; int myX, myY; track::Direction myAxis; - bool amReflected; + bool reflected; + State state; static const BezierCurve myCurve, myReflectedCurve; }; @@ -76,7 +79,8 @@ const BezierCurve Points::myReflectedCurve = makeBezierCurve Points::Points(track::Direction aDirection, bool reflect) : myX(0), myY(0), - myAxis(aDirection), amReflected(reflect) + myAxis(aDirection), reflected(reflect), + state(NOT_TAKEN) { } @@ -86,7 +90,10 @@ void Points::renderArrow() const glPushMatrix(); glPushAttrib(GL_ENABLE_BIT); - glTranslatef(0.0f, 0.1f, 0.0f); + glTranslatef(0.0f, 0.2f, 0.0f); + + if (state == TAKEN) + glRotatef(45.0f, 0.0f, 1.0f, 0.0f); //glDisable(GL_CULL_FACE); @@ -117,7 +124,7 @@ void Points::render() const else if (myAxis == axis::Y) glRotatef(270.0f, 0.0f, 1.0f, 0.0f); - renderRailMesh(amReflected ? reflectMesh : railMesh); + renderRailMesh(reflected ? reflectMesh : railMesh); glPushMatrix(); glRotatef(90.0f, 0.0f, 1.0f, 0.0f); @@ -133,12 +140,12 @@ void Points::render() const for (float i = 0.2f; i < 1.0f; i += 0.08f) { glPushMatrix(); - Vector v = (amReflected ? myReflectedCurve : myCurve)(i); + Vector v = (reflected ? myReflectedCurve : myCurve)(i); glTranslatef(v.x - 0.4f, 0.0f, v.y); const Vector deriv = - (amReflected ? myReflectedCurve : myCurve).deriv(i); + (reflected ? myReflectedCurve : myCurve).deriv(i); const float angle = radToDeg(atanf(deriv.y / deriv.x)); @@ -198,8 +205,7 @@ void Points::transform(const track::TravelToken& aToken, double aDelta) const assert(aDelta < len); if (myX == aToken.position.x && myY == aToken.position.y - // && aToken.activeChoice == track::CHOOSE_STRAIGHT_ON - ) { + && state == NOT_TAKEN) { if (aToken.direction == myAxis && (myAxis == -axis::X || myAxis == -axis::Y)) @@ -244,9 +250,7 @@ void Points::transform(const track::TravelToken& aToken, double aDelta) const glTranslated(-0.5, 0.0, 0.0); } - else if (aToken.position == displacedEndpoint() - // || aToken.activeChoice != track::CHOOSE_STRAIGHT_ON - ) { + else if (aToken.position == displacedEndpoint() || state == TAKEN) { // Curving onto the straight section float xTrans, yTrans, rotate; @@ -268,23 +272,23 @@ void Points::transform(const track::TravelToken& aToken, double aDelta) const if (myAxis == -axis::X) { xTrans = 1.0f - curveValue.x; - yTrans = amReflected ? curveValue.y : -curveValue.y; - rotate = amReflected ? angle : -angle; + yTrans = reflected ? curveValue.y : -curveValue.y; + rotate = reflected ? angle : -angle; } else if (myAxis == axis::X) { xTrans = curveValue.x; - yTrans = amReflected ? -curveValue.y : curveValue.y; - rotate = amReflected ? angle : -angle; + yTrans = reflected ? -curveValue.y : curveValue.y; + rotate = reflected ? angle : -angle; } else if (myAxis == -axis::Y) { - xTrans = amReflected ? -curveValue.y : curveValue.y; + xTrans = reflected ? -curveValue.y : curveValue.y; yTrans = 1.0f - curveValue.x; - rotate = amReflected ? angle : -angle; + rotate = reflected ? angle : -angle; } else if (myAxis == axis::Y) { - xTrans = amReflected ? curveValue.y : -curveValue.y; + xTrans = reflected ? curveValue.y : -curveValue.y; yTrans = curveValue.x; - rotate = amReflected ? angle : -angle; + rotate = reflected ? angle : -angle; } else assert(false); @@ -325,7 +329,7 @@ bool Points::isValidDirection(const track::Direction& aDirection) const track::Connection Points::nextPosition(const track::TravelToken& aToken) const { - bool branching = false; //aToken.activeChoice != track::CHOOSE_STRAIGHT_ON; + const bool branching = state == TAKEN; if (myAxis == axis::X) { if (aToken.direction == -axis::X) { @@ -335,7 +339,7 @@ track::Connection Points::nextPosition(const track::TravelToken& aToken) const else { // Two possible exits if (branching) { - if (amReflected) + if (reflected) return make_pair(makePoint(myX + 3, myY - 1), axis::X); else return make_pair(makePoint(myX + 3, myY + 1), axis::X); @@ -348,7 +352,7 @@ track::Connection Points::nextPosition(const track::TravelToken& aToken) const if (aToken.direction == -axis::X) { // Two possible exits if (branching) { - if (amReflected) + if (reflected) return make_pair(makePoint(myX - 3, myY + 1), -axis::X); else return make_pair(makePoint(myX - 3, myY - 1), -axis::X); @@ -369,7 +373,7 @@ track::Connection Points::nextPosition(const track::TravelToken& aToken) const else { // Two possible exits if (branching) { - if (amReflected) + if (reflected) return make_pair(makePoint(myX + 1, myY + 3), axis::Y); else return make_pair(makePoint(myX - 1, myY + 3), axis::Y); @@ -382,7 +386,7 @@ track::Connection Points::nextPosition(const track::TravelToken& aToken) const if (aToken.direction == -axis::Y) { // Two possible exits if (branching) { - if (amReflected) + if (reflected) return make_pair(makePoint(myX - 1, myY - 3), -axis::Y); else return make_pair(makePoint(myX + 1, myY - 3), -axis::Y); @@ -402,7 +406,7 @@ track::Connection Points::nextPosition(const track::TravelToken& aToken) const // Get the endpoint that follows the curve Point Points::displacedEndpoint() const { - const int reflect = amReflected ? -1 : 1; + const int reflect = reflected ? -1 : 1; if (myAxis == axis::X) return makePoint(myX + 2, myY + 1*reflect); @@ -453,17 +457,39 @@ xml::element Points::toXml() const : (myAxis == -axis::X ? "-x" : (myAxis == axis::Y ? "y" : (myAxis == -axis::Y ? "-y" : "?")))) - .addAttribute("reflect", amReflected); + .addAttribute("reflect", reflected); } void Points::nextState() { + debug() << "nextState r=" << reflected << " state=" << state; + + switch (state) { + case 0: + state = reflected ? NOT_TAKEN : NOT_TAKEN; + break; + case 1: + state = reflected ? NOT_TAKEN : TAKEN; + break; + } + debug() << "now=" << state; } void Points::prevState() { + debug() << "prevState r=" << reflected << " state=" << state; + + switch (state) { + case 0: + state = reflected ? TAKEN : TAKEN; + break; + case 1: + state = reflected ? TAKEN : NOT_TAKEN; + break; + } + debug() << "now="<