zoukankan      html  css  js  c++  java
  • Sun公司开源游戏服务器Project Darkstar Server——(Sun game server , 简称 sgs)学习笔记(六):应用程序监听器

    The AppListener应用程序监听器

    上面我们已经有了一个世界的管理对象,它由一个房间管理对象,一个剑的管理对象和一对玩家的管理对象。然而我们第一次开始这个游戏的时候,世界的管理对象并不是像这样的。实际上它和下面一样:这展示了什么,这是一个空的。怎样在玩家第一登陆的时候将管理对象存放到对象仓库中呢? 答案是通过一个特定的管理对象调用AppListener(应用程序监听器) ,在这个AppListener(应用程序监听器)中定义了两种指定的操作,它实现了一个应用程序监听接口。这个接口定义了两个方法:initialize、loggedIn。它已经被指定为这个应用一个应用程序监听器。这两个属性按下面的方式结合在一起:

    l         通过PDS 系统本身,PDS 在对象仓库将应用程序监听器本地化为一个应用程序的对象。

    l         如果应用从来没有被启动过,那么这个对象在对象仓库中就是一个空的值(如图3 所示),PDS查找这个应用程序监听器的时候就会失败。在这种情况下,它自己会创建一个管理对象的应用程序监听器,然后移动一个任务,这个任务称为初始化。

    l         如果,相反,这个应用至少被启动了一次,这个对象仓库已经包含了这个应用程序监听器的管理对象。在这种情况下,执行程序只是其上次推出的地方即系统退出时,监听新的连接并且执行在此前它已经执行过的任何周期性的任务。在这种情况下我们简单的示例应用,这个启动的方法将会发生阻塞,用伪码表示如下:

    initialize {

    CREATE ROOM MANAGED OBJECT

    CREATE SWORD MANAGED OBJECT

    ADD REF TO SWORD MANAGED OBJECT TO ROOM'S INVENTORY

    SAVE A MANAGED OBJECT REF TO ROOM FOR LATER

    }

    通常,在第一次启时,创建世界中初始化的管理对象是应用程序监听器的责任。


    现在我们有些东西已经开始像我们在我们游戏中所看到的那样了。然而,我们仍然没有玩家对象管理对象。当玩家进入时我们创建一个玩家管理对象,这个和应用程序监听器管理对象的创建方式是一样的。当我们看到玩家第一次登陆到服务器的时候,我们为用户创建一个新的玩家管理对象。之后,用户每次登陆,我们只要重新连接他或者她已经存在的角色管理对象就可以了。然而,系统是按需要创建一个玩家管理对象的,并在其登陆期间(在线时)记录用户的信息。所有我们应该怎样找出用户是何时登陆的呢?

    答案就是第二次调用我们的应用程序监听器:LoggerIn。每次一个用户到PDS 系统的日志,一个任务开始时就调用在应用程序监听器中登陆的方法。当登陆的返回信息被我们的应用程序监听器调用时,它执行下面的代码,用伪代码展示如下。

    loggedIn {

    managedObject_name = “player_”+ SESSION.PLAYER_NAME;

    IF MANAGED OBJECT EXISTS(managedObject_name)

    {

    FIND MANAGED OBJECT(managedObject_name);

    } ELSE

    {

    CREATE NAMED PLAYER MANAGED OBJECT(managedObject_name);

    }

    SET currentRoom on PLAYER MANAGED OBJECT

    TO SAVED MANAGED OBJECT REF TO ROOM

    GET ROOM MANAGED OBJECT

    ADD PLAYER REF TO ROOM MANAGED OBJECT'S PLAYERS LIST

    REGISTER PLAYER MANAGED OBJECT AS SessionListener(SESSION);

    }

    ClientSessionListener 是另外一个事件接口。它定义了一个方法用于调用任务响应客户端的请求事件。例如发送一个数据到服务器用于处理客户端退出的事件。


     

    图片5 展示了我们的对象管理世界开始变得和我们想的一样了。

    当第二个用户登陆时,我们将回到我们原始的世界。图片6 展示了我们世界在重启游戏服务器后我们原始的玩家:

     

     

    到此,逻辑部分已经用伪码展示了。这个应用事实上的源码的实现在附录A 中的SwordWorld的应用中已经给出。实际的应用的代码有点复杂,因为它也实现了一个显示窗口,显示给你玩家管理对象是怎样处理客户端发送的数据的。

  • 相关阅读:
    ue父子组件的数据传递示例
    vue.js 组件之间传递数据
    Vue2.0子同级组件之间数据交互
    assets 和static的区别
    Vue中src属性绑定的问题
    css3设置背景图片的大小
    如何在HTML中插入空格
    css背景图片的设置
    vue动态组件 互相之间传输数据 和指令的定义
    webservice的优缺点
  • 原文地址:https://www.cnblogs.com/daidu/p/1611502.html
Copyright © 2011-2022 走看看