0

我正在开发一款主要使用 C++ 和 Javascript 的基于 3D 学习的游戏。我正在尝试设计一个通知系统,用于通知玩家何时将信息发送到他们的笔记本。

我建立了一个系统,但主管认为它可以做得更好。这就是我需要你们帮助的地方!

非常基本的方式:

玩家会做一些触发信息发送到笔记本的事情。在发生这种情况的相同方法中,我打开了通知。然后,通知将通过闪烁图像的两个 div(产生闪烁效果)显示在播放器的屏幕上。当单击这些 div 中的任何一个时,它会向玩家显示笔记本。每当玩家查看或退出笔记本时,通知都会关闭。

现在这是我使用的代码:

在主游戏状态中

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)

现在,还有什么比这个更好的系统呢?

4

1 回答 1

0

算法改进

  • 不要使用静态标志。创建一个 id 系统,以便您可以唯一地定位通知。
    • 在 C++ 中,您可以跟踪一个在您发出新通知时自动递增的变量。id 可能是您想要的 id#notification_#所在的位置。#然后您的通知函数将发送它想要停止/启动的 id,以及启动或停止它的参数。
    • 然后,在 JavaScript 中,您将创建间隔的 id 嵌入标签中。我建议使用.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);
        }
    }
}
于 2011-06-24T23:23:47.767 回答