网页游戏中PK系统的实现

在游戏开发过程中,写过一个简单的PK系统面板,涉及到前端和后端的交互,我将自己制作的流程分享给大家,大概流程是这样:前端发送PK邀请给后端,后端受到请求后将信息返回给前端处理,先来看下整个流程图及思路:

整个流程如上图所示,经过服务器和客户端的几次交互来确定PK双方的状态及是否能受到攻击。服务端将要给我五条协议,大概如下:

message m_role_pk_invite_tos<29301>[router=role,mod_role_handle]{
   required double                          role_id                 = 1;//邀请PK的对象ID
}
message m_role_pk_invite_toc<29302>{
 required int32     err_code     = 1;//0是已向对方发送邀请,请等待回应
}
message m_role_pk_info_toc<29304>{
   required string                          invite_name             = 1;//邀请者名称
   required double                          invite_id                 = 1;//邀请者ID
   required int32                           invite_level           = 1;//邀请者level
   required double                          invite_time          = 1;//计时结束时间戳
}
message m_role_pk_answer_tos<29305>[router=role,mod_role_handle]{
   required int32                          back_type                 = 1;//0为同意,1为拒绝,2为超时
   required double                          to_id          = 1;//同意/拒绝/超时的对象
}
message m_role_pk_answer_toc<29306>{
   required int32                          err_code                 = 1;//0为成功(提示:开始PK)
   required double                          to_id          = 1;     //成功时读取PK对象ID
}

其中toc代表服务端发给客户端的数据,tos表示客户端发给服务端的消息,他们都是封装好的数据结构信息,这些都是我们和后端约定好的协议,一般后端发给前端我们都会制定一个err_code,它表示该协议是否成功发送到客户端。

前端的代码处理比较简单,在编码过程中,将数据和视图分别放在不同的模块中,便于管理,在接受邀请后,我们会给被邀请方一个弹窗显示并给60秒的时间来处理。重点看下服务端发给客户端处理的代码:

package modules.invitePK {
  /* 五条协议 */
 import proto.m_role_pk_answer_toc;
 import proto.m_role_pk_answer_tos;
 import proto.m_role_pk_info_toc;
 import proto.m_role_pk_invite_toc;
 import proto.m_role_pk_invite_tos;

 public class InvitePKCase extends BaseModule {

  public function InvitePKCase() {
   super();
  }
  private var invitePKPanel:InvitePKPanel;
  private static var instance:InvitePKCase;

  public static function getInstance():InvitePKCase {
   return instance ||= new InvitePKCase(); //单例模式
  }

  override protected function initListeners():void {
   addMessageListener(ModuleCommand.INVITE_PK, toInvite); //调用侦听事件邀请PK
   addMessageListener(ModuleCommand.INVITE_ANSWER, toAnswer)
   addMessageListener(ModuleCommand.INVITE_OPENPANEL, toOpenPanel) //出面板
   /* 监听服务端发来的数据,包括三条协议 */
   addSocketListener(SocketCommand.ROLE_PK_INFO, onPKInfo);
   addSocketListener(SocketCommand.ROLE_PK_INVITE, onInvite);
   addSocketListener(SocketCommand.ROLE_PK_ANSWER, onAnswer);
  }

  private function toOpenPanel(vo:m_role_pk_info_toc):void {
   invitePKPanel = new InvitePKPanel(vo.invite_name, vo.invite_id, vo.invite_level, vo.invite_time); //new一个模板
   invitePKPanel.durTime = vo.invite_time;
   invitePKPanel.open(); //打开面板
   invitePKPanel.readTime(); //开始计时
  }

  private function onAnswer(vo:m_role_pk_answer_toc):void {
   if (vo.err_code == 0) {
    if (vo.pk_type != 0) {
     FightModule.getInstance().toOpenPanel(vo);//显示PK双方的信息
     InvitePKManager.pkRoleID = vo.to_id;
     MangerTime.last_time = 30;   //MangerTime是管理时间类
     MangerTime.endTime(); //读取时间
    } else {
     InvitePKManager.pkRoleID = 0;
     Dispatcher.dispatch(ModuleCommand.FIGHT_CLOSEPANEL); //发送关闭消息
    }
   } else {
    TopTip.addMouseTipsMsg(ErrorCode.getError(vo.err_code));
   }
  }

  private function toAnswer(back_type:int, id:Number):void {
   var vo:m_role_pk_answer_tos = new m_role_pk_answer_tos();  //发给服务端
   vo.back_type = back_type;
   vo.to_id = id;
   sendSocketMessage(vo);
  }

  private function onPKInfo(vo:m_role_pk_info_toc):void {
   dispatch(ModuleCommand.INVITE_OPENPANEL, vo); //开面板,显示邀请者的信息
  }

  private function onInvite(vo:m_role_pk_invite_toc):void {
   // 发给客户端的消息,提示我已经邀请你pk
   if (vo.err_code == 0) {
    TopTip.addMouseTipsMsg("已邀请PK,请等待回应");  //表示发送成功
   } else {
    TopTip.addMouseTipsMsg(ErrorCode.getError(vo.err_code)); //返回失败的原因
   }

  }

  private function toInvite(tarid:Number):void {
   //这里面有调用者的ID,由客户端发给服务端
   var vo:m_role_pk_invite_tos = new m_role_pk_invite_tos();
   vo.role_id = tarid;
   sendSocketMessage(vo); //发送消息
  }
 }
}

上面的MangerTime类主要是用于PK双方时间的限定,如果在双方都接受邀请之后30秒内没有动作,或者30秒有攻击但是接着停下来没有继续攻击,时间又要重新开始计时,我这里用一个静态类来处理:

package modules.fight {
import com.managers.Dispatcher;
import com.scene.sceneManager.LoopManager;
import modules.ModuleCommand;
import modules.fight.FightView;
    public class MangerTime {
        public static var last_time:int = 30;  //静态30秒,每次攻击玩可以重置这个时间
        public static function updateEndTime():void {
        last_time--;
        if (last_time < 0) {
        last_time = 0;
        LoopManager.removeFromSceond("updateTime");
        FightView.getInstance().toCloseWindow(); //pk结束,关闭面板
   }
}
    public static function readTime():void {
    LoopManager.addToSecond("updateTime", updateEndTime);  //启动一个定时器开始计时
    }
  }
}

在监听服务器发过来的fight事件的时候,可以改变last_time对时间进行重置,加入计时器,30秒到后就可以关闭双方的面板,但是一定要注意的是,我们这里用到AS3中的字典来存储函数的名称,所以在命名的时候一定不要重复命名,不然可能会导致程序运行出错或者PK双方只关闭一个面板。

总结:在遇到和服务器交互的时候只需要针对对应协议做出相应的逻辑判断,代码分别用模块化的形式来清晰表达出自己的思想,后面开发的同志看代码也就不会很困难,游戏行业的开发速度非常快,有好的框架开发起来速度会非常快,所以平时应该多专研这些面板底层机制是如何实现的,并记录一些自己的想法。

时间: 2024-11-05 19:49:12

网页游戏中PK系统的实现的相关文章

用Python脚本做一些网页游戏中力所能及的自动化任务

下面是一段自动登录360传奇霸业游戏的脚本: from pymouse import PyMouse import time import webbrowser from pykeyboard import PyKeyboard url = "http://cqby.wan.360.cn/game_login.php?server_id=S577&&src=loginhistory" webbrowser.open_new_tab(url) m = PyMouse()

网页游戏

网页游戏_百度百科http://baike.baidu.com/link?url=__mxqeSPiqAO_TGydqkd7M8BGmboUrei_rqfDzv59uOS9GxVe1UdbsClJgg2l5qCuFy4qzFWgaQo9GeZeaBpeiTo2npMjlMvFD6Wb-QNY8D1iT_phwtSVuq1RFOUAocv 页游 即 网页游戏 . 网页游戏又称Web游戏,无端网游,简称页游.是基于Web浏览器的网络在线多人互动游戏,无需下载客户端,只需打开IE网页,10秒钟即可进入

arpg网页游戏特效播放(一)

网页游戏中的特效,主要包括:场景特效,攻击特效和UI特效三种.场景特效是在地图层上播放的特效,攻击特效主要是技能触发的一些特效,UI特效是面板上的一些特效,还有一些在人物身上播放的特效,例如脚底光圈特效等.特效的播放方式有两种,一种是直接播放swf,二种是根据图片序列,直接绘画到Bitmap上,对于两种方式,我比较倾向于直接绘画到Bitmap上.一般我们我们处理程序的逻辑是,显示和逻辑分开.对于特效显示逻辑,就是特效的绘画逻辑,以及资源的整理方式,逻辑就是特效的播放位置和播放时机不一样而已.所以

WEB前端开发学习----4.用JavaScript实现网页游戏的移动效果

想必大家都玩过网页游戏吧.随着HTML5的普及,浏览器+云端的web app成为了未来的趋势.很多效果都离不开JavaScript.所以说要想进行web开发,JavaScript一定得学好. 那网页游戏中是怎么实现人物的移动效果呢,今天分享一个很基础的简单方法. 效果图如下:点击上边的按钮,暴走小人开始向右移动. HTML+CSS部分非常简单.就不多说了.需要注意的是图片要使用绝对定位. 那么怎么让图片向右动起来呢? 由于图片有position属性,那么我们只需要改变它的属性值就可以了.比如说我

AS3.0网页游戏优化一

有道无术,术尚可求,有术无道,止于术.神即道,道法自然,如来! 借用上面的一句话,来开启AS3.0网页优化的一些策略,在从事大约两年多的网页游戏行业,对于AS3.0性能优化,有一些自己的见解和想法,及此分享给大家,仅供抛砖引玉,鄙人拙见,愿给从事网页游戏的人以启迪. 我认为AS3.0的性能分两部分,第一部分是技术性优化,就是在理解flash 弹性跑道模型渲染原理和AVM本身一些垃圾回收原则等,对自己的程序进行一系列的性能优化.第二部分是游戏逻辑性优化.我只从事过2.5D arpg网页游戏的制作,

【腾讯GAD暑期训练营游戏程序班】游戏中的动画系统作业

游戏中的动画系统作业说明文档   一.实现一个动画状态机:至少包含3组大的状态节点 动画状态机如图所示,其中Blend Tree_Run是一个动画混合树,Blend为混合树的参数,speed为控制动作过渡的参数,共有蹲下空闲状态.走路状态.跑路状态三种状态. (1)    当speed大于0.1时,由蹲下的空闲状态转换为走路状态. (2)    当speed小于0.1时,由走路状态转换回蹲下空闲状态. (3)    当speed大于0.2且在走路状态时,可转换为动画混合树制作的跑步状态. (4)

Unity网页游戏特点分析

Unity网页游戏是跑在浏览器的UnityWebPlayer插件中的,运行的模式是webplayer.unity3d+html 在嵌入UnityWebPlayer的网页中会调用UnityObject2的initPlugin函数,将webplayer.unity3d作为参数传入来初始化Unity网页游戏的运行环境 注:游戏dll及其他托管dll在构建Web版本时都会写入到webplayer.unity3d文件中 UnityObject2.js (其他链接1  其他链接2) 拥有检测 Unity W

网页游戏运营模式研究

网页游戏的定义   网页游戏的英文名称为又称无客户端网络游戏,它是基于浏览器的网络在线多人互动的游戏,也是网络游戏的一种.这种游戏的特点是玩家无需下载游戏客户端及安装,只需短短的几秒钟就可打开网页用浏览器加载就能玩的网络游戏.尤其适合上班及没有时间休闲娱乐的人群,只要花一点点时间并且消费成本比较低,而且游戏内具有自动成长功能,玩家即使关掉电脑也可心满意足的去工作,如果想随时了解游戏内的具体情况,还有一些游戏具有短信提醒功能. 中国网页游戏从发展初期,再到如今的爆发式发展,中国网页游戏规模不断的扩

IOS中调用系统的电话、短信、邮件、浏览功能

iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 2015-01-13 09:16 by KenshinCui, 26990 阅读, 35 评论, 收藏, 编辑 --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: 调用系统应用 使用系统服务目 录 短信与邮件 通讯录