天气教程


本教程帮助你为自己的MUD游戏创建一个简单的天气系统。这能让所有户外房间定期或半随机地显示天气相关的信息。例如“乌云慢慢聚拢”、“开始下雨了”,诸如此类。

可以想象,游戏中每个户外房间都有一个属于自己的脚本可以定期触发。但是本例会用一种更有效的方式来实现,也就是借助“时钟预订”模型。原理很简单:不用每个对象独立计时,取而代之让一个全局时钟管理时间,并按各对象预定的时间去调用该对象。这样不但可以把代码集中和组织到一起,而且计算开销更小。

Evennia提供了专门的 TickerHandler 类来使用“时钟预订”模型。我们将把它用到这个天气系统里。

假定你已经知晓如何创建自己的类型类了。你可能还没见过任何一个新手教程。我们将创建一个新的 WeatherRoom 类型类来演示昼夜更替。

    import random
    from evennia import DefaultRoom, TICKER_HANDLER

    ECHOES = ["The sky is clear.", 
              "Clouds gather overhead.",
              "It's starting to drizzle.",
              "A breeze of wind is felt.",
              "The wind is picking up"] # etc  

    class WeatherRoom(DefaultRoom):
        "This room is ticked at regular intervals"        

        def at_object_creation(self):
            "called only when the object is first created"
            TICKER_HANDLER.add(self, 60 * 60, hook_key="at_weather_update")

        def at_weather_update(self, *args, **kwargs):
            "ticked at regular intervals"
            echo = random.choice(ECHOES)
            self.msg_contents(echo)
在 at_object_creation 方法中,只需简单地将自身添加到 TickerHandler 中,并告诉它每小时(60 × 60秒)调用一次 at_weather_update 钩子。测试期内你可能想用更短的时隙来演示。

为了让它工作起来,我们还创建了一个自定义钩子 at_weather_update(*args, **kwargs),TickerHandler 执行时会用到它。注意如果我们不打算提供自己的钩子,只需要让它调用 at_tick,这是 TickerHandler 默认调用的钩子。

此后该房间将会在天气变化时通知房间内所有人。本例当然有点简化得过头了——天气随机产生并显示出来,毫不关心之前的天气状况。把它扩展得更加逼真将是一项有用的练习。