Как настроить систему уведомлений в игре - PullRequest
0 голосов
/ 25 июня 2011

Я работаю над трехмерной обучающей игрой, которая в основном использует C ++ и Javascript. Я пытаюсь создать систему уведомлений, когда игрок получает информацию, отправленную в его записную книжку.

У меня настроена система, но супервайзер считает, что ее можно улучшить. Вот где мне нужна помощь!

Самый простой путь:

Игрок будет делать что-то, что вызывает информацию для отправки в блокнот. В том же методе, где это произошло, я включил уведомление. Уведомление тогда появилось бы на экране игрока, мигая двумя делениями изображения (делая мигающий эффект). Когда щелкает любой из этих элементов, он показывает игроку записную книжку. Каждый раз, когда проигрыватель просматривает или покидает ноутбук, уведомление отключается.

Теперь вот код, который я использовал:

В основном GameState

int GameModeState::notify(int query)
{
    static int notified;
    if(query == 1)
    {
        notified = 1;
        return notified;
    }
    if(query == 2)
    {
        notified = 0;
        return notified;
    }
    else
    {
        return notified;
    }
}

В функции обновления GameState

// checks if the unviewed information notification needs to be on or off
if(notify(0) == 1) // supposed to be on
{
    mScreen->executeJavascript("notebookNotification(1);"); // turns it on
} else {
    int nothing = notify(2); // clears out notify to 0
    mScreen->executeJavascript("notebookNotification(0);"); // turns it off
}

В моем JS

var intervalID; // Needed to turn off setInterval()
//Function takes in 0 to turn off notification, anything else turns it on
function notebookNotification(setting)
{
   if(setting == 0)
   {
      if(intervalID) {
        // clears the blinking darkContainer
        window.clearInterval(intervalID);
        intervalID = null;
    }
    // hides both of the images
    $("#lightNotificationContainer").hide();
    $("#darkNotificationContainer").hide();
}
else
{
    $("#lightNotificationContainer").show();
    if(!intervalID) {
        // "animates" the blinking of the notification; the darkContainer toggles on and off every second, and covers the lightContainer
        intervalID = window.setInterval('$("#darkNotificationContainer").toggle()', 1000);
    }
}
}

Я бы отключил уведомление, используя GameModeState::notify(2)

Теперь, какую систему лучше использовать, чем эту?

1 Ответ

0 голосов
/ 25 июня 2011

Улучшения алгоритма

  • Не используйте статический флаг. Создайте систему идентификаторов, чтобы вы могли уникальным образом настроить таргетинг уведомления.
    • В C ++ вы можете отслеживать переменную, которая автоматически увеличивается каждый раз, когда вы делаете новое уведомление. Идентификатор может быть #notification_#, где # - это нужный вам идентификатор. Затем ваша функция уведомления отправит идентификатор, который она хочет остановить / запустить, а также параметр для запуска или остановки.
    • В JavaScript вы затем вставляете идентификатор из создания интервала в тег. Я бы рекомендовал использовать .data () . Таким образом, вы можете отключить его.

JS Улучшения (не намного лучше, правда)

  • В большинстве случаев используйте === / !== вместо == / !=. Также избегайте правдивых вещей, если вы можете быть более конкретным.
  • Объединяет уведомление о скрытии в один запрос.

Код:

var intervalID; // Needed to turn off setInterval()
//function takes in 0 to turn off notification, anything else turns it on

function notebookNotification(setting) {
    if (setting === 0) {
        if (intervalID !== null) {
            // clears the blinking darkContainer
            window.clearInterval(intervalID);
            intervalID = null;
        }
        // hides both of the images
        $("#lightNotificationContainer,#darkNotificationContainer").hide();
    }
    else {
        $("#lightNotificationContainer").show();
        if (intervalID === null) {
            // "animates" the blinking of the notification; the darkContainer toggles on and off every second, and covers the lightContainer
            intervalID = window.setInterval('$("#darkNotificationContainer").toggle()', 1000);
        }
    }
}
...