Что может быть лучше для хранения информации, чем использование статических целых?C ++ - PullRequest
1 голос
/ 14 апреля 2011

Я отслеживаю «работу» игрока, устанавливая его работу в число, увеличивая его на единицу, если он меняет работу, и определяя, какой работой он в настоящее время является, является ли число четным или нечетным. (Сейчас только две работы). Тем не менее, я знаю, что есть более эффективные способы сделать это, и скоро мне нужно будет выполнить третью и четвертую работу, поэтому я не могу продолжать использовать чётные / нечетные проверки.

Вот мой код для справки: (Обратите внимание, что я включаю только соответствующий код)

GameModeState.cpp

// If changeJob's parameter number is 1, it increments the job. If number is 2, it only  returns the current job
int GameModeState::changeJob(int number)
{
   // Default job is even (landman)
   static int job = 1;
   if (number == 1)
   {
    job = (job+1);
    return job;
   } 
   else 
   {
    return job;
   }
}

int GameModeState::getJob()
{
    int currentJob = (changeJob(2));
    return currentJob;
}

// If the player opens the "stat sheet", it changes their job
void GameModeState::_statSheet(const String& message, const Awesomium::JSValue& input, Awesomium::JSValue& output)
{
    changeJob(1);
}

GameModeState.h

class GameModeState : public GameState::State
{
public:

    /// Changes the player's job if number is 1, or returns current job if number is 2
    static int changeJob(int number);

    /// Returns the current job number by calling changeJob appropriately
    static int getJob();

private:

    // Opening the player sheet will change the player's job
    void _statSheet(const String& message, const Awesomium::JSValue& input, Awesomium::JSValue& output);
};

ZoneMovementState.cpp (Здесь я проверяю текущую работу)

#include "GameModeState.h"
#include <EnergyGraphics/ZoneParser.h>

    void ZoneMovementState::_changeZone(const String& message, const Awesomium::JSValue& input, Awesomium::JSValue& output)
    {
        // If the number from getJob is even, the player is currently a geologist
        if (GameModeState::getJob()%2 == 0)
        {
            ZoneParser::getSingleton().load("../media/zones/geology_zone.xml", false);
        } 
        else //otherwise they are a landman
        {
            ZoneParser::getSingleton().load("../media/zones/landman_zone.xml", false);
        }
        transitionHandler->go();
    }

Я думаю, что либо массивы, либо перечисления заданий будут лучшим способом справиться с этим, но я не уверен, как внедрить это в мой код. Если вы знаете лучший способ, пожалуйста, включите примеры или хотя бы точку в правильном направлении. Я буду очень признателен за это!

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Не используйте статические переменные для сохранения чего-либо подобного внутри класса. Вместо этого используйте переменную-член.

IMO Самый простой способ сделать что-то подобное и сделать его расширяемым - использовать enum:

enum PlayerJob
    JOB_NONE = 0,
    JOB_GEOLOGIST,
    JOB_LANDMAN,
    ...
    NUM_JOBS // this element is optional but can be useful for range checking.
};

...

PlayerJob job = JOB_NONE;

...

switch(job)
{
    case JOB_NONE:
        break;
    case JOB_GEOLOGIST:
        ...
        break;
    ...
    default:
        error("Unhandled palyer job: %d", job);
        break;
}

Кроме того, я бы подумал о том, чтобы как-то организовать такие "относящиеся к работе" вещи в какой-то массив или список или что-то еще, чтобы было проще называть "специфичные для работы" вещи:

std::map<PlayerJob,std::string> jobzones;
jobzones.push_back(JOB_GEOLOGIST, "geozone.xml");

...

transitToZone(jobzones[job]);
0 голосов
/ 14 апреля 2011

Возможно, вы захотите взглянуть на шаблон состояния .

0 голосов
/ 14 апреля 2011

Перечисления хороши, вы также можете подумать об использовании std::stack или чего-то подобного для GameState, чтобы вы могли нажимать / выталкивать и т. Д.

...