`
suoyihen
  • 浏览: 1359069 次
文章分类
社区版块
存档分类
最新评论

开发网页游戏过程记录2-游戏角色身份认证

 
阅读更多

游戏的用户必然分多种,有不同的权限,也有不同的属性,大致可以分为ANONYMOUS即匿名用户,代表的是进入官网却没有游戏账号的游客,PLATFORM即平台用户,代表的是有游戏账号但是没有进入游戏或没有激活游戏的用户,GAMEUSER即游戏用户,代表的是已经激活游戏并且已有游戏记录的用户。而这些用户类别用什么数据类型来存储比较方便呢?经过一段时间的讨论想到了用一个enum来存放这些不同的用户。然而在认证用户过程中需要分清这些用户的具体角色,这时可以将这个enum定义在一个认证接口中,这个接口负责获得用户的之前登录时间和登录ip,当前游戏中登录时间和ip,当前用户的角色类型(返回之前定义的那个enum)。接着实现这个接口进行用户角色的具体判断(可以通过玩家是否持有账号id来判断),如果账号id为null或者intValue()<=0,则可以返回匿名用户,如果存在账号id则继续判断是否存在玩家的游戏账号,如果不存在则为平台用户,反之则为游戏用户。当然这个实现类需要实现Comparable类,以便进行类之间的比较。那么这个实现类里的一些方法如何实现呢?比如玩家的登录时间和登录ip如何获取呢?这时需要定义一个pojo类来封装用户可能会用到的属性,比如账号名,账号id等等信息。并且可以在这个实现类的构造方法中初始化这些属性值。但是问题又出现了,当用户具有账号id,还有比如游戏区id,比如俱乐部id,这些id难道都用一个get<T>Id()(这里的写法是自己为了方便这样写的,意思是获取各类id)来获得吗?这时就会觉得代码不简洁,这时想到的是在使用一个pojo类来封装这些id属性,而在那个用户基本属性的pojo类中定义的getId()方法返回的是这个封装id的pojo类,这时就可以在那个实现类的构造方法里使用getId().get<T>Id()来获得具体的某一中id了。当然这时在封装各类id的pojo类中的hashCode()方法和equals()方法就需要操作所有的id了。如equals方法如下:

public boolean equals (Object obj) {

if (null == obj) return false;
if (!(obj instanceof 本类)) return false;
else {
本类 mObj = (本类) obj;
if (null != this.get<T>Id() && null != mObj.get<T>Id()) {
if (!this.get<T>Id().equals(mObj.get<T>Id())) {
return false;
}
}
else {
return false;
}
if (null != this.get<T'>Id() && null != mObj.get<T'>Id()) {
if (!this.get<T'>Id().equals(mObj.get<T'>Id())) {
return false;
}
}
else {
return false;
}
return true;
}

}

hashCode()方法如下:

public int hashCode () {
if (Integer.MIN_VALUE == this.hashCode) {
StringBuilder sb = new StringBuilder();
if (null != this.get<T>Id()) {
sb.append(this.get<T>Id().hashCode());
sb.append(":");
}
else {
return super.hashCode();
}
if (null != this.get<T'>Id()) {
sb.append(this.get<T'>Id().hashCode());
sb.append(":");
}
else {
return super.hashCode();
}
this.hashCode = sb.toString().hashCode();
}
return this.hashCode;
}

当然还需要toString()方法和compareTo()方法。其实这些方法都可以使用apache common包提供的相应类来处理。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics