`
icrwen
  • 浏览: 268003 次
  • 性别: Icon_minigender_2
  • 来自: 济南
社区版块
存档分类
最新评论

PHP+Flash网页游戏开发 - 基本思路

 
阅读更多

http://www.qianduan.net/website-performance-optimization-tool.html

 


http://blog.csdn.net/zooen2011/article/details/7780982

http://www.knowsky.com/339468.html

http://www.jb51.net/article/29556.htm


数据类型:
as3+socket,一搜网上一大堆,但是大多是基于字符串的传递,就是发送和接收都是字符串,每个消息用换行来区分,这不是坑爹么!如果我要发送布尔,数组,带换行的字符串咋办?如果用其他的字符来代替换行符然后再转换处理也太傻了点吧。所以就好的办法就是使用二进制数据来处理,as3发送二进制数据应该没有什么太大的问题,socket的方法里的writeXXX全是写成二进制的数据,主要是服务端的处理也要用二进制才行。
然后是使用AMF3的格式来发送,socket的writeObject就是把一个对象序列化为一个AMF3或者AMF0格式的二进制数据的,服务端需要搭配第三方类库来解码为可用的数据。AMF3的使用可以看这里,JAVA为后台的: http://blog.sina.com.cn/s/blog_6bc2090c0100ru9w.html

粘包和断包:
TCP中没有包的概念,只有流的概念。所有的数据都是接收到缓冲区一满就发送,比如我们发送了多个数据,最后可能会一次性都发送出去,这时候再处理就没办法区分,这样叫做粘包。还有断包,由于数据太大或者网络太慢,一条数据被发送了多次,这样叫做断包,处理方法,手动加入一个包头来区分每个包,可以参考下面的文章: http://cjmxp007.blog.163.com/blog/static/35473837201061054116916/

服务端的阻塞和非阻塞:
阻塞就是使用多线程,一个客户端对应一个线程,这样容易引起一些问题,主要是资源浪费和一些并发问题。而非阻塞则是用一个线程来处理所有的问题,可以节省资源和避免并发问题。不同的后台语言的实现方法就自己去找了,我这里搜到非阻塞的一些介绍,JAVA的: http://www.doc88.com/p-67443613181.html

as3的socket安全策略问题:
每次用我们的自定义的socket连接之前swf都会先用一个特殊的socket先进行连接,该socket用来申请安全策略,会发送字符串"<policy-file-request/>\0"然后等待我们返回安全策略的字符串回去,如果安全策略允许连接则断开这个特殊的socket连接再用我们的socket去连接,否则就不会连接,这里有很多的说明: http://hi.baidu.com/mr_ziqiang/blog/item/7a2c4baf2c4a21fdfbed501e.html

断网问题:
这个是我最怕的,弄到现在都没弄好,就一个解决问题的思想,以后有时间再弄了,这里就说说我的解决方法吧。
首先说说关闭和断网不一样,关闭是客户端调用close方法,服务端会接收到一个空消息;或者服务端关闭一个客户端,客户端会触发Event.CLOSE事件。好了,如果断网的话,客户端不会有任何的事件和异常,服务端就更傻了,还可以给这个客户端发送消息,没有任何异常,当然了,两个都是发得出去但是啥也收不到,咋办呢,这里发现一篇文章: http://liu-ms.iteye.com/blog/935051
就用这个方法来处理,客户端和服务端都弄一个超时的计时器,每次发送消息都要对方在接收到消息后返回一个特殊消息,如果超过一定时限还没有接收到对应的消息则视为断网这种情况,然后就用方法close关闭掉,再在一定时间后重新连接既可。

数据压缩(优化传输速度):
呵呵,这个是最轻松的一个了,flash用的是ZLib压缩算法,一个压了再发送给另一个,接收到再解压既可,注意两点:1.我发现如果数据在150个字节以下时压缩后会变大,数据越大压缩效果越明显。2.包头信息不要压缩,那个包头是用来解决粘包和断包问题的,压了可不得了。

 

 

php优化:

http://www.cnblogs.com/mo-beifeng/archive/2011/10/11/2207278.html

http://bbs.blueidea.com/thread-2969949-1-1.html

http://bbs.cwebgame.com/forum.php?mod=viewthread&tid=306846&page=

http://www.sziwap.com/

http://wenku.baidu.com/view/e0bf73d4b9f3f90f76c61bc5.html

游戏中应该amfphp和socket结合来用
比如说那些实时性或者需要长链接的就需要c++,然后那些平常的比如flash获取后台信息可可能就只用amfphp
这两个没有冲突

PHP+Flash网页游戏开发 - 基本思路

网页游戏很多人都玩过,比如QQ农场。若交互就是交互行比较差一些的,比如某某飞刀,某某一剑,某某忍者之类的,没有实时寻路系统,打怪之类点链接,战斗回合单向,推送信息比较少的,还有一些策略游戏,都可以用PHP作为服务器端。由于使用短连接,承载能力还是可以的。以一个简单的RPG游戏为例,说明这类游戏的思路。

1. 开发环境及通讯协议

服务器端 Nginx + PHP5.3 + MySql 开发工具 Phpdesigner 对中文支持不错,自动检测文件编码,实时语法调试。 

客户端 Flash制作素材 Flash Develop 编写代码。

 

通讯协议 Json格式编码,Php 内置支持json Flash 需要下载相应的类,www.json.org  下载。之所以没用xml ,传送的数据多一些,解析也麻烦一些,所以选择比较简便的json 编码格式。当然也可以用amfphp.

 

2. 游戏流程 登录 -> 选择服务器 ->加载常用资源->选择或新建角色->进入游戏

新角色首先进入的当然是新手村,完成一些新手任务。新手村场景包含背景图和几个NPC

 

3. 服务器端

主要数据表如下

用户表: 账户信息

角色表: 角色信息,记录角色属性, 货币,位置信息,背包仓库格子数

物品表: 记录角色获得的物品,如道具 装备

技能表: 角色当前学会的技能 

任务信息表: 用户当前接取的任务

商城表: 游戏必不可少的,^o^

购买记录表

邮件表

暂且这些吧,对于一个简单的游戏够用了。

 

服务器的工作就是相应客户端的请求,处理后返回json编码的数据,最好是模块化结构。

对于经常调用的临时数据,比如角色的攻击,防御这些动态计算的数据可以考虑用Mysql 的memory 表。数据在内存中,访问速度比较快。

4. 客户端

用到的图片,UI等都按类存放在swf文件,并导出相应的类,以便代码调用

加载资源,使用Loader 类,并存储资源信息

发送命令数据 使用 URLRequest 和 URLLoader 完成

界面分背景层 NPC层,UI层(操作栏,聊天栏等),信息层(弹出窗口)

 

5. 需要解决的几个问题

1>  动态加载的资源调用,根据资源列表加载完毕,需要存储AppDomain到列表,然后查找资源导出的类实例化就可以

2>需要倒计时的功能与服务器时间同步,由于有延迟,需要调整服务器时间和本地时间,如服务器时间T1 ,收到这个数据时间 T2,那么延迟就是T2-T1,单位毫秒。

3>战斗处理 例如点击怪物 发起战斗,服务器收到命令,根据角色和怪物信息,生成战斗序列返回给客户端,客户端只需播放即可,玩过xx一剑,xx忍者的就很容易明白了。保存下来就是所谓的录像了。相对于可控制的回合制,这个简单多了。只需请求一次,看着战斗很激烈,其实是战斗开始就决定了结果,只是加入一些随机元素而已。 

4> npc功能 点击npc 显示功能列表 主要是根据npc配置信息和角色当前任务。

5> 副本 不过是个特殊的地图,玩家只是角色和角色同队伍的玩家。按顺序和怪物交手,也比较容易处理。

6> 登录同步 网站页面登录后,保存登录信息到cookie. flash 发送http请求时会带上容器的cookie信息,php就可以判断登录状态了。

7> 组队,可以考虑用memory 内存表存放数据。不过由于不能推送数据,还是有一定难度的。

 

相对于rpg游戏,农场类的游戏就简单不少,基本上是没有交互的,只是需要注意些并发操作

 

 

 

项目概述:
这个项目是一个在线游戏的小项目。有很多图片资源需要载入,并且可能需要动态的载入。不断的需要通过AMFphp与服务器端交互。

1. 建立主类 Main
1.1 主类用于保存系统级参数(比如当前用户、AMF服务器地址等);
1.2 保存整个系统的所有类实例(通过主类的属性将整个系统中所有的对象实例都保存起来,对于不确定个数的实例,通过Array 来保存)。这样,当任何一个对象实例需要调用其他对象实例的时候,都可以直接通过主类的属性定位到。而不需要再次创建实例;

2. 建立资源载入类 sLoader
2.1 资源载入类通过异步的方式,载入各个对象实例中需要载入的资源数据;
2.2 当其他对象实例需要载入资源数据的时候,通过添加到载入队列(add_loader 方法),然后由 sLoader 逐个载入;
2.3 添加队列的时候,需要提供:(1)资源地址;(2)载入成功调用的方法;(3)载入失败调用的方法;
2.4 资源载入类会逐个的自动载入资源,载入成功/失败后,调用当前队列所指定的方法;

3. 建立AMF通讯类 Amfer
3.1 AMF通讯类负责通讯交互,创建的时候,指定 gateway ,AMF 通讯类首先链接到服务器,随时等待被调用执行交互任务;
3.2 AMF通讯类通过请求队列,逐个执行通讯任务;
4.3 当需要进行交互式,执行 add_command 方法,添加请求指令与请求参数,并制定成功/失败调用的函数。Amfer 会将请求加入请求队列。然后按顺序逐个执行;

4. 其他对象 someobj
4.1 其他的各个对象,有的属性可能是资源对象,有可能是数据对象。以一个虚拟人物为例,有名称、avata、体力、经验值。其中 avata 首先是有一个资源表示,比如说是  xxx1.png 的图片,在实际显示的时候,是现实一个资源数据 bitmapdata。对于这样的对象:

首先通过 Amfer 初始化虚拟人物的数据信息。
其次,在需要显示的时候,调用 getAvata 方法,传递一个需要使用这个数据的函数名。如果对象已经初始化获得了 avata 的数据,则函数直接调用指定的函数名,传递数据对象。否则,(1)、将资源请求的函数记录下来;(2)向 sLoader 增加资源请求队列,并制定自身的一个函数;(3)、当资源载入成功后,自身的请求函数,会逐个去调用已经登记的需要这个数据的函数,并传递刚获取的资源;

对于 其他对象,打算使用 继承 的方式,将获取资源 和 初始化数据的方法固定下来,不用每个对象都去调用。

--------------
疑问1.  NetConnection 创建的时候就 connect ,并且一直不关闭,是否会有性能方面的问题?或者会出现异常的情况?

疑问2. 这种方式,是否会带来性能方面的问题?特别是客户端的内存、CPU资源会不会带来麻烦?

分享到:
评论

相关推荐

    PHP实例开发源码—PHP+FLASH 大头贴源码[值得研究].zip

    而Flash则曾是制作动态交互内容的首选工具,常用于实现网页上的动画效果和用户界面。"PHP+FLASH 大头贴源码"是一个结合了这两种技术的项目,它提供了创建个性化大头贴的功能,让用户可以在上传的照片上添加各种特效...

    php+flash实现转盘抽奖

    首先,PHP(Hypertext Preprocessor)是一种服务器端脚本语言,主要用于Web开发,可以生成动态网页内容。在这个项目中,PHP的主要作用是处理抽奖逻辑,如生成随机中奖结果、验证用户资格、记录抽奖记录等。PHP可以...

    PHP+Flash文件上传程序(含flash fla源码)

    虽然现在Flash已经逐渐被淘汰,但其原理和思路对于理解现代Web开发中的文件上传处理仍然有价值。对于学习者来说,研究这个程序可以深化对PHP后端处理和Flash前端交互的理解,为今后使用JavaScript、HTML5等现代技术...

    经典游戏俄罗斯方块Flash源码 Flash游戏源码.RAR

    `tetris.txt`可能包含了游戏的设计思路、规则说明或者开发笔记,对于理解游戏的整体架构有帮助。`settings.xml`则可能存储了游戏的配置信息,如屏幕分辨率、音效设置等,通过修改它,可以调整游戏的一些参数。 `...

    Foundation PHP5 for Flash(PDF)

    - **Flash**:一种广泛应用于网页动画、视频播放和游戏制作的技术。 - **PHP**:一种开源的服务器端脚本语言,常用于Web开发。 #### 部分内容概览 - **作者及编辑团队**: - **作者**:David Powers - **主...

    FLASH小游戏程序后台版.zip

    2. **后端开发**:学习服务器端语言(如PHP)的基本知识,理解如何处理用户请求,管理游戏状态,以及存储和检索用户数据。 3. **数据库管理**:可能涉及到SQL语言,理解如何设计和操作数据库来存储游戏进度、用户...

    PHP实例开发源码-3DFLASH php相册CMS系统.zip

    【PHP实例开发源码-3DFLASH php相册CMS系统.zip】是一个包含PHP源代码的压缩包,专为创建3D Flash相册内容管理系统(CMS)设计。这个项目可能是为了帮助开发者理解如何构建这样的系统,或者作为一个基础模板供用户...

    PHP+FLASH实现上传文件进度条相关文件 下载

    标签中的“AS”指的是ActionScript,这是Flash开发所使用的编程语言。“上传文件”和“进度条”则指明了技术的应用领域。 部分内容列举了多个关于PHP文件上传进度条的其他实现方法,包括使用Session、Ajax、jQuery...

    Flash相关的开源工程汇总(比较全面)

    1. **ActionScript框架**:ActionScript是Flash开发的主要编程语言,开源框架如OpenFL、Flare3D、Away3D等,为开发2D和3D游戏、交互式应用程序提供了强大的支持。 - OpenFL:一个跨平台的开发框架,可以将...

    【双端】游戏PC和手机版宣传页模板原版Flash动态炫酷

    标题中的“【双端】游戏PC和手机版宣传页模板原版Flash动态炫酷”表明这是一个专为游戏设计的,适用于PC和移动设备的宣传页面模板,且采用了Flash技术来实现动态和炫酷的视觉效果。在早期网页设计中,Flash是一种...

    基于PHP的FLASH 大头贴源码[值得研究].zip

    【描述】中的“值得研究”暗示了这个源码具有一定的学习价值,可能包含了创新的设计思路、实用的功能实现或者优化的性能表现,适合对PHP和网页交互设计感兴趣的开发者进行深入探究。 【标签】:“php”是服务器端...

    JavaScript大作业 基于HTML+CSS+JavaScript站酷静态页面官网7页

    #### 一、网页设计与制作的基本概念 - **网页设计**:涉及使用HTML、CSS和JavaScript等技术来创建网站或网页的过程。这些技术用于定义网页的结构、样式以及交互功能。 - **静态网页**:指那些在服务器上预先定义好...

    flash 投票系统

    Flash应用通过HTTP请求与服务器上的后端脚本(如PHP、ASP或JSP)交互,实现数据的存取。 5. **安全性**:为了确保投票的公正性,Flash投票系统需要实施一些安全措施,如限制每个IP地址只能投一次票,或者使用cookie...

    极品少见的卖100元的FLASH上传系统源文件

    首先,Flash是一种由Adobe公司开发的多媒体创作和播放平台,它曾经广泛用于创建丰富的互联网应用程序、动画、游戏以及交互式内容。Flash支持矢量图形、动画、视频和音频处理,使得用户可以在网页上实现动态视觉体验...

    Flash抽奖程序源代码

    【Flash抽奖程序源代码】是一种基于Adobe Flash技术开发的应用,常用于各类活动、晚会或商场促销等场景,通过随机抽取的方式进行抽奖。源代码是指程序员编写的原始指令集合,是程序的基础,允许用户进行二次开发和...

    网上书店开题报告

    ### 网上书店系统设计与开发(后台)——基于PHP的开题报告知识点解析 #### 一、调研资料的准备: 本项目选择了六本参考书籍作为调研的基础资料,涵盖了PHP编程、MySQL数据库管理、网页设计与制作等多个方面。这些...

    魔兽世界游戏资讯网站的设计与实现

    【摘要】中提到的《魔兽世界游戏资讯网站》是一个针对当今网络时代背景设计的平台,旨在为玩家提供关于《魔兽世界》这款大型多人在线角色扮演游戏(MMORPG)的各类信息和支持。随着网络的快速发展和生活压力的增加,...

    flash多图上传

    Flash作为一种曾经广泛使用的交互式内容开发平台,提供了丰富的多媒体处理能力,包括图像的读取、处理和上传。 在Flash多图上传中,用户可以一次选择多个图片文件,通过Flash的FileReference类进行上传。...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    ExtAspNet v2.2.1 ExtAspNet是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果, 目标是创建没有JavaScript,没有CSS,没有UpdatePanel,没有WebServices的Web应用程序。 支持的浏览器: IE 7.0+, ...

Global site tag (gtag.js) - Google Analytics