精华内容
下载资源
问答
  • 最近忙这工作上的项目,整个公司就自己一个搞游戏的,负责整个项目,为了就是入职时候一个承诺会开游戏部。客户端代码因为是个外包半成品,入职一个月终于把第一个...确实忍不了,真想把整个客户端,服务器重写。晚上回

    最近忙这工作上的项目,整个公司就自己一个搞游戏的,负责整个项目,为了就是入职时候一个承诺会开游戏部。客户端代码因为是个外包半成品,入职一个月终于把第一个版本弄出来了,bug都修改差不多,该换的UI,增加的特效都搞了,连工具都写,服务端web资源下载都要搞。第一个版本出来后还是不错的。后面的需求才是坑啊,要添加功能但是服务端呢?难道我连服务端也要搞吗?确实忍不了,真想把整个客户端,服务器重写。晚上回家就用erlang尝试重写服务端,搭一个erlang服务端框架,剩下就是添加功能了。

    选择erlang原因很简单,曾经写过卡牌服务器就是用erlang,也有其它源码做参考,记录下大笑

    数据库:mnesia

    框架:OTP

    TCP层参考的是rabbitmq,所以采用了异步方式

    init({AcceptorCount, Port}) ->
        process_flag(trap_exit, true),
        case gen_tcp:listen(Port, ?TCP_OPTIONS) of  %%启动tcp服务器,监听端口
            {ok, LSock} ->
                lists:foreach(fun (_) ->               %%并且通过 tcp_acceptor_sup启动N个tcp_accetpor
                                    {ok, _APid} = supervisor:start_child(
                                                      coc_tcp_acceptor_sup, [LSock])
                              end,
                              lists:duplicate(AcceptorCount, dummy)), %% 返回一个由AcceptorCount个dummy组成的列表。
                %{ok, {LIPAddress, LPort}} = inet:sockname(LSock),
                {ok, LSock};
            {error, Reason} ->
                {stop, {cannot_listen, Reason}}
        end.


    accept(State = #state{sock=LSock}) ->
        case prim_inet:async_accept(LSock, -1) of               %% 异步等待连接
            {ok, Ref} -> {noreply, State#state{ref=Ref}};
            Error     -> {stop, {cannot_accept, Error}, State}
        end.

    %% 开启客户端服务
    start_client(Sock) ->
        {ok, Child} = supervisor:start_child(coc_tcp_client_sup, []),
       
     ok = gen_tcp:controlling_process(Sock, Child),
        Child ! {go, Sock}.

    流程大概就是:先开启mnesia数据库,ets临时保存在线信息,开启若干个tcp_accetpor等等链接,采用异步方式,因为客户端使用的是字节流方式自己写的一套协议工具,所以服务端也用Bit.

    数据来到服务端先做个解析Decode,再做个MD5验证

    case pp_help:checkmd5(ProtocolId,MD51,MD5Data) of
                      true ->
                              %%MD5验证通过,派发协议
                                routing({ProtocolId,Socket,BodyData,Client});
                       Other->
                                %%MD5验证失败
                                %%先检查是否已经登录,已经登录就退出再lost,暂时先直接退出
                                 
    login_lost(Socket, Client, 0, Other) 
                        end;

    通过routing做协议的分发派送,先处理登陆和注册,Client保存了一登陆之后的信息,包括玩家进程pid,登陆超时次数,使用超时处理可以做玩家长时间没有发生消息自动退出登陆服务端做下线处理

    %%断开连接
    login_lost(Socket, _Client, _Cmd, Reason) ->
        case _Client#client.login == 0 of
            true ->
                gen_tcp:close(Socket),
                exit({unexpected_message, Reason});  
            Other ->
            %% 下线
                mod_player:stop(_Client#client.player),
                gen_tcp:close(Socket),
                exit({unexpected_message, Reason})
        end.
       
    登陆注册就是检查各种合法性,如果是失败重新登陆,已经登陆就先退出再登陆。

    %%登陆检查入口
    login(R, Socket) ->
        % 名字就是key
        KeyUserName = R#player.username,
        % 检查是否已经在线
        case mod_help:get_online_info(KeyUserName) of
          []->
              % 不在线
              {ok, Pid} = mod_player:start(),  %开启玩家进程
              % 上次登录时间
              Time = util:unixtime()+5,
              %%更新在线时间
              case db:set(player,KeyUserName,[{last_login_time,Time},{online_flag,1}]) of
                  {atomic,ok}  ->
                      %登陆成功,加载或更新数据
                      States = login_success(R,Pid,Socket,Time),
                      {true, States};
                  Other ->
                    erlang:display(Other),
                    {false, ?ERROR_6}
              end;
            _R ->
                %% 退出重新登录
                logout(_R#ets_online.pid),
                login(R,Socket)
        end.

     登陆成功后就读取数据库里面的玩家信息,保存到一个mod_player进程里面,以后就靠这个做处理了。ets保存一些在线信息。

    %% 登陆成功,加载或更新数据
    login_success(Player, Pid, Socket, LastLoginTime) ->
        %{Username,Password,Last_login_time,Online_flag,Sex,Golds,Dimoa} = Player,
        %% 玩家信息
        PlayerStatus = #player_status{
            username = Player#player.username,
            online_flag= Player#player.online_flag,      % 在线标志
            pid = Pid,            
            sex= Player#player.sex,                      % 性别
            golds= Player#player.golds,                  % 金币
            dimoa= Player#player.dimoa                   % 钻石
        },
        %% 设置玩家信息
        gen_server:cast(Pid, {'SET_PLAYER', PlayerStatus}),
        %% 在线信息
        ets:insert(?ETS_ONLINE, #ets_online{
            nickname = Player#player.username,
            pid = Pid
          }),
        PlayerStatus.

    到这里就应该搭建好服务端框架了,里面还有很多封装的东西,客户端和服务端的协议都是自动生成太爽。调试也成功了,服务端已经放回数据给客户端,解析成功。接下来是做个多人在线打牌系统。想法是这样:单独一个监听sup,专门做房间的监听,加入到里面的人新开个GamePlayer进程,使用ets保存房间信息,还有玩家Game进程,玩家断开连接的时候重新拉房间信息更新客户端。(说的确实不清楚,但是想法已经有就是)。慢慢来。

    展开全文
  • web框架发展演变过程

    2019-02-14 10:53:48
    比如张三开发的登录模块出问题,游戏就结束了,登录不了,别的都玩不了,直接就炸了。耦合度高。所以有了下一版本,也就是分布式架构 分布式架构项目: 降低冲突,降低耦合度(因为按模块拆分了项目,不是跟...

    同事们突然讨论这个,想起来记录总结一下

    传统架构项目:

    也就是最开始的ssh、ssm  就是一个大项目,团队进行开发。开发人员越多越容易产生弊端,也就是冲突。或者某个模块功能有问题,影响其他的模块。比如张三开发的登录模块出问题,游戏就结束了,登录不了,别的都玩不了,直接就炸了。耦合度高。所以有了下一版本,也就是分布式架构

    分布式架构项目:

    降低冲突,降低耦合度(因为按模块拆分了项目,不是跟传统项目一样一整块),多个war包部署。分别独立运行,优点就是解决传统架构的缺点嘛

    SOA、微服务架构:

    这个就是现在的,没有界面(也就是view  数据展示)  俗称面向接口开发、面向业务逻辑层的开发。所谓服务化,就是给人调用接口获取数据,业务层一样,没有了数据显示页面。服务的概念:讲共同的业务逻辑拆分,拆分成独立的项目部署。

    展开全文
  • CTF的运行时间能超过12小时,因为用于登录Docker注册表的凭据将在此时间之后过期,并且我们目前无法在游戏运行时对其进行续订。 数据库 这是跟踪游戏状态的中央数据库。 它在数据库VM上运行,并公开RESTful API。...
  • UE4的GamePlay框架概述

    2021-01-10 14:44:30
    贯穿一个游戏始终的东西,关关卡是否在进行,是否在等待界面,是否已经结束,都是可以访问到GameInstance的,适合放置一些独立于关卡的信息,以及一些功能,例如,显示UI登录,UI独立于任何关卡,比如刚打开一个...

    GameInstance(游戏实例)

    贯穿一个游戏始终的东西,不关关卡是否在进行,是否在等待界面,是否已经结束了,都是可以访问到GameInstance的,适合放置一些独立于关卡的信息,以及一些功能,例如,显示UI登录,UI独立于任何关卡,比如刚打开一个游戏进入主界面/登录界面,就可以把显示它的逻辑放在GameInstance里。

    GameMode (游戏模式)

    指的是游戏玩法规则,里面通常会写明游戏玩法,游戏进行的规则,胜负条件等等,游戏模式是和关卡绑定的,一个关卡只能有一个游戏模式,但是一整个游戏可以有多少GameMode。比如Moba游戏的LOL有不同的游戏模式,5V5模式拆掉水晶胜利,还有轮换模式比拼杀敌数胜利的模式,都属于不同的GameMode。

    GameState(游戏状态)

    游戏状态,通常用于记录游戏模式规定好规则之后,GameState用来记录因为GameMode所产生的信息和数据,GameMode通过和GameState绑定使用的,一个是抽象的规则,一个是因为规则产生的具体信息和数据

    Pawn(可以被控制对象)

    可以是玩家,也可以是敌人,也可以是NPC,LOL中玩家控制的英雄,敌人野怪,都是Pawn,Pawn不一定人,也不一定是活物,比如在球球大作战中,球是被玩家控制的对象,也是Pawn。框架中Pawn代表了一切具有运动形态的物体,即拥有运动形态的物体应该继承于该类。

    Character(可以被控制的人形对象)

    继承自Pawn的一种特殊Pawn,但设计为类人的,并附带有人的基础属性和特征动作,大多情况下游戏的主角(即玩家)应该继承于该类。

    PlayerState(玩家状态)

    玩家的信息和数据一般就记录在PlayerState里,也就是说玩家如果是Pawn/ Character,那玩家的信息和数据就记录在PlayerState里面,有点类似于之前GameMode和GameState的关系一样,是绑定使用的,GameState和PlayerState就像两个信息收集员,负责收集游戏中主要的信息和数据。

    Controller(控制器)

    Controller拥有一个Pawn类实例,负责控制该Pawn应有的行为。把Pawn比作木偶,Controller就是控制这个木偶的控制器,一个Controller可以持有一个Pawn,一般玩家死亡的时候先会销毁Controller持有的Pawn,然后在创建一个新的Pawn让Controller持有。通常通过Controller作为媒介来操控角色。也可以把一些不要同Pawn同时销毁的信息存放在Controller中。

    PlayController(玩家控制器)

    玩家控制器,属于游戏玩家的控制器,继承自Controller(控制器,本质上代表了人类玩家的意愿。
    官方对PlayController的描述是:您可以在 Pawn 中处理所有输入, 尤其是不太复杂的情况下。但是,如果您的需求非常复杂,比如在一个游戏客户端上的多玩家、或实时地动态修改角色的功能,那么最好 PlayerController中处理输入。在这种情况中,PlayerController决定要干什么,然后将命令(比如"开始蹲伏"、“跳跃”)发布给Pawn。

    AIController(AI控制器)

    AIController继承于Controller,拥有一个Pawn的实例,下AIController继承于Controller,拥有一个Pawn的实例,主要负责控制非玩家控制的有运动形态的物体,比如AI等等。

    HUD(屏幕二维信息显示设置选项)

    框架下HUD是一种二维的屏幕显示信息,如玩家的生命值、分数信息等会在该类中进行绘制显示。
    UE4中HUD、UMG、Slate之间的区别

    展开全文
  • Drogon是作者非常喜欢的美剧《权力的游戏》中的一条龙的名字(汉译作卓耿),和龙有关但并是dragon的误写,为了至于引起不必要的误会这里说明一下。 Drogon是一个跨平台框架,它支持Linux,也支持macOS、FreeBSD,...
  • 除了渠道SDK外,还需要把广告SDK,分享SDK,统计SDK,消息推送SDK等都放到这套统一SDK接入框架中来了。那么,作为我们这套抽象框架,我们也需要考虑以后可能会加入这些其他非渠道的SDK。所以,我们总体的设计思想...

    渠道sdk一般都有初始化,登录,登出,退出,支付,上传角色等接口。除了渠道SDK外,还需要把广告SDK,分享SDK,统计SDK,消息推送SDK等都放到了这套统一SDK接入框架中来了。那么,作为我们这套抽象框架,我们也需要考虑以后可能会加入这些其他非渠道的SDK。所以,我们总体的设计思想是:

    1、游戏各个渠道有一个主渠道SDK,比如UC,当乐,91等SDK。这个各个渠道只能同时有一个。不可能同时为UC也是91SDK

    2、非渠道的功能性SDK,包括广告,分享,统计,推送等。这些东西,我们作为插件集成到这套抽象框架来。

    3、所有SDK的实现可以很方便,而且结构比较统一

    4、所有的渠道SDK也好,还是功能性SDK也好,SDK抽象层都抽象出对应的接口。方便游戏层的调用,也方便具体插件的实现。

    有了前面的总体思路,那么我们来看看具体抽象层实现。首先我们定义一个渠道规范接口:

    public interface ILTSdk {

       
    void login(Activity activity, ILTLoginListenerlistener);//登录接口

       
    void pay(Activity activity, PayParamsdata, ILTPayListener listener);//支付接口接口

       
    void logout(Activity activity, ILTLoginListenerlistener);//登出接口

       
    void exit(Activity activity, ILTExitListenerlistener);//退出接口

       
    void setExtData(Activity activity,Stringdata);//上传角色接口
    }

     

    这里说明一下,初始化接口这里不对外提供,将在抽象层内部实现,不提供初始化的结果。登录,支付,退出接口都是有结果回调的,后面将会通过监听形式返回。关于支付需要传递的参数,可以参考易接,anysdk,棱镜等专做渠道聚合的公司。

    接口已经定义好了,紧接着,上层游戏需要登录和支付的地方,怎么调用呢?对于游戏来说,这个接口需要new一个哪个实现?是UC还是当乐还是91呢?

    所以我们就需要定义一个抽象层管理类,来管理游戏上层和这些渠道SDK和功能性SDK交互。因为渠道有且仅有一个,所以我们可以把渠道类名做成一致,方便我们使用反射创建对象,这个管理类里面就需要实现这些需求。

    1.   判断是否存在第三方渠道,如果存在则创建渠道对象,渠道包;如果不存在则创建抽象层渠道基类对象,母包做测试用;

    2.   通过反射去调用渠道SDK接口方法和生命周期方法,这样就可以实现游戏上层接入渠道SDK登录,支付等接口;

    3.   通过配置文件去读取需要的第三方功能性SDK(插件)的全类名,循环取出所有的插件类名并创建对象,并且实现生命周期方法的调用。

     

                       (抽象层结构图)

    因为有的SDK,需要在Activity的系统事件中做一些处理操作,而Activity是在游戏接入我们这个抽象层时,传递进来的,所以,我们在抽象层定义了一个Activity事件监听器,渠道基类和插件基类都继承这个类即可:

    public interface IActivityListener {
    
         void onCreate(Object[] param);
         void onPause();
         void onResume();
         void onStart();
         void onBackPressed();
         void onNewIntent(Intent newIntent);
         void onStop();
         void onDestroy();
         void onActivityResult(Object[] param);
    }

     

    这样,整个SDK接入的抽象层就差不多了。还有一些细节,我们可以后面边开发,边迭代,边完善。后面我们将用实例来看看,游戏层怎么调用这个抽象层SDK,以及具体的SDK接入怎么来实现这个抽象层。

    展开全文
  • Game Framework 是一个基于 Unity 引擎的游戏框架,主要对游戏开发过程中常用模块进行封装,很大程度地规范开发过程、加快开发速度并保证产品质量。 在最新的 Game Framework 版本中,包含以下 19 个内置模块,...
  • JAVA多服务器通讯框架是基于NIO开发的Socket通讯框架,实现客户端和服务器,服务器与服务器之间的通讯功能,适合应用于大型聊天服务器,大型游戏服务器。 本演示程序实现一个基本的命令行聊天功能,以演示...
  •  博主在以前在游戏公司有幸参与打造统一第三方SDK接入,现在,博主决定在新的要负责新项目的用户登录,分享等模块,为了让以后不再苦逼,决定打造一个自己专属的统一第三方SDK接入框架。 对于整个框架我们希望到达...
  • 现在想实现的功能是 在我鼠标移上的时候展示这个分类里面所有的小分类 现在list拿到我想展示的小分类 但是知道怎么传到前台 然后前台怎么处理放到页面????求大神。。!!!!!!!! 附上 前台jsp 的完整...
  • 最近无聊写个4399弹弹堂的flash... 使用任何浏览器框架, 使用系统api直接创建flash, get获取flash游戏地址并载入游戏, 降低内存  使用线程创建flash, 和主线程分离减少卡顿  屏蔽flash右键菜单, 以及程序静音等
  • 这款飞机大战的游戏是基于QT实现的一款小型的敌我双方飞机攻防的游戏,开发游戏中涉及到网络编程(socket通信),sqlite3,c++以及QT的图形视图框架灯技术。 话多说直接上效果图 登录界面 游戏功能选择界面 ...
  • PHP扫码登录实现

    千次阅读 2019-02-15 18:47:39
    去年独立负责整个公司新游戏的后台功能,时间紧任务重,而每个游戏项目都有测试/正式,因此就有俩后台地址,然后就有俩账号,还有不同的权限级别,,,一个游戏还好,但有N个游戏时候,测试同学受不了了,说这么多...
  • Xposed应该都陌生,一个开源免费的层HOOK框架,可以对APP进行HOOK以达到很多好玩的功能(比如抢红包,游戏WG等),就多做介绍,开门见山把~ 这里为了测试简单,自己写登录窗口,输入正确的账号密码则...
  • 这是我为测试 JavaFX GUI 框架而编写的掷骰子游戏。 我添加中心操作和登录屏幕。 它现在可以保存您的帐户信息以获得更持久的体验。 我正在学习 CSS 以将 Menubuttons 更改为看起来像筹码赌注,而不是灰色框。 J...
  • 作为一款游戏要拉动用户日活必须要有一点的奖励或者是付费,这就要设计到福利系统的,包括每日登录,日卡,月卡等等的。而我们要面对这么多的福利功能的时候,一个设计得当的福利系统框架会减少我们很多的工作量,...
  • 《android 3d游戏开发技术详解与典型案例》主要以android平台下3d游戏的开发为主题,并结合真实的案例向读者详细介绍opengl es的基础知识及3d游戏程序开发的整个流程。 《android 3d游戏开发技术详解与典型案例》...
  • 这个游戏做来耍的就做复杂。login 负责处理账户数据、game 负责基本游戏逻辑。通许协议直接用C++结构体,懒的去弄其他协议。玩家登录:协议定义:JMSG_PROTOCOL_(verify_login_account,jdot_string, ...
  • 分布式游戏开发总结

    2018-04-10 11:16:12
    一、服务器设计问题1、认证问题集群设计存储,日志,计算,网关-层,理论上这些层可以随着业务...在我们框架下如果一个渠道的服务器,需要独立在另一个集群中,我们就要实现充值转发以及最近登录等消息的归并处理...
  • AngularJS是开发基于浏览器的响应式RWD应用程序的一个前端MVC框架,由谷歌最初开发的 开源项目,干净的架构吸引大量粉丝,适合建立CRUD类型的业务应用程序,并适合开发游戏等应用, 使用声明性编程的用户界面和...
  • 游戏服务端之路

    2014-10-10 16:47:00
    一直彷徨应该往什么方向走,自从看大神的框架,才发觉自己欠缺很多。与其懂啥就学啥,不如有条理地学习,从这里开始。 linux命令行环境 linux常用命令用法,软件的安装,vim的用法,在特定的linux版本安装...
  • 地主多人网页版游戏V3,完美与论坛积分结合,消耗会员积分,支持X1.5-X3.0版本!...游戏服务支持最大3000人同时在线 帐号服务支持最大170万帐号存储与登录,同时每次启动时会清理(防止有些会员改密码上去)
  • 最近一直在开发自己公司的SDK,前段时间把SDK的总体框架搭好。就进入实际功能的开发。SDK的第一个功能就是游客登录功能。换一种说法是试玩账号登录。就是由后台给用户分配账号和密码。用户可以跳过注册,和登录...
  • 不用 spring 而是用普通的 java 代码,只做了登录、移动、互砍、伤害计算,英雄死亡等功能的最最简单的版本,主要讨论的是框架架构,不是业务有多绚。 1.服务器处理客户端的连接和客户端指令当然用 netty。 2.客户端...
  • node作为脚本语言性质,决定适合做高cpu的业务,不同于java之类采用的是单线程,多进程的模式来处理海量请求。每个进程其实和传统web服务器一样都是镜像一般处理相同业务(登录,聊天,战斗,交易等等),这样...
  • 使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,熟悉底层封装的人,半个...
  • 随着互联网技术的成熟与发展,人们已经习惯通过网络...网站具有首页、用户登录,选择强度同等各个方面,兼容谷歌、火狐以及360等pc端和手机端浏览器。 【关键词】 HTML+CSS, Bootstrap, JQuery 目 录 内容摘要…
  • 学前必读 ... 由于项目需要,公司的后端迟迟无法就位,自己便利用 C# 搭建...废话多说,上代码 1、客户端和服务器共享工程 namespace ShareProject { /// <summary> /// 服务器与客户端通讯协议 /// <.

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 152
精华内容 60
关键字:

框架登录不了游戏